控制来自第三方的 document.write 调用的范围

Posted

技术标签:

【中文标题】控制来自第三方的 document.write 调用的范围【英文标题】:Controlling the scope of a document.write call coming from a third party 【发布时间】:2011-02-26 22:09:29 【问题描述】:

我正在编写一个依赖于外部 javascript 文件(我无法控制)的网页,该文件通过使用 document.write 来返回数据。有没有办法在不覆盖整个文档的情况下动态调用函数?这是我能想到的最简洁的代码:

<html>    
<head>
<script type="text/javascript">
    function horriblefunction () 
        document.write("new text");
    
</script>
</head>

<body>
Starting Text...
<div id="pleasewriteinme"></div>
Other text...
<button onclick="horriblefunction();">Click</button>
</body>
</html>

这个想法开始于不改变“horriblefunction()”(因为它是外部的)新文本可以放在 div 中而不是覆盖页面。这是可能的还是必须在创建页面时在 div 内调用该函数?

感谢您的帮助

【问题讨论】:

【参考方案1】:

在页面完成渲染后使用document.write 的唯一方法是暂时用您自己制作的函数替换该函数,该函数会将内容推入一个div。例如

function horriblefunction()  
    var old_dw = document.write;
    document.write = function(text)  
        document.getElementById( 'some_div' ).innerHTML = text;
    

    // now call your external JS function that uses document.write

    document.write = old_dw;

只要外部 JS 已经加载并且您只是在调用一个函数,这将起作用。如果您需要加载 JS(例如,通过在 DOM 中插入新的 &lt;script&gt; 标记)请记住该操作是异步的,您需要观察 DOM 以了解何时可以安全恢复旧版本的 @ 987654324@。

【讨论】:

innerHTML 是一个属性,而不是一个方法。 这项工作做得非常出色。它确实必须通过脚本标签加载外部 JS,并且需要一段时间才能确定何时恢复 document.write。对于那些想知道的人:我意识到 document.write 被调用必然意味着脚本已经完成,所以如果你在 getElementById 行下方添加 document.write = old_dw 它会恢复旧的 document.write 并且没有进程消耗循环需要。 @friedo - 再次感谢 @Tim 谢谢,我会解决的。我已经习惯使用 jQuery 的 html() 方法【参考方案2】:

尝试使用来自http://bezen.org/javascript/index.html的动态脚本加载

bezen.domwrite.js - 捕获 document.write 和 writeln 以在页面加载后安全加载外部脚本。

【讨论】:

这可能会起作用,但需要添加另一个脚本,所以我选择了上述答案。不过感谢您的帮助

以上是关于控制来自第三方的 document.write 调用的范围的主要内容,如果未能解决你的问题,请参考以下文章

关于document.write(来自网络)

循环的嵌套

使用可能包含 document.write 的 src 动态添加脚本标签

使用可能包含 document.write 的 src 动态添加脚本标签

Redux 在 document.open() 之后没有注册操作

java之运算符和控制语句