1

我刚刚发现在 chrome 中创建的脚本标签 id 都存储在 window 对象上。

<script id="deploy" type="text/html">blah</script>

window.deploy= ➜

<script id="deploy" type="text/html">blah</script>

Object.keys(window)不包括“部署”

显然不是一个新问题

所以我的问题

有没有人找到解决方案(防止铬污染我的世界)我想出的唯一方法是:-

$('script[type="text/html"]').each ->
# stuff
delete window[@.getAttribute 'id']

我的“解决方案”在不在 chrome 中时有删除全局变量的风险。

但是,如果没有我的解决方案,如果脚本 id 冲突,chrome 可以覆盖全局变量。

真是一团糟!

任何帮助表示赞赏!

4

2 回答 2

4

如果您在 HTML 文档中使用该id属性命名一个元素,并且 Window 对象还没有该名称的属性,则 Window 对象被赋予一个不可枚举的属性,其名称是该id属性的值,其值是 HTMLElement表示该文档元素的对象。

(由我强调)

来源:JavaScript:权威指南,第 6 版

于 2012-08-31T10:14:31.830 回答
1

我想出了什么:

<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
    <script id="deploy" type="text/html">blah</script>
    <script type="text/javascript">
        $(function () {
            $('script[type="text/html"]').each(function (index, element) {
                var id = $(element).attr('id');

                console.log(element);
                console.log(window[id]);

                if (window[id] === element) {
                    window[id] = undefined;
                }

                console.log(window[id]);
            });
        });
    </script>
</head>
<body>

</body>
</html>

这会在删除之前检查全局是否与节点相同。

请注意,每个 ID 都会发生这种情况,而不仅仅是script标签。正如 Yoshi 所说,它不应该污染您的全球范围,但上述解决方案应该适合您。

于 2012-08-31T10:13:52.573 回答