在 jquery 更新 DOM(AJAX 请求)之后做某事

Posted

技术标签:

【中文标题】在 jquery 更新 DOM(AJAX 请求)之后做某事【英文标题】:Doing something after jquery updates the DOM (AJAX request) 【发布时间】:2011-06-22 15:02:24 【问题描述】:

我有一些更新页面内容的实时查询处理程序。我只想在他们被解雇后才显示内容(以防止用户暂时看到未更改的版本)。使用普通 AJAX 加载内容。

到目前为止,我尝试了以下方法:

    通过html获取ajax 使其不可见(可见性:隐藏) window.setTimeout(showContent, 100) - 将可见性设置为可见

我认为这会起作用,因为单个选项卡有一个 JS 线程 - 所以计时器应该在所有其他操作完成后触发。它适用于 FF 和 IE。但是在 Chrome 中,有时我仍然会看到一段时间内未更改的内容 - 好像 JS 被线程化或被超时中断?

或者也许有更好的方法来实现我想要做的事情? (没有超时)。

【问题讨论】:

为什么要更新第一个请求?从请求本身调用所有正确的数据不是更好吗? 当然最好一开始就生成正确的东西,但有些更新是依赖于布局的,例如考虑到文本的实际宽度(省略号)。跨度> 【参考方案1】: 您可以使用success 回调 或者您可以返回 javascript 本身并将其添加到 dom。 (您将在其中指定显示机制:))

【讨论】:

但我正在接收新内容并在成功回调中更新 DOM,因此所有 livequery/jquery 事件仅在调用完成后触发。 那么您可以在调用链的末尾触发 .show() 调用而不是 setTimeout,不是吗?无论如何 js 将是单线程的......这意味着流程将像这样 -> 你调用 ajax -> 成功调用 hide() -> hide() 的回调调用你的更新函数之一 -> 你的更新函数调用.show().. 不是这样吗? 不幸的是,只有在我的方法完成后才会触发 livequery 事件。我也认为流程会这样,但由于某种原因(在 FF、Chrome 中,从不在 IE 中)有时会在 livequery 事件之前调用超时。 让你的显示/显示函数在执行前检查一个全局变量,如果变量为假,不执行,只返回假。您可以在函数链的末尾设置变量吗? 我最终使用了全局 $.livequery.queue.length,事实上您的回答使我找到了这个解决方案,非常感谢! :)【参考方案2】:

事实证明,livequery 在内部使用超时确实运行实时查询,所以这是超时方法排序的问题。

所以我解决了这个问题,直到 livequery 队列清除(有一些边界,如果用户对他的鼠标感到疯狂并不断产生事件):

function run_after_livequery(method) 
    var tries = 0;
    function run_if_livequery_done() 
        if (!$.livequery.queue.length || tries >= 20) 
            method();
         else 
            window.setTimeout(run_if_livequery_done, 50);
            tries++;
        
    

    window.setTimeout(run_if_livequery_done, 50);

【讨论】:

以上是关于在 jquery 更新 DOM(AJAX 请求)之后做某事的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript DOM 编程艺术之 Ajax

JQuery之Ajax

jquery之ajax

使用 JQuery ajax 在 DOM 操作后附加事件

React-使用总结

防止图像在非 DOM jQuery AJAX 解析上加载