我正在通過HTTP調用我的數據庫。由於它與我的應用程序不在同一臺服務器上,因此我正在使用JSONP。所以每次我想從我的數據庫查詢信息時,我的JavaScript函數會向DOM樹添加另一個腳本標記。當我的應用程序運行一段時間後,源代碼充斥着SCRIPT標籤。每次我使用JSONP撥打電話時,是否必須創建一個新的SCRIPT標籤?
這只是我不得不接受與JSONP一起工作還是有其他解決方法?
我正在通過HTTP調用我的數據庫。由於它與我的應用程序不在同一臺服務器上,因此我正在使用JSONP。所以每次我想從我的數據庫查詢信息時,我的JavaScript函數會向DOM樹添加另一個腳本標記。當我的應用程序運行一段時間後,源代碼充斥着SCRIPT標籤。每次我使用JSONP撥打電話時,是否必須創建一個新的SCRIPT標籤?
這只是我不得不接受與JSONP一起工作還是有其他解決方法?
是的,這只是JSONP的一個問題。您可以將onload
處理程序附加到script
元素以在完成時對其進行清理(對於IE,爲onreadystatechange
)。
或者,既然你控制了兩臺服務器,你可以使用CORS。這比JSONP少得多,並提供了XMLHttpRequest
的靈活性。
這取決於瀏覽器,但一般來說,是的。你必須添加一個新的腳本標籤。但是,您可以在腳本加載後刪除腳本dom元素。如果您使用的是jQuery,它會爲您處理這個問題 - 您需要使用這種方法來執行此操作,這與瀏覽器有關。
如果您使用的是Visual Studio,即使腳本被移除,您仍然會在調試器中看到對該腳本的引用。據我所知,在生產模式下,這並不意味着有「泄漏」。
是的。 jQuery爲你處理這個並且非常容易使用。 – 2012-03-11 17:51:51
當我收到JSONP響應時,我刪除script
標記。例如:
function makeJSONPRequest() {
var script = document.createElement('script');
var callbackName = 'callback' + (+new Date()) + '_' + Math.floor(Math.random() * 10000);
script.type = 'text/javascript';
script.src = 'http://www.example.com/jsonp?callback=' + callbackName;
window[callbackName] = callback;
document.head.appendChild(script);
function callback(data) {
delete window[callbackName];
document.head.removeChild(script), script = null;
console.log(data);
}
}
幾乎可以肯定有更好的方式去做這件事。你可以發佈一些代碼嗎? – 2012-03-10 22:34:31