1

如果脚本包含:

document.write("<iframe>ads here</iframe>");

如果它在请求加载页面之前包含在 html 中,它可能看起来像这样:

<html>
<!-- stuff !-->
<div><script src="document_write.js" type="text/javascript"></script></div>
<body>
</html>

使用与上面类似的代码加载 html 页面将导致<iframe>被放置在<div>包含脚本的标签中。如果在document.write()页面加载后调用,它将覆盖整个页面。

Chrome 扩展程序的内容脚本也会用 覆盖页面document.write或使其崩溃 - 取决于页面生命周期中的调用时间。

有没有办法插入包含document.write()在 Chrome 内容脚本中的脚本?

4

1 回答 1

2

当我在我的 ajax 网站上使用一些转换跟踪脚本时,我遇到了同样的问题。我最终覆盖了 document.write,从而解决了问题。

$(document).ready(function() {
    document.write = function(str) {
        var moz = !window.opera && !/Apple/.test(navigator.vendor);
        if (str.match(/^<\//))
            return;
        if (!window.opera)
            str = str.replace(/&(?![#a-z0-9]+;)/g, "&amp;");
        str = str.replace(/<([a-z]+)(.*[^\/])>$/, "<$1$2></$1>");
        if (!moz)
            str = str.replace(/(<[a-z]+)/g, "$1 xmlns='http://www.w3.org/1999/xhtml'");
        var div = document.createElementNS("http://www.w3.org/1999/xhtml", "div");
        div.innerHTML = str;
        var pos;
        if (!moz) {
            pos = document.getElementsByTagName("*");
            pos = pos[pos.length - 1];
        } else {
            pos = document;
            while (pos.lastChild && pos.lastChild.nodeType == 1)
                pos = pos.lastChild;
        }
        var nodes = div.childNodes;
        while (nodes.length)
            pos.parentNode.appendChild(nodes[0]);
    };
});
于 2013-11-18T15:09:48.590 回答