使用JQuery动态重新加载元素并读取其新属性

3
我有一个Ajax调用,返回一段HTML代码,应该替换页面上的旧HTML代码,并给它们新属性。在我成功地动态更改元素之后,我想运行另一段JS代码,读取并使用重新加载的元素的某些属性。然而,JS更喜欢读取旧数据(好像它正在同步运行)。
我找到的唯一解决方法是设置一个计时器,但计时器的延迟时间必须相对较高(300毫秒),以确保它总是正确完成。有什么正确的方法可以做到这一点吗?
以下是我现在的伪代码。它可以工作,但300毫秒的延迟时间太糟糕了。
$.post( "ajax/test.html", function( newCode ) {
    $("#myDynamicDiv").html(newCode);
    setTimeout(function(){
        //Use the data that was just stored in #myDynamicDiv
    },300);
});

我经常这样做,而且它完美地运行,也许是ajax缓存搞乱了你的事情,我总是关闭它,有一个全局设置。显然确保读取属性的JS位于post函数内部并在html插入下方。 - Seabizkit
2个回答

2

我个人使用 .promise().done(),也许对你有用。

$("#myDynamicDiv").html(newCode).promise().done(function(){
  // your code here
});

编辑:对于后来查看此处的人们..虽然我的代码无法与Mohasen合作,但他自己找到了解决方案..请在下面找到他的答案


这并不完全适用于我的情况,但我正在研究 "done" 和 "promise" 是否有适合我的东西。一旦我让它起作用,我会立即告诉你的! - Roozbehan
好的,我使用“then”和Deferred对象使其工作了。我接受了你的答案,因为它让我走上了正确的轨道。谢谢! :) - Roozbehan
@Mohsen,你可以在我的答案中加入正确的代码和你的名字[由Mohsen更新和提供正确答案],也许这将有助于未来的某个人...祝你有美好的一天 :-) - Mohamed-Yousef
@Mohsen,请也发表一下你的解决方案,我认为这对其他人会比你标记为已接受的答案更有帮助。 - Manos Kounelakis
1
好的,我已将其作为单独的答案提交。 - Roozbehan

1

我接受了Mohamed-Yousef的答案,但是由于那并没有包含完整的解答,所以这里是我最终所做的完整版本:

当调用JQuery ajax时,它总是返回一个“Deferred”对象。你可以使用这个对象的“then()”方法在ajax调用完成后运行一些操作。以下是代码:

dfrd = $.post( "ajax/test.html", function( newCode ) {
    $("#myDynamicDiv").html(newCode);
});

dfrd.then(function(){
    //Anything that is here is guaranteed to happen after the Ajax call is done.
});

我给你的回答点了个赞,并在我的回答中指向了它。祝你有美好的一天 :-) - Mohamed-Yousef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接