2010-10-31 26 views
4

我正在开发一个AJAX网站。现在我已经遇到了标准JavaScript和微软JavaScript方言之间的一些差异。JavaScript可能重写自己吗?

For examle .textContent(standard)vs .text(microsoft) 我可以创建两个文件,一个用于标准浏览器,另一个用于微软浏览器,但如果我做了更改,我需要这样做两次,所以,这就是不是一个理想的选择。 如果在每次遇到.textContent时发出if语句,似乎也不是最佳解决方案。

所以,我thinkng关于基于脚本的解决方案,我想出了这样的事情:

 

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版,它似乎 做它的工作。 (从即标准的翻译似乎并没有工作, 标准的浏览器似乎执行,而不是不变的代码)

的问题是,这仅适用于行脚本,而不是JS源文件 脚本。是否有可能为客户端的JavaScript文件 执行此转换脚本?

我可以做用户代理(服务器端)的支票,但我宁愿做 在方言本身的检查,因为一些浏览器支持“标识为” 功能,如果他们认同自己是即他们可能会收到他们不明白的方言 。

+3

有趣的元编程方法...专业提示:要在更大规模上正确执行此操作,您需要的不仅仅是正则表达式,还需要解析器。为什么不使用解决这些问题的众多库/框架之一? – delnan 2010-10-31 15:51:55

回答

1

取而代之,您可以制作getText函数,并将if语句中的函数分配给特定于浏览器的实现。

例如:

if (typeof document.body.textContent === 'undefined') 
    getText = function(element) { return element.innerText; } 
else 
    getText = function(element) { return element.textContent; } 

或者,你可以使用一个跨浏览器的Javascript库如jQuery负责处理所有的这个要求。

+0

-1没有UA嗅探请。 – galambalazs 2010-10-31 16:01:24

+0

@galambalazs:现在你快乐吗? – SLaks 2010-10-31 16:02:45

+0

是的,我已经删除了投票。 – galambalazs 2010-10-31 16:29:18

2

为什么不从他人已经经历的头痛中受益?你不是第一个遇到这些跨浏览器的怪物。请使用像jQuery这样的库,它可以为你解决这个问题。然后你就可以专注于更重要的事情:)

2

有两种方法可以解决这个问题:

定义一个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]; 

这些都不会使你的性能问题,我可以向你保证。此外,这两种方法可以合并为一个,以便正确的属性决定一次,并且函数总是返回它。

另请注意,第二个不仅更高性能,更安全,因为它检查正确的功能而不是属性的存在。

+0

谢谢。我将在稍后的 上运行一些测试,事实上,检查功能是我想到的。 – 2010-11-02 14:42:39

+0

另外,我甚至可以通过在启动时进行测试来“优化”它,然后分配正确的功能,所以我只做一次测试。 – 2010-11-02 14:45:28

+0

是的,我写道你可以将两者结合起来。 – galambalazs 2010-11-02 16:03:10

1

让我们使用Javascript来充分发挥它的潜力,这是IE的一些难点,但与其他浏览器无关。

if (typeof HTMLElement != 'undefined') 
    HTMLElement.prototype.__defineGetter__('innerText', function() { 
    return this.textContent; 
    }); 

有了这个,你可以在非IE浏览器一致的结果使用innerText

只是另一种考虑的方法。我会说,有些人可能会警告修改原型托管对象(我等待downvotes)的eeevils。然而,我会表示不同意,因为这是针对非IE浏览器的兼容性缓冲区,在所有这些方面都表现正确。

+1

我不会投票给你,但你应得的。与*主机对象混淆*不是**唯一的IE问题。主要观点是*“原型对象的暴露”不是任何规范的一部分*,而且“内部方法行为是依赖于实现的”*。欲了解更多信息,请**阅读**:http://perfectionkills.com/whats-wrong-with-extending-the-dom/ – galambalazs 2010-10-31 16:48:05

+0

我已阅读了所有内容,但简单的事实是,它的工作原理和工作原理始终如一除IE之外的每个现代浏览器而且没有理由怀疑它将来无法工作。像往常一样,官方规范仅仅是所有体面的EMCAScript实现的后面。 – MooGoo 2010-10-31 16:52:30

+0

我认为这看起来是最“性能优化”的解决方案。但是,这意味着教'标准的JavaScript实现''微软方言'。此外,微软将在未来版本的浏览器中做什么?我认为检查“功能”更安全 – 2010-11-02 14:50:45

相关问题