English 中文(简体)
在AJAX重页面上出现的事件问题
原标题:
  • 时间:2008-12-08 23:54:44
  •  标签:

我有一个ASP页面,它使用jQuery AJAX在页面加载后将成员计数加载到一堆

中。

它在Firefox中表现得非常好,并且适用于组数较少的客户端。

对于有许多组(500+)的少数客户端,在IE中出现错误。Ajax调用似乎是同步运行的,因为直到每个Ajax调用返回后,单击事件才会注册。

大多数客户端的Ajax请求系列只有1个请求。只有在拥有非常多组的客户端中,它才会被拆分为多个请求。

现在,我已经看到了一个错误,即如果链接在DOM加载后添加,则 $(“a”).click 函数不会被绑定。那些不起作用的链接不是由AJAX加载的,它们不属于这个类别。

这是伪代码:

ready()
{
    // count the number of groups that this user has, adding the ids to a list
    if( count < 50 )
    {
        runAjax();
    }
    else
    {
        // this calls the ajax request on groups of 50 ids
        // it pauses briefly after each request by using setTimeout to call the next
        runAjaxRecursively();
    }
}

这里是Ajax请求:

// run the HTTPRequest
$.ajax({
    async: true,
    type: "POST",
    url: "emailcatcount.asp?idList="+idList,
    data: "idList="+idList,
    dataType: "html",
    success: function(html) { // blah blah blah }
});

无论如何,代码运行正常,请将任何错误视为打字错误。唯一的问题是,在IE中,点击事件不会触发,直到每个ajax调用都已返回。

有没有人知道为什么会发生这种情况?请注意,我将 async 设置为true。

这与jQuery在IE中如何处理ready事件有关吗?

我感到困惑,已经花了几天时间在这上面了,所以任何想法都会受到欣赏。

问题回答

你的问题是你没有给浏览器足够的时间,尝试在递归循环中添加一些setTimeout函数,以给浏览器处理其他事件的时间,记住你只有一个线程来运行。你最好尝试只进行一次调用,使用jtemplates和json一起处理数据并呈现标记,而不是返回繁重的html。

你所提到的 bug 并不是 bug,jQuery 只会为那时存在的元素绑定处理程序。如果您有动态内容,最好使用事件委托来处理动态元素的点击事件。这样,您不需要明确绑定每个元素,而是将点击事件绑定到静态容器。然后,您可以查询 event.target,以查看是否是您所需的元素之一引发了事件,如果是,则处理所需的行为。好处是您不会使 DOM 承担多个绑定事件和动态内容的负荷。

这个成功函数是否正在更新表格内容?即大表格渲染非常糟糕。





相关问题