Javascript运行时间过长
Javascript taking too long to run
我有一个脚本运行时间太长,导致我在ie上出现此错误:此页面上的脚本导致internet explorer运行缓慢。
我已经阅读了关于这个错误的其他线程,并了解到有一种方法可以通过在一定次数的迭代后超时来绕过它。
你能帮我申请以下功能的暂停吗?
基本上,每次我发现一个隐藏的输入类型提交或收音机,我想删除,我有很多。请不要质疑为什么我有很多隐藏的废话。我做了这件事,因为我需要它,请帮我放一段时间,这样我就不会有JS错误了。谢谢
$('input:hidden').each(function(){
var name = $(this).attr('name');
if($("[name='"+name+"']").length >1){
if($(this).attr('type')!=='radio' && $(this).attr('type')!=='submit'){
$(this).remove();
}
}
});
我发现的一个例子是:绕过IE';s使用setTimeout 的长时间运行的脚本警告
您可能需要将input
添加到jquery选择器中,以仅筛选出输入标记。
if($("input[name='"+name+"']").length >1){
以下是在不使用setTimeout()
:的情况下优化的相同代码
var $hidden = $('input:hidden'),
el;
for (var i = 0; i < $hidden.length; i++) {
el = $hidden[i];
if(el.type!=='radio' && el.type!=='submit'
&& $("[name='" + el.name + "']").length >1) {
$(el).remove();
}
}
请注意,现在每个迭代最多有三个函数调用,而原始代码每次迭代最多有十个函数调用。当您可以只说this.type
(没有函数调用)时,就不需要$(this).attr('type')
(两个函数调用)。
此外,只有当三个条件为真时,才会发生.remove()
,两个type
测试并检查同名的其他元素。首先执行type
测试,因为它们很快,并且只有在type
部分通过时才麻烦对其他元素进行缓慢检查。(如果左边的操作数错误,JS的&&
不会计算右边的操作数。)
或使用setTimeout()
:
var $hidden = $('input:hidden'),
i = 0,
el;
function doNext() {
if (i < $hidden.length) {
el = $hidden[i];
if(el.type!=='radio' && el.type!=='submit'
&& $("[name='" + el.name + "']").length >1) {
$(el).remove();
}
i++;
setTimeout(doNext, 0);
}
}
doNext();
您可以通过更改$("[name='" + el.name + "']")
来指定特定的元素类型来改进任一版本,例如,如果您只使用$("input[name='" + el.name + "']")
进行输入。此外,您还可以通过一些容器进行限制,例如,如果这些输入都是以某种形式或其他什么形式。
您所引用的示例似乎正是您所需要的。我认为,如果您使用代码并替换示例中的while
循环(保留用于检查批大小的if
语句),那么基本上就完成了。您只需要打破循环的jQuery版本。
冒着陈述显而易见的风险;遍历DOM以查找与这些CSS选择器匹配的内容会使代码运行缓慢。你可以通过几个简单的技巧来减少它所做的工作量:
这些字段是否在特定元素中?如果是这样,您可以通过在选择器中包含该元素来缩小搜索范围。
例如:
$('#container input:hidden').each(function(){
...
您还可以缩小为name
属性检查的字段数
例如:
if($("#container input[name='"+name+"']").length >1){
我也不清楚为什么在找到隐藏元素后,用$("[name='"+name+"']").length >1
再次搜索。你没有解释这个要求。如果你不需要,那么你会把它拿出来,大大加快速度。
$('#container input:hidden').each(function(){
var name = $(this).attr('name');
if($(this).attr('type')!=='radio' && $(this).attr('type')!=='submit'){
$(this).remove();
}
});
如果您确实需要它,我很想知道为什么,但最好的方法可能是重组代码,使其只检查给定名称的输入数量一次,然后一次性删除所有输入。
试试这个:
$("[type=hidden]").remove(); // at the place of each loop
删除所有隐藏字段需要很短的时间。
我希望这会有所帮助。
JSFiddle示例
- 将文本框链接到由按钮运行的javascript公式
- 为什么不是't运行此Javascript的Chrome
- 如何将datetime转换为以毫秒为单位的epoch时间javascript
- HTML5画布-暂停时的运行时间
- 有没有一种方法可以在长时间运行的JavaScript操作之前强制回流
- 使用javascript计算运行时间
- 如何格式化setInterval方法JavaScript的运行时间
- Javascript:在长时间运行的Javascript函数期间显示Throbber
- Javascript运行时间过长
- 在javascript中引用数组的运行时间
- 加快javascript运行时间
- 如何将Javascript运行时间放在INPUT标记中
- Javascript运行时间函数观察者
- Javascript,我无法获得video. getcurrenttime()来显示视频运行时间
- 在具有元刷新(时间=0秒)的页面上,在中运行分析javascript
- 在javascript中查找运行时间
- 用户界面-如何为长时间运行的Javascript循环阻塞UI
- 如何分析和诊断 JavaScript 长运行时间
- 从Javascript计时器到数据库的运行时间
- 如何使用php和javascript实现从开始到结束日期的总运行时间