2012-05-29 43 views
0

我試着製作一個Firefox插件,它在Javascript中運行XMLHttp請求。我想從這個請求中獲取數據併發送給* .body.innerhtml。XMLHttpRequest接收沒有數據或只是「undefined」

這是到目前爲止我的代碼...

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://xx.xxxxx.com", true); 
xhr.send(); 
setTimeout(function() { set_body(xhr.responseHtml); }, 6000); 

不是接收的數據,我得到「未定義」。如果我將xhr.responseHtml更改爲responseText,我什麼也得不到。我不知道爲什麼我什麼也得不到。我正在使用Firefox 12.0開發Ubuntu 12.04 LTS。

如果您需要腳本的更多細節,請詢問!

更新:

set_body功能

document.body.innerHTML = ''; 
document.body.innerHTML = body; 
document.close(); 

回答

3

更新解決:

我不得不確定(xhr.open後右)RequestHeaders:

xhr.setRequestHeader("Host", "xxx"); 

對於以下項目:主機,起源和引用站點。所以看起來相同的原產地政策確實存在問題。

但現在它工作!謝謝大家!

1
當你設置的開放最後參數去真正你所要求的異步事件

。所以,你需要添加一個回調到XHR像這樣:

xhr.onReadyStateChange = function(){ 
    // define what you want to happen when server returns 
} 

當服務器響應時被調用。要在沒有異步的情況下測試它,請將第三個參數設置爲false。然後send()會阻塞並等待,直到響應返回。設置6秒的任意超時並不是正確的處理方法。

+0

'var xhr = new XMLHttpRequest(); xhr.open(「GET」,「http://w69b-groove.appspot.com」,true); xhr.onReadyStateChange =函數(){ 如果(xhr.readystate == 4 && xhr.status == 200){ \t \t \t \t \t \t set_body(xhr.responseText,DOC); \t \t \t } else { alert('Connection didnt work ...'); } } \t xhr。發送();' 我改變了它,但它不工作... – pounty

+0

你在什麼瀏覽器? XMLHttpRequest在IE中不起作用。當你說它「不起作用」時,你究竟看到了什麼? –

+0

正如我上面提到的,我使用的是FF 12.0。 我只是看到我的「連接...」文本。它正好在XMLHttpRequest – pounty

1

此代碼應工作:

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
    set_body(xhr.responseText); 
    } 
}; 
xhr.open("GET", "http://xx.xxxxx.com", true); 
xhr.send(); 

確保你正在從URL http://xx.xxxxx.com正確的反應。跨域調用可能存在問題。如果您在域http://first.com上有一個頁面,並且您嘗試從域http://second.com執行XMLHttpRequest,則Firefox將自動失敗(不會有錯誤消息,無響應,無任何內容)。這是防止XSS(跨站點腳本)的安全措施。

無論如何,如果你從chrome://協議做XMLHttpRequest,它被認爲是安全的,它會工作。所以請確保您使用此代碼並從您的插件發出請求,而不是從您的本地主機或類似的東西。

+0

非常感謝您的回答!我實施你的解決方案。但似乎是我遇到了跨域錯誤。它只是靜靜地離開「接通......」,我的網絡插件不會引發任何新的請求。我從example.com打電話,但是我要求從req.example2.com。我怎樣才能管理從我的插件做HTTP請求? (正如你提到的'chrome://') 關注 – pounty

+0

根據我的經驗,做跨域請求的最簡單方法是在你的服務器上創建一個透明代理。例如,http://example.com/ajax/?test=something上的每個請求都會從http://example2.com/?test=something獲取內容,並且無需更改即可返回。 – Fczbkk

+1

@pounty:Firefox擴展沒有同源限制。除非您的代碼在內容腳本中運行,否則您應該可以進行跨域請求。 –