2010-06-02 54 views
4

我正在编写一个依赖外部JavaScript文件(我无法控制)的网页,该文件通过使用document.write来返回数据。有没有办法在不覆盖整个文档的情况下动态调用函数?这里是最简洁的代码,我能想到的:控制来自第三方的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内调用?

感谢您帮助

回答

5

在页面完成渲染后使用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中插入新的<script>标签),请记住该操作是异步的,并且您需要观察DOM才能知道何时可以安全地恢复旧版本的document.write

+1

'innerHTML'是一个属性,而不是一个方法。 – 2010-06-02 16:39:30

+0

这做得非常好。它不得不通过脚本标记加载外部JS,并且需要一段时间来确定何时恢复document.write。 对于那些想知道的人:我意识到被调用的document.write必然意味着脚本已经完成,所以如果您在getElementById行的下面添加document.write = old_dw,它将恢复旧的document.write,并且没有过程 - 吃循环需要。 @friedo - 再次感谢 – Phil 2010-06-02 18:33:51

+0

@Tim谢谢,我会解决它。我习惯于使用jQuery的'html()'方法 – friedo 2010-06-02 18:52:18

2

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

bezen.domwrite.js - 捕获文件撰写和writeln外部脚本的页面加载后的安全装载。

+1

这可能会工作,但需要添加另一个脚本,所以我去了上面的答案。感谢您的帮助,虽然 – Phil 2010-06-02 18:35:43