【问题标题】:Removing Chrome's "translate" DOM Property移除 Chrome 的“翻译”DOM 属性
【发布时间】:2012-10-28 23:02:50
【问题描述】:

我正在处理一些遗留代码,其中原始开发人员大量使用生成具有名为translate 的非标准属性的 HTML DOM 节点

<span translate="[{&quot;shown&quot;:&quot;My Account&quot;,&quot;translated&quot;:&quot;My Account&quot;,&quot;original&quot;:&quot;My Account&quot;,&quot;location&quot;:&quot;Text&quot;,&quot;scope&quot;:&quot;Mage_Customer&quot;}]">My Account</span>

然后使用 javascript 代码遍历/搜索这些节点,如下所示。

if (!$(target).match('*[translate]')) {
    target = target.up('*[translate]');
}

我要解决的问题是,Google Chrome 似乎自动为文档中的每个 DOM 节点添加了 translate 属性,并且该 DOM 节点的值是布尔值 @ 987654329@。您可以通过从 Chrome 的 javascript 控制台运行以下 Javascript 来查看这一点

> document.getElementsByTagName('p')[0].translate
true
>

有没有办法告诉 Chrome不要 填充这些属性?他们的存在对遗留代码造成了严重破坏。 PrototypeJS 的 matchup 节点将这些布尔对象属性视为匹配项,而我正在处理的代码专门寻找具有名为 translate 的属性的 DOM 节点。我想为我的问题找到一个不涉及重写旧 Javascript 以使用 hasAttribute 之类的方法的解决方案。

我尝试(作为一个疯狂的猜测)添加this article 中提到的meta 属性,

<meta name=”google” value=”notranslate”>
<meta name=”google” content=”notranslate”>

但页面中的节点仍然有一个布尔值true translate 属性。

(如果重要的话,我这里说的是 Magento 的内联翻译系统)

【问题讨论】:

  • 您是否尝试将'notranslate' 类添加到您想要避免的元素中? support.smartling.com/entries/…
  • @B00MER 1. 那将是页面上的每个元素,所以不是。 2. 即使使用 class="notranslate",javascript 节点也存在并设置为 true。
  • api.jquery.com/propapi.jquery.com/attr 这些你能用吗? chrome 似乎没有添加任何属性。也许只是属性。
  • @akonsu 同样,为了回应我的帖子,我关心的不是找到替代导航/测试方法,而是找到一种让 Chrome 像其他浏览器一样工作的方法

标签: javascript html magento google-chrome xpath


【解决方案1】:

到目前为止,我能想到的最好方法是遍历页面中的每个 DOM 元素,定义一个 getter 来检查属性是否存在。 (Object.__defineGetter__ 保护子句确保在不支持现代 Javascript 的浏览器中不会出错)

if(Object.__defineGetter__)
{
    var hasTranslateAttribute = function(){
        return $(this).hasAttribute("translate");
    };
    document.observe("dom:loaded", function() {
        $$('*').each(function(theElement){
             theElement.__defineGetter__("translate", hasTranslateAttribute);
        });
    });
}

我尝试在Object.prototypeElement.prototype 上定义一个获取,但似乎浏览器的本机translate 被定义在更高的链上,因此您需要在每个元素的基础上重新定义事物。

【讨论】:

    【解决方案2】:

    将非标准属性translate 替换为data-translate 之类的属性,这几乎可以保证在HTML 规范和浏览器中保持未定义。 data-* attributes 是为了防止此类问题而发明的,它们也可以用来修复它们。

    【讨论】:

    • +1 以获得好的建议,但我特意寻找一种不涉及我在这个特定时刻重写遗留代码的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2015-06-18
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多