2012-03-03 42 views
0

假設我有這樣的代碼:更換Javascript代碼並運行它

my_script_data = document.getElementById("id_php_defer__core"); 
if (my_script_data == undefined) { 
    Alert(request.responseText); // all looks good! 
    my_script_data = document.createElement("script"); 
    my_script_data.setAttribute("id", "id_php_defer__core"); 
    my_script_data.innerHTML = 'function myinitfunc() { ' + "\n" + request.responseText + "\n" + ' }'; 
    to = document.head; 
    if (to != undefined) { 
    to.appendChild(my_script_data); 
    } 
} 
else { 
    Alert(request.responseText); // all looks good! 
    my_script_data.innerHTML = 'function myinitfunc() { ' + "\n" + request.responseText + "\n" + ' }'; 
    eval(my_script_data.innerHTML); 
} 

的「request.responseText」實際上是一個Javascript數組聲明與許多設定值。

上面的代碼之後,稍後調用「myinitfunc」。

(正如它應該只包含「request.responseText」全球(!)值的數組應該進行更新。)

然而,當代碼工作第一次運行,後續運行似乎什麼都不做,所以我做錯了什麼,但是什麼? :)

回答

1

<script>標籤不能回收。爲了解決這個問題,你決定使用eval

但是(當然在嚴格模式下),eval確實是not run in the current nor global scope。因此,聲明的功能不會顯示出來。

我強烈建議不要爲此使用eval。你說responseText包含一個數組。通過調整一下,你可以使用JSON來處理數據。

您還可以插入並通過以下方式刪除腳本元素:

var s = document.createElement('script'); 
s.appendChild(document.createTextNode(request.responseText)); 
//^Equivalent to a "global eval" 
(document.head || document.getElementsByTagName('head')[0]).appendChild(s); 
s.parentNode.removeChild(s); 
+0

本來我插入新的

0

你每次調用myinitfunc()時都試過eval()嗎?

+0

由於從看到的例子,我EVAL檢索響應文本時。你是否建議我嘗試innerHTML = eval(...)? – Tom 2012-03-03 20:29:11

+0

我其實並沒有嘗試你的代碼,但在我看來,它只是第一次工作,因爲你實際上評估過一次表達式,但每次之後它只是函數內的一些隨機文本而沒有任何意義。對不起,我的回答可能完全不正確,但是我頭腦中的第一件事就是。 – multimediaxp 2012-03-03 20:34:35