JavaScript可以重写自己吗?

时间:2010-10-31 15:48:37

标签: javascript internet-explorer

我正在开发一个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,他们可能会进入 方言,他们不明白。

4 个答案:

答案 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浏览器的兼容性垫片,在这方面都表现正确。