我正在开发一个AJAX网站。现在我遇到了标准JavaScript和微软JavaScript方言之间的一些差异。
for examle .textContent(standard)vs .text(microsoft) 我可以制作两个文件,一个用于标准浏览器,一个用于微软浏览器,但如果我进行更改,我需要两次,所以,这不是一个理想的选择。 每次遇到.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,他们可能会进入 方言,他们不明白。
答案 0 :(得分:2)
为什么不从其他人已经经历的头痛中获益?你不是第一个遇到这些跨浏览器的怪人。请使用像jQuery这样的库来修复这些内容。然后你可以专注于更重要的事情:)
答案 1 :(得分:2)
有两种方法可以解决这个问题:
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];
这些都不会导致您遇到性能问题我可以向您保证。而且,这两个方法可以组合成一个,这样就可以确定一次正确的属性,并且函数总是返回它。
另请注意,第二个不仅性能更高,而且更安全,因为它会检查正确的功能而不是属性的存在。
答案 2 :(得分:1)
相反,您可以创建一个getText
函数,并将if
语句中的函数分配给特定于浏览器的实现。
例如:
if (typeof document.body.textContent === 'undefined')
getText = function(element) { return element.innerText; }
else
getText = function(element) { return element.textContent; }
或者,您可以使用跨浏览器的Javascript库,例如jQuery,它可以为您处理所有这些。
答案 3 :(得分:1)
让我们充分发挥Javascript的潜力,使用IE很难做到,但与其他浏览器无关。
if (typeof HTMLElement != 'undefined')
HTMLElement.prototype.__defineGetter__('innerText', function() {
return this.textContent;
});
通过这种方式,您可以在非IE浏览器中使用innerText
并获得一致的结果。
另一种需要考虑的方法。我会说,有人可能会警告修改托管对象原型的eeevils(我等待downvotes)。不过我会恭敬地不同意,因为这是一个针对非IE浏览器的兼容性垫片,在这方面都表现正确。