jQuery Ajax 调用在 IE 中非常慢,但在 Firefox 中却很快
我正在执行 jQuery .ajax()
调用,该调用返回指定子网上 IP 地址的 List
。 我在 .aspx 页面上使用 [WebMethod]
来返回值。 ASP.NET 的内置 JSON 序列化器可以神奇地返回我的 Javascript 中使用的实际 JSON。
我已经分析了服务器端时间,填充和返回列表需要大约 8 毫秒,因此服务器端代码不是问题。
但是,当启动 Ajax 调用时,在 Internet Explorer 中,可能需要 3 秒以上的时间才能用返回的一小部分 IP 地址填充列表框。 在 Firefox 中,列表框基本上是立即填充的。
我不完全确定瓶颈可能在哪里。 我最好的猜测是,故障出在 IE6 的 javascript 引擎上,但即便如此,仅添加 255 个列表项也不应该花费这么多时间。
谁能指出我正确的方向来解释为什么会发生这种情况?
示例代码
$.ajax({
type: "POST",
url: $("Example.aspx/GetIPsOnNetwork",
data: "{NetworkID: " + networkID + "}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data) {
$('#ipAddresses').empty();
// Loop through each IP address and add it to the listbox
$.each(data.d, function(){
var ip = this.toString();
$(document.createElement('option')).attr('value', ip).text(ip).appendTo('#ipAddresses');
});
},
error: function(msg) {
alert('Error: ' + msg);
}
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这可能是渲染问题。 试试这个
基本上,您所做的是将选项加载到虚拟列表中,然后将内容添加到 ipAddresses 列表中。
我更改的另一件事是
document.createElement(...)
。 如果您查看$('
的内部结构,它会为您执行 createElement 。最后,我选择将数据追加到列表中,而不是调用
option.appendTo('#ipAddress')
,后者每次都必须查找 ipAddress 元素。It could be a rendering issue. try this
Basically, what you're doing is loading the options into a dummy list, then you're adding the contents to the ipAddresses list.
The other thing that I changed was the
document.createElement(...)
. If you look at the internals of$('<option />')
it performs the createElement for you.Finally I choose to append the data to the list instead of calling
option.appendTo('#ipAddress')
, which would have to find the ipAddress element every time.我怀疑这可能是在 IE 中创建选项元素并将每个选项元素逐一添加到 DOM 的速度上的差异。
在这一行
你可以尝试
或者这个(data.d是一个对象,对吧?)
你可能会发现这个关于 jQuery 的 append() 的文章 有用
I suspect it might be a difference in speed of creating the option elements in IE and adding each one by one to the DOM.
On this line
You could try
or this (data.d is an object, right?)
You might find this article on jQuery's append() useful
与非标准但普遍存在的 .innerHTML 属性相比,使用推荐的 DOM 创建方法创建元素极其缓慢。 我曾经不得不更新一个大约 100 行的表,就像您所经历的那样,浏览器越旧,使用元素创建的操作就越慢。 如果可以的话,创建一个虚拟 SELECT 元素并使用 OPTION 元素的手动连接 HTML 字符串填充它,然后在虚拟 SELECT 对象上使用 .innerHTML。 然后,您可以自由地对该元素执行任何您想要的操作(使用 .replaceChild 等)。
虽然这是一种非标准的元素创建方式,但 .innerHTML 将会陪伴我们很长一段时间,而且速度很快。
Creating elements using the recommended DOM creation methods is extremely slow compared to the non-standard yet ubiquitous .innerHTML property. I once had to update a table with about 100 rows and just like you experienced, the older the browser the slower the operation using element creation. If you can, create a dummy SELECT element and populate it with a manually a concatenated HTML string of your OPTION elements and then use .innerHTML on your dummy SELECT object. You are then free to do whatever you want with this element (using .replaceChild, etc).
While this is a non-standard way of doing element creation, .innerHTML is going to stay with us for a long, long time, and it is fast.
我发现jquery 的append 与IE7 中的innerHTML 相比非常慢。 Firefox 和 Chrome 似乎使用append 或innerHTML 以相同的速度渲染。 这可能与 Salaryman 所说的 DOM 创建方法有关。
I've found jquery's append to be very slow compared to innerHTML in IE7. Firefox and Chrome seem to render at the same speed using either append or innerHTML. This may have something to do with what Salaryman was saying about DOM creation methods.