jsonp回调中的document.write

时间:2011-12-28 13:25:46

标签: javascript dom javascript-events cross-domain

我正在使用脚本标记hack和jsonp进行跨域请求。在回调函数中,我想使用document.write()将接收到的数据写入DOM。

我知道我应该使用appendChild / innerHTML而不是doc.write()。我的约束是我没有一个类/ id挂钩到我想写的元素。我只能依靠document.write()来编写“就地”。

以下代码包含在脚本标记中的HTML div中:

function request_jsonp(){
var script = document.createElement('script');
var server_path = 'http://somedomain.com/?q=querystring&callback=request_callback';
script.setAttribute('src', server_path);
document.getElementsByTagName('head')[0].appendChild(script);
console.log('data requested');
// document.write('hello world'); // this gets written
}


function request_callback(data){
    console.log('data received');
    document.write(data);
}


 request_jsonp();

 window.onload = function(){
     console.log('onload fired');
 }


/* 
above code prints

data requested
data received
onload fired
*/

基本上,即使回调函数中包含静态字符串,document.write也不起作用。我认为如果在onload之前调用docment.write,它会在页面中插入文本here JavaScript and HTML Script Tags

什么阻止document.write()写入DOM?另外,有没有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

您应该注意document.write();调用隐式document.open();,因此,实际上,清除了目前为止您在文档中拥有的所有内容。 使用document.write(); 内容添加到文档是不可能的。但是,可以使用document.write();来编写整个文档。

您有几种可能的解决方案:

  • 您可以将目标元素作为GET参数传递,如@kirilloid所述。
  • 您可以在所需位置插入IFrame对象,并使用myIFrame.document.write();更新其内容。

这基本上是因为您正在更新作为脚本代码父级的容器的内容,因此尚未关闭。

不管怎样,或者我完全偏离这里,让我们面对它,完全有可能。 ; - )