好吧,我知道這是2017年,4年後,但似乎jQuery團隊從來沒有打擾過解決這個問題,很好。我有同樣的問題,我認爲這是解決方案,在本地環境中使用getScript的實際預期方式。我注意到的是,在代碼的本地背景下,沒有辦法可以輕鬆評估代碼,而jQuery並不知道它如何實現。我還沒有深入,但如果你看看jQuery源代碼,它是如何將腳本注入到文檔中的,這是天才,它完全避免了eval。它因此運行的腳本就好像它是通過腳本標記導入的文件。沒有進一步的...
我已決定做相反的情況,它更好地解釋發生了什麼事情。然後,您可以將其轉換爲相關示例。
如果您發現getScript實際上在查詢字符串中向服務器發送唯一ID。我不知道他們爲什麼沒有在文檔中提到這一點。用它來識別返回的腳本。但是,你必須做在後端的東西...
let imports;
$.getScript("scripts.php?file=abc.js", (data, textStatus, jqXHR) => {
window[jqXHR.getResponseHeader('X-scriptID')](imports);
alert (imports.name);
});
abc.js:任何腳本,我們正在腳本
imports.name = 'fred';
後端套。PHP:
// code that gets the file from file system into var $output
$output = file_get_contents($_REQUEST['file']);
// generate a unique script function name, sort of a namespace
$scriptID = "__script" . $_REQUEST['_'];
// wrap the script in a function a pass the imports variable
// (remember it was defined in js before this request) we will attach
// things we want to become local on to this object in script file
$output = "window.".$scriptID."=function(imports) { ".$output." };";
// set the script id so we can find this script in js
header ("X-scriptID: " . $scriptID);
// return the output
echo $output;
什麼打算是,JS請求腳本通過getScript加入,但它並不直接要求它使用PHP腳本來獲取文件的內容的文件。我這樣做是爲了我可以修改返回的數據並附加用於標識返回腳本的標頭(這是一個大型應用程序,在這裏需要大量腳本)。
當getScript像往常一樣在瀏覽器中運行返回的腳本時,腳本的實際內容不會運行,只是使用唯一名稱__script1237863498或類似名稱聲明包裝函數(該編號由getScript在請求時給出之前的腳本),附加到全局窗口對象。 然後js使用該響應來運行包裝函數並將屬性注入到導入對象中,這些屬性成爲請求的任何範圍的局部。
這是否會與跨瀏覽器的AJAX請求一起工作? – 2013-03-04 00:25:43
我不明白爲什麼它不能,但安全可能是一個問題。 – Nuvolari 2013-03-05 10:44:47
正是我在找什麼 - 謝謝:D – Archer 2014-07-02 08:38:58