Cross-browser Getter and Setter

前端 未结 4 560
误落风尘
误落风尘 2020-12-23 17:52

This works in modern Chrome/Firefox/Opera but fails in IE8. Haven\'t tried it in IE9. How can I make this cross-browser compatible, including IE7+? (Fiddle here.)

         


        
4条回答
  •  Happy的楠姐
    2020-12-23 18:30

    Here is the workaround for IE6/7/8. I performed the test and it works very well!

    Update: The link is broken, you can see the code of from my testing here:

        // Super amazing, cross browser property function, based on http://thewikies.com/
    function addProperty(obj, name, onGet, onSet) {
    
        // wrapper functions
        var
            oldValue = obj[name],
            getFn = function () {
                return onGet.apply(obj, [oldValue]);
            },
            setFn = function (newValue) {
                return oldValue = onSet.apply(obj, [newValue]);
            };
    
        // Modern browsers, IE9+, and IE8 (must be a DOM object),
        if (Object.defineProperty) {
    
            Object.defineProperty(obj, name, {
                get: getFn,
                set: setFn
            });
    
        // Older Mozilla
        } else if (obj.__defineGetter__) {
    
            obj.__defineGetter__(name, getFn);
            obj.__defineSetter__(name, setFn);
    
        // IE6-7
        // must be a real DOM object (to have attachEvent) and must be attached to document (for onpropertychange to fire)
        } else {
    
            var onPropertyChange = function (e) {
    
                if (event.propertyName == name) {
                    // temporarily remove the event so it doesn't fire again and create a loop
                    obj.detachEvent("onpropertychange", onPropertyChange);
    
                    // get the changed value, run it through the set function
                    var newValue = setFn(obj[name]);
    
                    // restore the get function
                    obj[name] = getFn;
                    obj[name].toString = getFn;
    
                    // restore the event
                    obj.attachEvent("onpropertychange", onPropertyChange);
                }
            };  
    
            obj[name] = getFn;
            obj[name].toString = getFn;
    
            obj.attachEvent("onpropertychange", onPropertyChange);
    
        }
    }
    

提交回复
热议问题