1

以下 javascript 在 IE9 中不起作用,但在 Firefox 中可以正常工作。知道如何解决这个问题吗?谢谢。

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"));

  }
}
4

2 回答 2

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");

    } 
}

我认为tagNameIE9 中的表示可能已经改变。使用nodeName 应该保证大写字符,但有几个罕见的错误需要避免,所以我们使用toUpperCase().

过去,IE 不允许更改元素"type"的。input如果在 IE9 中仍然是这种情况,那不是很重要,但肯定 IE8 和更低版本不允许这样做。

于 2012-10-31T22:16:46.640 回答
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不喜欢在type将元素包含在DOM中后动态更改它的属性。

于 2012-10-31T22:22:19.600 回答