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、クローンの代わりに使用することですが、それはもう少し手間がかかるかもしれません。

編集:

type問題は、要素がDOMに含まれた後、要素の属性を動的に変更することをIEが好まないことであるように思われることを忘れてしまいました。

于 2012-10-31T22:22:19.600 に答える