冷冻页面中的Ajax状态历史

时间:2012-01-13 15:51:14

标签: ajax caching jquery coldfusion

我对如何实现这一点很困惑。我有一个页面,有一个弹出过滤器,它有一些输入元素和一个“应用”按钮(不是提交)。单击该按钮时,将进行两次jquery .get()调用,将图形,DataTables网格,照片和其他信息加载到四个单独的选项卡中。在图表中,如果单击特定元素,则用户将被带到另一个页面,在该页面中数据被钻取到更精细的级别。这一切都运作良好。

问题是如果用户决定回到原始页面,但是使用ajax生成的图形/网格/照片等。最初我认为我会存储一个会话变量,其中包含用于形成原始查询的过滤器变量,并在返回页面时,如果找到会话var,将再次进行原始的ajax调用,重新填充选项卡。

我在这个方法中发现的问题是Coldfusion在使用浏览器的后退按钮返回页面时无法识别会话变量已设置。如果我在原始页面和第二页面都转出会话var,我可以在第二页看到新设置的var,如果我通过导航菜单转到原始页面,我可以看到它,但如果我使用后退按钮。

所以....从这里阅读有关ajax浏览器历史插件的帖子,似乎有各种各样的jquery插件可以帮助解决这个问题,包括烧烤。我用这种方法看到的问题是它需要使用锚元素来触发它,然后使用锚点的href属性修改查询字符串。我想我可以修改页面以包含隐藏的锚点。

我的问题,最后是:像BBQ这样的ajax历史插件是实现这一目标的最佳方式,还是有办法让Coldfusion在通过后退按钮返回页面时看到新创建的会话变量?或者,我是否应该考虑重新设计页面,以便将ajax调用替换为返回页面的表单?

提前感谢,一如既往。

编辑:一些代码有助于澄清事情: 这是进行原始ajax调用的按钮:

<button id="applyFilter">APPLY</button> 

和部分js调用#applyFilter,包含在$(document).ready()中:

$('#applyFilter').click(function(){
    // fill in the Photos tab
        $.get('tracking/listPhotos.cfm',
            {
                id: id,
                randParam: Math.random()
            },
            function(response){
                $('#tabs-photos').html(response);
            }
        );
    });

最后,当用户在ajax生成的图形上调用下钻时,它使用MaintAction表单,该表单已填充了所需的变量:

function DrillDown() {
    //get the necessary variables and populate the form inputs
    document.MaintAction.action = "index.cfm?file=somepage.cfm&Config=someConfig";
    document.MaintAction.submit();
}

这会将我们带到新页面,我们希望从该页面返回到第一页,但是使用了ajax加载的照片。

1 个答案:

答案 0 :(得分:2)

最好的办法是使用烧烤法。为此,您不必在页面中实际包含锚标记;事实上,这样做会导致问题。此页面:http://ajaxpatterns.org/Unique_URLs解释了基础流程的工作原理。我确信jQuery插件会使实际实现变得更加容易。

关于你的另一个问题,关于如何用会话变量完成这个问题 - 在学习烧烤方法之前,我实际上做了类似的事情。这是专门用于保存jqGrid组件的状态,但可以轻松更改以支持任何特定的Ajax状态。基本上,我所做的是为每个组件的每个实例保留一个会话变量,该组件存储通过AJAX请求传递给服务器的最后一个参数。然后,在客户端,我做的第一件事是向服务器运行同步XHR请求以从该会话变量获取状态。使用该同步请求的回调方法,然后使用这些保存的参数在我的页面上设置组件。这对我有用,但是如果我不得不再次这样做,我肯定会选择烧烤方法,因为处理起来要简单得多,而且还允许多个历史记录。

基于您的更新的一些示例代码:

$('#applyFilter').click(function(){

    var id = $("#filterid").val(); // assumes the below id value is stored in some input on the page with the id "filterid"
    // fill in the Photos tab
        $.get('tracking/listPhotos.cfm',
            {
                id: id // I'm assuming this is what you need to remember when the page is returned to via a back-button...
                //randParam: Math.random() - I assume this is to prevent caching?  See below
            },
            function(response){
                $('#tabs-photos').html(response);
            }
        );
    });


/* fixes stupid caching behavior, primarily in IE */
$.ajaxSetup({ cache: false });


$.ajax({
   async: false,
   url: 'tracking/listPhotosSessionKeeper.cfm',
   success: function (data, textStatus, XMLHttpRequest)
   {
      if (data.length)
      {
         $("#filterid").val(data);
         $('#applyFilter').trigger('click');
      }
   }
});

这是您在客户端获取照片列表状态所需的内容。在服务器端,您需要将此修改添加到tracking / listPhotos.cfm中:

<cfset session.lastUsedPhotoFilterID = URL.id>

并添加这个新的单行文件,tracking / listPhotosSessionKeeper.cfm:

<cfif IsDefined("session.lastUsedPhotoFilterID")><cfoutput>#session.lastUsedPhotoFilterID#</cfoutput></cfif>

这些更改将跟踪用户使用的最后一个ID,并在每次呈现页面时加载它(无论是通过后退按钮,还是仅通过用户重新访问页面)。