2017-08-11 144 views
1

我發送一個GET請求使用jQuery執行從jQuery的腳本GET請求

$.get("/index.html", /*Adding '?update' to the request*/ "update", 
function (data) {/* Enter code here */}, "html"); 

,其中數據是我的服務器的響應。我發回一個簡單的腳本,如alert(),所以'data'變量等於<script> alert("Hello world!") </script>

我需要一種方法來自動執行腳本。我可以.append(數據)到一個元素,但我有多個附加,所以這是不實際的。

什麼是執行腳本的最簡單和最實用的方法?

+1

最簡單的,但*不實用*在你的迴應擺脫''

2

我在這種情況下做了一些瘋狂的事情,但你可能認爲它是極端的。在我的情況下,我不得不在localStorage中存儲一些函數,並按歷史狀態執行它們(當用戶前後移動時)。我創建了一個json對象,類似於

{obj:'myObject', fn: 'myfn', args: myArgs} 

然後存儲這個數據base64編碼。然後當我需要回來,我只是解碼的內容和

window.[data.fn].[data.obj].apply(null,data.args)` 

的伎倆不會暴露太多的數據,而不是使用eval。 Eval來自邪惡,所以我會遠離。 =)

UPDATE

所以在我的情況下,所有主要的核心職能是在窗口的命名空間類似(而不是實際的內容,但一個樣品)

Member = { 
    initialize: function(){ 
      //some process 
    }, 
    render:function(memberId, selector){ 
      //Some process 
    }, 
    //...etc } 

所以,當我存儲的每個項目的JSON對象它,我用類似的東西來

var data = {obj: 'Member', fn: 'render', args: [1,'#member-block']} 

然後編碼版本將

localStorage.setItem('data', btoa(JSON.stringify(data))); 

dmFyIGRhdGEgPSB7b2JqOiAnTWVtYmVyJywgZm46ICdyZW5kZXInLCBhcmdzOiB7bWVtYmVySWQ6MSwgc2VsZWN0b3I6ICcjbWVtYmVyLWJsb2NrJ319

然後,當我需要再打

var data = JSON.parse(atob(localStorage.getItem('data')); 

會回到我原來的數據對象。由於我的情況下的主要功能是在窗口命名空間。

if (typeof window[data.obj]!=='undefined') { // same as window.Member 
    if (typeof window[data.obj][data.fn]!=='undefined' && typeof window[data.obj][data.fn]!=='function') { // make sure fn is defined and is a function 
      window[data.obj][data.fn].apply(null, data.args); 
      // we pass same arguments to function call with apply. 
      // `apply` will give us option to add arguments dynamically without knowing its size. 
      // it can be null any number of arguments that needed for that function. 
    } 
} 
+0

看起來像一個非常整齊的那裏,我會試試看。 – jidexl21

+0

但是請記住,如果您的參數包含任何類型的函數(如回調函數和其他函數),那麼它們將在JSON.stringify上消失以創建base64內容。以避免我使用'JSON.stringify(obj,function(data){})'並通過toString()方法將參數中的函數轉換爲字符串,並且在JSON.parse上做了同樣的處理。 –

+0

基於你的解決方案的一個簡單的方法是發送一個json響應和.apply來運行該函數,而且暴露點太多了。我認爲這將是OP需要的完美解決方案。但是不要介意解釋這個位窗口。[data.fn]。[data.obj] .apply(null,data.args) – jidexl21