Javascript 修复IE漏洞:总是一个好主意?
Internet Explorer在过去3年中有了很大的改进,自从IE 10成为一款性能相当不错的浏览器以来。但是,即使有了这些改进,web开发人员仍然必须:Javascript 修复IE漏洞:总是一个好主意?,javascript,internet-explorer,dom,Javascript,Internet Explorer,Dom,Internet Explorer在过去3年中有了很大的改进,自从IE 10成为一款性能相当不错的浏览器以来。但是,即使有了这些改进,web开发人员仍然必须: 处理旧版本,特别是IE8甚至IE7 解决IE一直拖到现在的bug,比如,删除或contentEditable元素时未触发的、或oninput事件 我在问自己,这些变通办法的“可接受”限度是多少。例如,IEA是一个很好的问题,但可能不适合这样做。我甚至不确定你在问什么。如果您需要支持IE版本X,那么除了使其在该版本及更高版本中工作之外,肯定
contentEditable
元素时未触发的、或oninput
事件我在问自己,这些变通办法的“可接受”限度是多少。例如,IEA是一个很好的问题,但可能不适合这样做。我甚至不确定你在问什么。如果您需要支持IE版本X,那么除了使其在该版本及更高版本中工作之外,肯定别无选择。或者您正在询问是否可以放弃对旧IE的支持?仅供参考,对于您的
.innerHTML
修复,可能最好获取属性描述符,将get
缓存在变量中,并让新的get
调用缓存的属性描述符。比使用正则表达式更简洁。我不明白为什么这个问题以“主要基于意见”结束。我想问的是,可能会有任何问题。这无异于询问扩展Object.prototype
是否是个好主意。这几乎不是基于意见的。你们中有多少人真正重新定义了值
,你们遇到了什么问题@Juhana我想问的是,是否最好依赖一些更抽象的方法,比如setValue
或setInnerHTML
之类的东西,这些方法必须在IE7及更低版本中采用。我提出的解决方案不可能是唯一的,不是吗?你的问题似乎开始问什么是可以接受的WRT修复旧的或当前的IE bug。这是一个意见问题,取决于具体情况。最后你会问一些潜在的问题。也许你可以把问题的措辞改得更集中。。。扩展Object.prototype
是否是一个好主意的问题绝对是一个意见问题。
(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);
}
}});
})();
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;
}});