1

我有一个由按钮单击触发的 Ajax 函数,如下所示:

$.ajax({
            type: "POST",
            dataType: 'json',
            url: "DBDeleteList.php",
            data: {listID: listID},
            success: refreshMenus($(this))
});  

PHP 文件成功执行并更新数据库。

refreshMenus() 被调用,我调用 .load() 来重新刷新菜单以反映更新的数据库,但是加载函数似乎很快就会加载内容(在数据库更新注册之前)。

基本上发生的情况是,如果当我通过 Jquery .load 从页面加载内容时,它不会刷新。如果我手动刷新页面(例如 f5),数据库会更新并正确显示菜单。

这是刷新菜单():

 function refreshMenus( list ) {
    list.parents('li').remove();
    $('#sortableLoader').load(window.location.href + ' #sortableMenu');
 }

Div ID sortableMenu 正在更新,我想它只是更新得太早了。

4

4 回答 4

2

refreshMenus($(this));在 ajax 完成之前立即调用您并保存$(this)在 ajax 函数之外的变量中。所以试试这个

var el = $(this);
$.ajax({
    type: "POST",
    dataType: 'json',
    url: "DBDeleteList.php",
    data: { listID: listID }
    success: function(){ 
        refreshMenus(el);
    }
});
于 2012-07-25T22:32:07.460 回答
0

我认为你应该使用

success:function(){ refreshMenus($(this)); }

如果我是正确的,实际发生的是 $.ajax 将结果作为refreshMenus($(this))其回调函数(如果您查看控制台,它甚至可能会引发错误)。这意味着它refreshMenus($(this))实际上是在 AJAX 启动之前调用的。此外,您需要使用 jQuerycontext或按照提到的其他一些答案进行操作,并将$(this).

于 2012-07-25T22:31:16.303 回答
0

使用完整的处理程序(总是)而不是成功(完成),并在必要时添加超时,但它不应该是因为服务器端应该在调用回调时完成:

var elem = $(this);
$.ajax({
       type: "POST",
       dataType: 'json',
       url: "DBDeleteList.php",
       data: { listID: listID }    
  }).always(function() {
       setTimeout(function() {
          refreshMenus(elem); //`this` will be out of scope
       }, 300); //or whatever you need    
});​
于 2012-07-25T22:31:34.227 回答
0

尝试更改refreshMenus($(this))refreshMenus($('#listid'))(当然,为您要刷新的列表使用正确的访问器:)

您遇到的问题是$(this)您传递给refreshMenus的元素不是您要更新的列表元素(或触发按钮,就此而言),它是 xhr(ajax)对象,所以 refreshMenus 方法不是获取它需要更新的元素。

另外,Cabloo 说的是好建议——

success:function(){ refreshMenus($('#listid')); }
于 2012-07-25T22:33:37.430 回答