删除Chrome的“翻译” DOM属性(Removing Chrome's “transla

2019-08-02 01:50发布

我与一些旧代码,其中的原始开发者所做的名为非标准属性来生成HTML DOM节点的大量使用工作translate

<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]');
}

我试图解决的问题是,它似乎是谷歌浏览器会自动添加一个translate属性添加到文档中的每个DOM节点,而这个DOM节点的值是一个布尔值true 。 您可以通过运行Chrome的JavaScript控制台下面的JavaScript看到这

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

反正是有让Chrome 填充这些属性? 它们的存在wrying浩劫与遗留代码。 PrototypeJS的matchup的节点处理这些布尔对象属性火柴,而我负责的是专门找DOM的代码名为翻译的属性节点。 我想找到我的问题,不涉及改写旧的Javascript功能来使用类似的方法解决hasAttribute

我尝试(如胡乱猜测)将meta中提到的属性这篇文章 ,

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

但在页面的节点仍然有一个布尔true转换属性。

(如果它很重要,这是Magento的我谈论在线翻译系统在这里)

Answer 1:

最好的我已经能够拿出这么远是通过每一个DOM元素会在页面中定义一个检查属性的存在吸气。 (该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被定义越往上链,所以你需要重新定义每个元素的基础上的东西。



Answer 2:

更换非标准属性translate通过类似属性data-translate ,这是几乎可以肯定是在HTML规范,并在浏览器中仍然不确定。 该data-*属性被发明出来,以防止这样的问题,他们也可以用来解决这些问题。



文章来源: Removing Chrome's “translate” DOM Property