jQuery - 在 AJAX 调用之后,旧元素仍然存在于 DOM 中吗?如何去除?

Posted

技术标签:

【中文标题】jQuery - 在 AJAX 调用之后,旧元素仍然存在于 DOM 中吗?如何去除?【英文标题】:jQuery - after AJAX Call, old elements still exist in DOM? How to remove? 【发布时间】:2011-10-12 17:37:53 【问题描述】:

我有一个使用 AJAX 刷新内容的按钮,调用 refreshFeed()。我仍然需要操作 AJAX 加载的内容,因此我将 .live() 附加到 AJAX 加载内容中的某些链接以启动其他 AJAX 调用,比如“评论”。 “评论”按钮从隐藏的输入字段中收集一些值并将它们发布到服务器。

如果我不单击刷新,它会正常工作。但是,我发现经过几次刷新后,当我单击具有 .live('click', function()) 键的链接(“评论”按钮)时,它会向服务器发送多个 POST 请求。我猜是因为旧的 DOM 元素仍然存在,所以我尝试在 refreshFeed() 中使用 .remove()、.empty() 删除所有元素。但问题依然存在。

代码如下:

$.ajaxSetup(
    cache: false
);
$(".submit-reply").live('click', function () 
    var mIDValue = $(this).parent().find("input.re-fb-msg-id").val();
    var accessValue = $(this).parent().find("input.re-fb-token").val();
    var commentValue = $(this).parent().find(".comment").val();
    var postReplyUrl = "fconfirm.jsp";
    var ajax_reply_load = "<img src='img/scanningsmall.gif' alt='loading...' />";
    $(this).parent().parent().find(".result-note").show();
    $(this).parent().parent().find(".result-note .out-container").html(ajax_reply_load).fadeIn(300).load(postReplyUrl, 
        mID: mIDValue,
        access: accessValue,
        comment: commentValue,
    );
    $(this).parent().hide();
);

function refreshFeed() 
    $.ajaxSetup(
        cache: false
    );
    $("#feeds div").remove();
    $(".submit-reply").remove();
    var loadingFeeds = "<div class='loading-feed'><img src='img/scanningsmall.gif' alt='loading...' /><p>Loading...</p></div>"
    var feedURL = "pbsc.htm"
    var feedParameter = "clientId=<%=clientId%>&getPostTweets=1&rescan=1";
    $("#feeds").html(loadingFeeds).load(feedURL, feedParameter);

我是 Jquery 的新手,真的不知道问题出在哪里。请帮我!谢谢!

【问题讨论】:

谢谢。但是 HTML 太复杂,无法发布。我仔细检查了代码,我确定 .find() 路径是正确的 - 因为当我不刷新页面时,一切正常。 【参考方案1】:

如果您的旧元素已发送请求,则可以使用 ajax 请求对象停止这些请求。你可以使用ajax请求对象。

var request;// have global variable for request

//...........
    var request = $.ajax(
        type: 'GET',
        url: 'someurl',
        success: function(result)
         $(yourSelecter).html(result);
       
    );




function refreshFeed() 
request.abort()// in refreshfeed function you can abort it


如果你有几个 ajax 请求,你可以使用一个 ajax 请求数组

$.xhrPool = [];//数组的全局变量

$.xhrPool.abortAll = function()   
  _.each(this, function(jqXHR) 
    jqXHR.abort();
  );
;
$.ajaxSetup(
  beforeSend: function(jqXHR) 
    $.xhrPool.push(jqXHR);
  
);

........编辑.........

我认为您的问题在于实时功能。我假设您的 .submit-replypbsc.htm 中,所以不要使用实时函数,而是尝试使用此代码。这将

function BindClick()

 $(".submit-reply").Click(function () 
    var mIDValue = $(this).parent().find("input.re-fb-msg-id").val();
    var accessValue = $(this).parent().find("input.re-fb-token").val();
    var commentValue = $(this).parent().find(".comment").val();
    var postReplyUrl = "fconfirm.jsp";
    var ajax_reply_load = "<img src='img/scanningsmall.gif' alt='loading...' />";
    $(this).parent().parent().find(".result-note").show();
    $(this).parent().parent().find(".result-note .out-    container").html(ajax_reply_load).fadeIn(300).load(postReplyUrl, 
        mID: mIDValue,
        access: accessValue,
        comment: commentValue,
    );
    $(this).parent().hide();
 );



function refreshFeed() 
    $.ajaxSetup(
        cache: false
    );
    $("#feeds div").remove();
    $(".submit-reply").remove();
    var loadingFeeds = "<div class='loading-feed'><img src='img/scanningsmall.gif' alt='loading...' /><p>Loading...</p></div>"
    var feedURL = "pbsc.htm"
    var feedParameter = "clientId=<%=clientId%>&getPostTweets=1&rescan=1";
    $("#feeds").html(loadingFeeds).load(feedURL, feedParameter,BindClick);

【讨论】:

非常感谢贾扬塔。但我的问题不在于中止请求;页面已经收到响应并显示结果,问题是我使用AJAX重新加载内容后,当我点击提交按钮时会提交两次(虽然页面上只有一个按钮)!当我重新加载页面 3 次时,它将提交 3 次; reload 6 次会导致 6 个提交,等等。这个问题的根本原因是什么?谢谢~ 见我添加了新代码。我假设 .submit-reply 在“pbsc.htm”中,如果不只是删除 live() 函数并使用 Click() 函数。【参考方案2】:

在代码的第一部分,尝试:

$(".submit-reply").live('click', function(e) 
  e.preventDefault();
  // rest of your code here 
);

传入“e”并调用 e.preventDefault() 将阻止任何其他 HTML 运行(例如,如果将 .submit-reply 设置为提交表单)。

【讨论】:

以上是关于jQuery - 在 AJAX 调用之后,旧元素仍然存在于 DOM 中吗?如何去除?的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 之前的 JQuery .each 处理

在 jQuery DataTables 中的 Ajax 请求之后在 td 中添加 html 元素

如何使用 ajax 调用将 jquery 数据表加载到 div 中

如何在 jquery ajax 成功函数中引用调用 dom 元素?

在我无法控制的任何 AJAX 调用之后使用 JQuery 修改 DOM

无法从 JQuery ajax 调用接收 JSON