2011-12-28 52 views
0

我正在使用腳本標記hack和jsonp進行跨域請求。在回調函數中,我想使用document.write()將接收到的數據寫入DOM。document.write in jsonp callback

我知道我應該使用appendChild/innerHTML而不是doc.write()。我的約束是我沒有一個class/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 
*/ 

基本文件撰寫甚至不與回調函數內的靜態字符串工作。我認爲如果在onload之前調用docment.write,它會在頁面中插入文本here JavaScript and HTML Script Tags

什麼是阻止document.write()寫入DOM?另外,有沒有更好的方法來做到這一點。

+0

「我沒有一個class/id掛鉤到我要寫入的元素。」 - 然後通過GET參數的jsonp發送它。 – kirilloid 2011-12-28 13:29:39

+0

我想我沒有說清楚。要通過GET發送,首先需要在元素上存在一個id/class。 – Yogesh 2011-12-28 14:12:56

+0

您可以在所有其他元素中只使用一個索引,例如:'Array.prototype.indexOf.call(document.getElementsByTagName('*'),element)' – kirilloid 2011-12-28 14:48:06

回答

1

您應該注意document.write();調用了一個隱含的document.open();,因此實際上清除了目前爲止在文檔中的所有內容。 使用document.write();添加到內容是不可能的。但是,可以使用document.write();編寫整個文檔。

您有幾種可能的解決方案:

  • 您可以通過目標元素作爲GET參數,如@kirilloid指出。
  • 您可以在所需位置插入IFrame對象,並使用myIFrame.document.write();來更新其內容。

這基本上是因爲您正在更新作爲腳本代碼父級的容器的內容,因此尚未關閉。

要麼是這樣,要麼我完全偏離了這裏,讓我們面對它,完全有可能。 ;-)

+0

「您可以在所需的位置插入IFrame對象」我如何做這個?我沒有一個id/class鉤子在我需要插入iframe的父div。基本上我想說this.parentNode.appendChild(myIFrame) – Yogesh 2011-12-28 15:46:04

+0

你說得對。如果不知道目標元素,這是行不通的。您可以隨時在包含的腳本文件中包含'document.write();'的代碼。 這樣,直到容器關閉後,寫入塊纔會被執行。 – 2011-12-29 11:48:53

+0

還應該注意的是,您的回調函數駐留在JSONP模式的客戶端,因此應該知道您通過JSONP創建的頁面的細節。如果沒有,你應該修改你的設計。 – 2011-12-30 20:20:34