2010-03-07 28 views
1

我用AJAX發送GET數據到另一個file.And在另一個文件我有echo "<script>alert('Something');</script>";。這是動態地使用AJAX顯示,即如何使用innerHTML在AJAX中執行包含JS的頁面?

var ajaxDisplay = document.getElementById('edit'); 
ajaxDisplay.innerHTML = ajaxRequest.responseText; 

<script>alert('Something');</script>DIV與名編輯。 但它沒有提醒任何事情。 如何讓它工作?

我混合了html/javascript。 這是代碼。

function ajaxFunctions(){ 
    var ajaxRequest; // The variable that makes Ajax possible! 

    try{ 
     // Opera 8.0+, Firefox, Safari 
     ajaxRequest = new XMLHttpRequest(); 
    } catch (e){ 
     // Internet Explorer Browsers 
     try{ 
      ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); 
     } catch (e) { 
      try{ 
       ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
      } catch (e){ 
       // Something went wrong 
       alert("Your browser broke!"); 
       return false; 
      } 
     } 
    } 
    // Create a function that will receive data sent from the server 
    ajaxRequest.onreadystatechange = function(){ 
     if(ajaxRequest.readyState == 4){ 
      var ajaxDisplay = document.getElementById('edit'); 
      ajaxDisplay.innerHTML = ajaxRequest.responseText; 
     } 
    } 


    var namef = document.getElementById('nameed').value; 
    var queryString = "?namef=" + namef; 
    ajaxRequest.open("GET", "try.php" + queryString, true); 
    ajaxRequest.send(null); 

} 

也許找到腳本標籤和EVAL呢? 但是如何找到腳本的標籤?

+1

我重新發布了你的帖子。它跟jQuery沒有任何關係:) – 2010-03-07 09:17:27

回答

0

它看起來像設置innerHTML的唯一目的是試圖讓JS執行。但是一旦頁面被加載,JS就不會'知道'它需要分析和執行你改變的新文本,所以你的方法將無法工作。在這種情況下,你想要的是一個回調函數:

http://api.jquery.com/jQuery.ajax/

我沒有使用jQuery的,但它看起來像你只需要添加一個「完整的」屬性設置對象,你傳遞給.ajax()調用,如下所示:

$.ajax({ 
    // ...... 

    complete: function(){ 
    alert('Something'); 
    } 

    // ...... 
}); 

在這種情況下,一旦ajax調用完成,就會執行回調函數。如果您需要將代碼附加到不同的事件中,您可以選擇其他事件,例如成功,失敗等等。

+0

我不想使用jQuery.I已經嘗試過ii。 – 2010-03-07 09:02:20

+0

啊,我發佈之前你編輯過,我假設你正在使用jQuery ajax庫。無論如何,我想我誤解了這個問題,問題是你不知道你需要執行什麼JS代碼,直到服務器爲你生成它爲止?如果可以從服務器接收到有限數量的響應,則可以讓服務器返回一個短字符串,然後在處理程序中將其打開 - 如果您需要執行任意JS,我想您可以調用eval()它,但我會非常小心。 – 2010-03-07 09:04:18

+0

它不會是一個商業網站。但如何找到腳本標籤並評估它們? – 2010-03-07 09:07:27

1

,而不是試圖注入DOM中的腳本元素,只需要你的腳本返回:

alert('Something'); 

然後用eval(response);運行它。或者,您可以添加一個腳本元素,其src屬性指向將您的JavaScript返回到<head>(這是首選方法)的頁面。

function loadScript(url) { 
    var head = document.getElementsByTagName("head")[0]; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = url; 
    head.appendChild(script); 
} 

請記住,這不適用於跨域請求 - 腳本必須與運行代碼的頁面具有相同的來源。爲了解決這個問題,你必須使用回調。

+0

它不僅是JS.It是混合html和js – 2010-03-07 09:09:46

+0

我想用replace,但是如何? – 2010-03-07 09:15:35

0

但是如何找到腳本標籤?

那麼,parent.getElementsByTagName('script')然後評估文本節點裏面的data將做到這一點。

但是,插入包含腳本標記的內容是不可靠的,並且在不同瀏覽器中的工作方式略有不同。例如。 IE首次將腳本節點插入文檔中的任何父節點時執行腳本,而Firefox將在第一次將包含腳本的子樹添加到文檔內的節點時執行腳本。所以如果你不是非常小心,你可以在某些瀏覽器上執行兩次腳本,或者在錯誤的時間執行腳本,然後進行進一步的頁面操作。

所以不要。將要單獨執行的腳本返回到任何HTML內容,例如。使用同時包含HTML和JavaScript的JSON對象。

+0

\t ajaxRequest.send(null);我把 var justexit = document.getElementsByTagName('script'); eval(justexit); 但它不再工作? – 2010-03-07 09:32:04

+0

'getElementsByTagName'返回'NodeList'。你必須遍歷每個'script'元素內的'Text'節點的'data'列表和'eval'。再次,不要這樣做。 – bobince 2010-03-07 10:39:29

相關問題