繁体   English   中英

JavaScript可以重写自己吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM