[英]Is it possible for a JavaScript to rewrite itself?
我正在开发一个AJAX网站。 现在我遇到了标准JavaScript和微软JavaScript方言之间的一些差异。
对于例如.textContent(标准)vs .text(微软)我可以制作两个文件,一个用于标准浏览器,一个用于微软浏览器,但如果我做了一个更改,我需要这样做两次,所以,这不是一个理想的选择。 每次遇到.textContent时都会使用if语句似乎也不是最佳解决方案。
所以,我想到了一个基于脚本的解决方案,我想出了类似这样的东西:
function translate_to_msie_dialect(){
var s = document.getElementsByTagName("script");
var l = s.length;
var i;
for ( i = 0 ; i < l ; i ++ ) {
var src = s[i].text;
s[i].text = src.replace(/.textContent/g, ".text");
}
}
我已经在Internet Explorer版本8上测试了这段代码,它似乎正在做它的工作。 (从ie转换为标准似乎不起作用,标准浏览器似乎执行未改变的代码)
问题是,这仅适用于内联脚本,而不适用于js源文件脚本。 是否可以为javascript文件客户端执行此转换脚本?
我可以对用户代理(服务器端)进行检查,但我宁愿对方言本身进行检查,因为有些浏览器支持“识别为”功能,如果他们将自己标识为ie,则可能会使用方言他们不明白。
为什么不从其他人已经经历的头痛中获益? 你不是第一个遇到这些跨浏览器的怪人。 请使用像jQuery这样的库来修复这些东西。 然后你可以专注于更重要的事情:)
有两种方法可以解决这个问题:
1.定义一个getter函数
function getText(el) {
return el.textContent || el.innerText;
}
用法
var text = getText(el);
2.虚拟测试(仅执行一次)
var textContent = (function() {
var dummy = document.createElement("span");
dummy.innerHTML = "full <span>support</span>";
if (dummy.textContent === "full support") {
return "textContent";
} else {
return "innerText";
}
})();
用法
var text = el[textContent];
这些都不会导致我可以向您保证性能问题。 而且,这两种方法可以合并为一种,这样就可以确定一次正确的属性,并且函数总是返回它。
另请注意,第二个不仅性能更高,而且更安全,因为它检查正确的功能而不是属性的存在。
相反,您可以创建一个getText
函数,并将if
语句中的函数分配给特定于浏览器的实现。
例如:
if (typeof document.body.textContent === 'undefined')
getText = function(element) { return element.innerText; }
else
getText = function(element) { return element.textContent; }
或者,您可以使用跨浏览器的Javascript库,例如jQuery ,它可以为您处理所有这些。
让我们充分发挥Javascript的潜力,使用IE很难做到,但与其他浏览器无关。
if (typeof HTMLElement != 'undefined')
HTMLElement.prototype.__defineGetter__('innerText', function() {
return this.textContent;
});
有了这个,您可以在非IE浏览器中使用innerText
,并获得一致的结果。
另一种需要考虑的方法。 我会说,有些人可能会警告修改托管对象原型的eeevils(我在等待downvotes)。 然而,我会恭敬地不同意,因为这是针对非IE浏览器的兼容性垫片,在这方面所有行为都正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.