简单页面代码如下, 可以重现:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<input type="text" id="t" />
<div id="console" />
<script type="text/javascript">
var messageCount = 1;
function output(message) {
var console = document.getElementById("console");
console.innerHTML += messageCount++ + ": " + message + "<br/>";
};
var t = document.getElementById("t");
var tv = document.getElementById("tv"); t.attachEvent("onfocus", function() {
output("focus");
t.value = "";
t.className = "";
});
t.attachEvent("onblur", function() {
output("blur");
});
t.attachEvent("onpropertychange", function(e) {
output("propertychange: "+e.propertyName);
});
</script>
</body>
</html>
步骤:
1. 在输入框中输入一个字符, 如a;
2. 点击页面其他地方, 使输入框失去焦点
3. 再次在输入框中输入一个字符, 此时的这个操作不会触发propertychange; 但是之后再输入字符都会触发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<input type="text" id="t" />
<div id="console" />
<script type="text/javascript">
var messageCount = 1;
function output(message) {
var console = document.getElementById("console");
console.innerHTML += messageCount++ + ": " + message + "<br/>";
};
var t = document.getElementById("t");
var tv = document.getElementById("tv"); t.attachEvent("onfocus", function() {
output("focus");
t.value = "";
t.className = "";
});
t.attachEvent("onblur", function() {
output("blur");
});
t.attachEvent("onpropertychange", function(e) {
output("propertychange: "+e.propertyName);
});
</script>
</body>
</html>
步骤:
1. 在输入框中输入一个字符, 如a;
2. 点击页面其他地方, 使输入框失去焦点
3. 再次在输入框中输入一个字符, 此时的这个操作不会触发propertychange; 但是之后再输入字符都会触发
<head>
<title> </title>
</head>
<body>
<input type="text" id="t" />
<div id="console" />
<script type="text/javascript">
var messageCount = 1;
function output(message) {
var console = document.getElementById("console");
console.innerHTML += messageCount++ + ": " + message + " <br/>";
};
var t = document.getElementById("t");
var tv = document.getElementById("tv"); t.attachEvent("onfocus", function() {
output("focus");
t.value = "";
setTimeout(function(e){return function(){e.className=""}}(t),20)
//t.className = "";
});
t.attachEvent("onblur", function() {
output("blur");
});
t.attachEvent("onpropertychange", function(e) {
output("propertychange: "+e.propertyName);
});
</script>
</body>
</html>
纳闷...
这个确实是IE的bug吗?真正的原因就是连续的修改value和className?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>test</title>
<style type="text/css">
.a{background:#0f0;}
.b{background:#f00;}
</style>
</head>
<body>
<input type="text" id="t" class="a" />
<div id="console" />
<script type="text/javascript">
var messageCount = 1;
function output(message) {
var console = document.getElementById("console");
console.innerHTML += messageCount++ + ": " + message + " <br/>";
};
var t = document.getElementById("t");
var tv = document.getElementById("tv"); t.attachEvent("onfocus", function() {
output("focus");
t.select();document.selection.clear();//修正此处
t.className = 'b';//测试修改样式
});
t.attachEvent("onblur", function() {
output("blur");
t.className = 'a';//测试修改样式
});
t.attachEvent("onpropertychange", function(e) {
output("propertychange: "+e.propertyName);
});
</script>
</body>
</html>
我想知道到底为什么呢?为什么会有这样的问题?为什么t.select()就解决了呢?
真郁闷啊...
大家要是还有什么补充的, 欢迎继续讨论, 最好能找到确切的原因, 不然以后碰到个类似的又崩溃了....我找到这个select的解决办法, 还是我问了些同事, 他们碰巧用这个解决的. 下次可不一定这么好运了
如果下个星期依然没有结果, 我就给分结帖了