測試是否支援DOMAttrModified

來源:互聯網
上載者:User

如果不支援propertychange事件,就使用這個,或者更高端的MutationObserver.

  var root = document.documentElement    supportDOMAttrModified = root.addEventListener ?    (function() {      var fn,  f = false, id = root.id;      fn = function() {        root.removeEventListener('DOMAttrModified', fn, false);        supportDOMAttrModified = true;        root.id = id;//還原它      };      root.addEventListener('DOMAttrModified', fn, false);      root.id = 'mass';//更新屬性      f = root.id != 'mass';      root.id = id;//無論如何也還原它      return f;    })() :    false
  if(mutationObserver){//FF14+ (MutationObserver,無需首碼), Chrome18+(需Webkit首碼), 目前只有這兩款瀏覽器有實現.                    /*                        參考 :                        1.  http://www.w3.org/TR/dom/#mutation-observers                        2.  https://hacks.mozilla.org/2012/05/dom-mutationobserver-reacting-to-dom-changes-without-killing-browser-performance/                    */                    observer = new mutationObserver(                        function(mutations){                                                       //mutations[mutations.length].oldValue //老的值                            onchange();                        }                    );                    observer.observe(                        el,                        {                            //attributeOldValue : true, //mutation record 記錄前一個值.                            attributes : true,                            attributeFilter : 'value' //只關注value 的變化.                        }                    );                    //observer.disconnect();                                   }else if(el.addEventListener && !window.XDomainRequest){//FF2+, Opera9.2+, IE9+                    el.addEventListener('DOMAttrModified', function (e) {                        /*                            注意,這貨只對js修改敏感.                            所以,需要結合你關注屬性的其他DOM事件                            比如input 的 oninput,onchange 什麼的.                        */                        alert(e.attrName)                        if(e.attrName === 'value'){                            onchange();                        }                    }, false);                }else if(el.attachEvent){                    el.attachEvent('onpropertychange', function (e) {                        if(e.propertyName === 'value'){                            onchange();                        }                                          });                } document.onclick = function () {                el.value = Math.random();                //el.setAttribute('value', Math.random());                el.name = 123; //opera10+,FF2+,IE9+ (有趣的是, DOMAttrModified的 e.attrName ,IE9下,對於name 居然叫做 propdescname ..)                el.setAttribute('name', 1234); //opera9.2+, FF2+,IE9+                               /*                    建議為了只使用el.value 方式修改value的值. 這樣做,雖然會損失opera9.6-. 但卻可以解決一個致命問題.                    即,非IE9一旦某處,使用過el.value = xxx的方式後 el.setAttribute('value', xxx); 就失效了...即不改變value,也不會觸發 DOMAttrModified 以及 observer的回調.                    IE9 則很變態,el.value= xxx方式只能觸發 onpropertychange, setAttribute方式,則只能觸發DOMAttrModified.                    (IE6-8沒這個問題,因為IE6-8不區分attribute和property.所以無論咋折騰它都觸發onpropertychange)                    所以綜合考慮下,IE9+也同樣使用onpropertychange, 且保證修改value,一概使用el.value = xxx方式.                                   */
Browser DOMSubtreeModified DOMAttrModified
Firefox 3.6.2 ok ok
Internet Explorer 8 沒實作,但有自己的做法
Safari 4.0.5 x x
Opera 10.51 x ok
Chrome 4.1.249.1042 x x

相關連結:

BOM and DOM events 02 - Attribute Changes

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.