修复IE错误:总是一个好主意?

时间:2013-12-18 15:24:35

标签: javascript internet-explorer dom

Internet Explorer在过去3年中改进了很多,因为IE 10已成为一款性能相当不错的浏览器。但是,即使有了这些改进,Web开发人员仍然需要:

  1. 处理旧版本,特别是IE8甚至IE7;
  2. 解决IE浏览器自永远以来的错误,例如unimplemented document.evaluateoninput在删除时未触发的事件或contentEditable元素。
  3. 我问自己这些变通方法的“可接受”限制是什么。例如,IE&lt; 9 change事件不会冒泡:但由于它支持focusinfocusout,它们确实会冒泡,因此可以使用几个事件侦听器修复它。< / p>

    众所周知,IE&lt; 9不能正确处理innerHTML元素上的<select>属性,因此我们可以重新定义属性(仅限IE8):

    (function() {
        var re = /^<SELECT(?: [\w:]+=(?:\S+|'[^']*'|"[^"]*"))*>/,
            div = document.createElement("div");
        Object.defineProperty(HTMLSelectElement.prototype, "innerHTML", {get: function() {
            var out = this.outerHTML, m = out.match(re);
            return m ? out.slice(m[0].length, -9) : "";
        }, set: function(v) {
            this.innerText = "";
            if (v = String(v)) {
                div.innerHTML = "<select>" + v + "</select>";
                var s = div.firstChild;
                while (s.firstChild) this.appendChild(s.firstChild);
            }
        }});
    })();
    

    但IE - 甚至是IE11! - 仍然不允许动态设置value元素的<select>属性,因此(IE8-11):

    Object.defineProperty(HTMLSelectElement.prototype, "value", {get: function() {
        var opt = this.selectedIndex >= 0 ? this.options[this.selectedIndex] : null;
        return opt ? opt.value : "";
    }, set: function(val) {
        val = String(val);
        var ops = this.options, i = ops.length;
        while (i--) if (ops[i].value === val) break;
        this.selectedIndex = i;
    }});
    

    这些工作做得很好,可能有点慢但只是在一个重要的案例中:HTMLSelectElement s。而且它们很少能代表性能问题。

    但是因为我正在改变一些基本的DOM属性,所以我想知道是否会出现任何我没有看到的问题。有没有人有想法?

0 个答案:

没有答案