• 测试是否支持DOMAttrModified


    如果不支持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

  • 相关阅读:
    Web持久化存储Web SQL、Local Storage、Cookies(常用)
    浅谈TypeScript
    浅谈JavaScript、ES5、ES6
    AngularJS1.3一些技巧
    AngularJS学习总结
    poj-----Ultra-QuickSort(离散化+树状数组)
    HDUOJ---1241Oil Deposits(dfs)
    HDUOJ---携程员工运动会场地问题
    HDUOJ------2398Savings Account
    HDUOJ-----2399GPA
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/2519263.html
Copyright © 2020-2023  润新知