use*_*524 17 html javascript jquery internet-explorer-11
如果我使用$('表单输入')在IE11中清除包含5个或更多字段的表单.val("")IE11将崩溃.HTML:
<form>
<label>1</label><input type="text"/>
<label>2</label><input type="text"/>
<label>3</label><input type="text"/>
<label>4</label><input type="text"/>
<label>5</label><input type="text"/>
</form>
Run Code Online (Sandbox Code Playgroud)
JS:
$(document).ready(function(){
$('#clearFormNormal').click(function(){
$("form input").val("");
});
});
Run Code Online (Sandbox Code Playgroud)
当我这样做递归并使用setTimeout时,它可以工作.
JS:
function clearFields (counter) {
var i = counter || 0, deferred = new $.Deferred();
if ($("form input").eq(i).length === 1){
setTimeout(function(){
$("form input").eq(i).val("");
i = i + 1;
clearFields(i).always(function(){
deferred.resolve();
});
},0);
} else {
deferred.resolve();
}
return deferred.promise();
}
$(document).ready(function(){
$('#clearFormSetTimeout').click(function(){
clearFields();
});
});
Run Code Online (Sandbox Code Playgroud)
见http://jsfiddle.net/fransoverbeek/Cy5D5/7/以及
这是IE11的错误吗?
我相信这是一个IE错误,我创建了以下连接错误报告:https: //connect.microsoft.com/IE/feedback/details/811930/ie11-crash-when-clearing-multiple-input-fields-与-的jQuery
我已经添加了一个稍微修改过的递归函数版本作为解决方法.该函数稍微更通用,如下所示:
function clearFields (counter, selector) {
var i = counter || 0, deferred = new $.Deferred();
if (selector.eq(i).length === 1){
setTimeout(function(){
selector.eq(i).val("");
i = i + 1;
clearFields(i, selector).always(function(){
deferred.resolve();
});
},0);
} else {
deferred.resolve();
}
return deferred.promise();
}
$(document).ready(function(){
$('#clearFormNormal').click(function(){
$("form input").val("");
});
$('#clearFormSetTimeout').click(function(){
clearFields(0, $("form input"));
});
});
Run Code Online (Sandbox Code Playgroud)
请向上投票连接问题.
clearFields函数的工作原理:
首先,请注意我没有写出这是基于的原始函数,所以它工作的原因只是我的猜想.
clearFields函数是一个递归函数.每次运行时,它都需要两个参数:counter(要清除的字段集中的索引)和selector(包含要清除的字段集的jquery对象)
该函数创建查看由selector指定的DOM元素集中的counter指定的元素.如果存在这样的元素,那么它会创建一个异步的setTimeout来清除该元素.这个异步函数然后递增计数器(这里称为i)并递归调用clearFields.我相信递归是关键,因为我尝试在循环中只使用setTimeout并且它不起作用.
当计数器超过集合中最后一个元素的索引时,递归停止,当时select.eq(counter).length!== 1
我认为通过交换计数器和选择器参数的顺序可以进一步改进这个功能,这样第一次调用计数器就是可选的.
我之前从未需要使用jQuery延迟代码,所以我不知道在这个函数中起什么作用.
小智 5
我相信它是IE的一个bug,它与jQuery无关,因为你可以通过以下html页面简单地显示它:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></meta>
<title>test</title>
</head>
<body>
<form id="form_1">
<input type="text" value="" size="10"/><br/>
<input type="text" value="" size="10"/><br/>
<input type="text" value="" size="10"/><br/>
<input type="text" value="" size="10"/><br/>
<input type="text" value="" size="10"/><br/>
<input type="text" value="" size="10"/><br/>
<input type="text" value="" size="10"/><br/>
<input type="text" value="" size="10"/><br/>
<input type="text" value="" size="10"/><br/>
<input type="text" value="" size="10"/><br/>
<input type="text" value="" size="10"/><br/>
<input type="button" value="reset" onclick="document.getElementById('form_1').reset();">
</form>.
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
重置表单后,可以发现IE 11将崩溃.