2013-02-24 94 views
4

從我讀過的JQuery的getScript函數使用名爲'global eval'的函數在全局上下文中加載腳本文件。是否有一個特定的設置或方法來改變這個,所以它會加載我調用它的函數?getScript本地加載而不是全局?

如果我做了下面的代碼名稱返回undefined,因爲它沒有在本地上下文中加載腳本。

function callscript(){ 
     var name='fred'; 
    getScript(abc.js); 
    } 

//abc.js: 
alert(name); 

回答

5

我相信我已經找到了使用常規jQuery ajax調用的解決方案。訣竅是你將數據類型設置爲'text',否則如果它的腳本或者使用getScript或替代.get(),它會自動運行腳本並將其放置在全局上下文中。

function abc(){ 
    var msg="ciao"; 
    $.ajax({ 
     url: 'themes/_default/system/message.js', 
     success: function(data){ 
      eval(data); 
     }, 
     dataType: "text" 
    }); 
    } 
    //message.js 
(function() { 
    alert(msg); 
})(); 

此警報「僑」預期:)

人之前說什麼是我使用eval但其在這種情況完全正常。

+0

這是否會與跨瀏覽器的AJAX請求一起工作? – 2013-03-04 00:25:43

+0

我不明白爲什麼它不能,但安全可能是一個問題。 – Nuvolari 2013-03-05 10:44:47

+0

正是我在找什麼 - 謝謝:D – Archer 2014-07-02 08:38:58

-2
// global.js 
var global1 = "I'm a global!"; 

// other js-file 
function testGlobal() { 
    alert(global1); 
} 
-2

我不知道的jQuery實現,但name將返回undefined的原因是因爲namecallscript對象的私有財產。否定這一點,你可以聲明變量的函數調用的外部:

var name = ''; //Declare name outside of the function 
function callscript(){ 
    name='fred'; 
    getScript('abc.js'); //Shouldn't it be $.getScript? and argument should be passed as a string 
} 

//abc.js: 
console.log(name) //Returns undefined 
callscript(); //Call the script 
console.log(name); //Returns "fred" 
1

正如你已經注意到了,沒有什麼在這方面的文檔。我仔細檢查了源代碼,發現底層調用沒有選項供您傳遞以覆蓋此行爲。

// http://code.jquery.com/jquery-1.9.1.js 
... 
getScript: function(url, callback) { 
    return jQuery.get(url, undefined, callback, "script"); 
}, 
... 

據我所知,將腳本異步加載到本地作用域是不可能的與jQuery。 jQuery的API不會給你任何其他方式來配置它的用法。

我仍在研究如何使用其他技術。

0

好吧,我知道這是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使用該響應來運行包裝函數並將屬性注入到導入對象中,這些屬性成爲請求的任何範圍的局部。

相關問題