以下javascript在IE9中不起作用,但在Firefox中运行良好。不知道怎么解决这个问题? THX。
var element = e.srcElement || e.target;
if(element != null){
if(element.tagName == "INPUT") {
//alert("Before: " + element.getAttribute("type"));
element.setAttribute("type", "password");
//alert("After: " + element.getAttribute("type"));
}
}
答案 0 :(得分:2)
以下是几点说明:
// ------------v---favor e.target
var element = e.target || e.srcElement;
// -----v---simple truthy test
if (element){
// ------------v---------v---- use nodeName, and toUpperCase() for safety
if (element.nodeName.toUpperCase() == "INPUT") {
// Not all IE respects the changing of the "type" on an input
element.setAttribute("type", "password");
}
}
我认为IE9中的tagName
表示可能已更改。使用nodeName
应该保证大写字符,但是有一些难得的错误要避免,所以我们使用toUpperCase()
。
过去,IE不允许更改"type"
元素的input
。如果在IE9中仍然存在这种情况,那就不会生育,但IE8及更低版本肯定不允许这样做。
答案 1 :(得分:2)
由于我发现一个合理的解决方案是用新的元素替换元素,你可以使用这样的东西:
var input = element;
var input2 = input.cloneNode(false);
input2.type = "password";
input.parentNode.replaceChild(input2, input);
在此处找到http://bytes.com/topic/javascript/answers/705445-dynamically-change-input-type-text-password并稍作修改。另一个解决方案是使用createElement
而不是克隆,但这可能需要更多的工作。
编辑:
忘记提到问题似乎是IE不喜欢在元素被包含在DOM中之后动态地更改元素的type
属性。