2011-12-10 72 views
2

我需要将JavaScript代码(我无法控制)从URL加载到div中。 JavaScript代码是一堆document.write()语句。一旦document.write()语句完成执行后,我需要使用jQuery或JavaScript从div中提取结果文本,并将该文本用于其他内容。目前,我做以下的JavaScript加载到DIV:将JavaScript加载到Div中

$('body').append('<div id="mydiv" style="display: none"></div>'); 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = url; 
    $('#mydiv').append(script); 

我怎么会知道什么时候该文件撰写报表已经执行完毕,我可以safetly提取文本出来的div并使用它?或者,有没有更好的方法来做到这一点?

+0

使用计时器并检查'.html()'是否相同 – Blender

+0

[试试这个](http://stackoverflow.com/questions/2463460/run-a-javascript-function-on-script-load ) – hackartist

+0

hackartist:那篇文章有点相关,但也没有回答。 getScript函数不适用于我,因为它会将脚本加载到头部(因为它应该是这样)。 – stepanian

回答

0

document.write()加载文档后将清除您的文档并启动一个新文档。您不需要将document.write()转换为已存在的div,除非它包含在该div中的内联javascript,并在文档加载/呈现时加载。

所以,离开你两个选择:

1)您可以创建一个空的iframe和JS加载到iframe中,并让它呈现到该iframe。如果你没有JS的合作,你可能不得不轮询看看渲染何时完成。如果您正确创建iframe,则可以设置监视器来查看何时加载iframe。

2)您可以将JS内嵌到您的div中,它会在您的页面加载时呈现给您的div。这将需要烘烤div和脚本文件到您自己的网页HTML这样的:

<div id="renderTarget"> 
<script src="xxx.js"></script> 
</div> 

如果你这样做了,那么你会知道它做渲染做自己的文档时加载。

+0

看起来我会回到我的原始解决方案,这是您的答案中的项目2。我认为会有一个纯粹的JavaScript解决方案。第1项太头疼:) – stepanian

0

你可以做的是::

1)最初设定的股利框中默认的东西(零或空)

2)设置一个计时器,为500/1000 MS和检查文本的div从上次改变或没有改变。

3)如果文本仍然默认情况下,转到2

4)如果文本已更改和超时,以该值作为最终值,否则,转至2.

考虑到远程JS会做所有文字一次写入,即其间没有大差距document.writes

+0

这可能有用,但它不是很优雅。没有使用JavaScript或JQuery魔术的方法,我可以在JavaScript加载时调用回调方法吗? – stepanian

0

您应该看到jQuery.getScript()函数。

下面是从文档的例子:

$.getScript('ajax/test.js', function(data, textStatus){ 
    console.log(data); //data returned 
    console.log(textStatus); //success 
    console.log('Load was performed.'); 
}); 
+0

这将插入脚本到我认为的头部。 – stepanian

0
$.getScript('foo.js', function() { 
alert('foo.js was loaded, do something cool now'); 
}); 
1

我怎么会知道什么时候该文件撰写报表已经执行完毕,我可以放心地提取文本出来的div并使用它?

您的方法根本行不通。

如果DOM已经完成加载(如果您开始以编程方式操作它,可能会出现这种情况),那么它将处于关闭状态,因此调用document.write将首先调用document.open,这将擦除整个文档。

(如果DOM尚未完成加载,则内容将被写入到文档末尾而不是插入脚本的位置)。

+0

所以唯一的选择是在第一次加载文档时让脚本标记位于div的开始处?这是我的第一个解决方案,它的工作。但我想以编程方式完成整个事情。 – stepanian

+0

您可以使用'document.write'来编写外部脚本。但是现在你有两个问题! iframe解决方案在这里确实是最好的解决方案。 –

2

您可以设置中,将眼前这个(在这个例子中,它被称为test2.html)的HTML页面

<script type="application/javascript" src="<url of JavaScript>.js"></script> 

您可以在此页面,然后加载到iframe中的DOM和附加load事件处理程序,得到加载完成后的页面内容。那么这个例子还删除从DOM :

$(function() { 

    //append the iframe onto the body, then select it and attach an event handler for the `load` event 
    $('body').append('<iframe id="myiframe" style="display: none"></iframe>').children('iframe').on('load', function() { 

       //set the html of the `mydiv` element to the body of the loaded page (test2.html) 
     $('#mydiv').html($(this).contents().children().children('body').html()); 

       //remove the iframe from the DOM 
     $(this).remove(); 

     //set the source of the iframe after the `load` event handler is setup to make sure it fires properly 
    }).attr('src', 'test2.html'); 
}); 

这里是一个演示:http://apexeleven.com/stackoverflow/document.write/test.html

注意.on()在jQuery的1是新的。7,在这种情况下与.bind()相同。

+0

有趣。让我看看这个。谢谢。 – stepanian

+0

它看起来像(没有尝试它),这将实际上工作。但我最初的解决方案是在原始HTML文档的div内部使用JavaScript,然后通过jQuery将其提取出来。该解决方案工作,但很混乱。这一个更混乱:)我会给你+1,因为从技术上讲,这是一个解决方案。 – stepanian