文档.写jsonp回调

document.write in jsonp callback

本文关键字:回调 jsonp 文档      更新时间:2023-09-26

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

我知道我应该使用appendChild/innerHTML代替doc.write()。我的约束是我没有一个类/id挂钩到我想写的元素。我只能依靠document.write()来写"在适当的地方"。

下面的代码包含在script标签的HTMLdiv中:

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不工作,即使在回调函数内的静态字符串。我认为如果document.writeonload之前被调用,它会在页面中插入文本,如这里所述JavaScript和HTML脚本标签

是什么阻止document.write()写DOM?还有,是否有更好的方法来做到这一点?

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

你有几个可能的解决方案:

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

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

要么是这样,要么就是我完全偏离了轨道,让我们面对现实吧,这完全有可能。: -)