2012-05-15 75 views
0

在頁面加載我打電話給函數LinkPages(),並將要將其HTML添加到一個DIV。XMLHttpRequest和調用Javascript

MasterPage.aspx

function LinkPages() 
    var xmlhttp; 
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp = new XMLHttpRequest(); 
    } 
    else {// code for IE6, IE5 
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
    alert(xmlhttp.responseText); 
    } 
    } 
    xmlhttp.open("GET", "Page1.aspx", true); 
    xmlhttp.send(); 
    } 

,我跑進問題是Page1.aspx的也有功能的GetMessage一個XMLHttpRequest,它永遠不會被調用。 GetMessage()爲 假設在Page1.aspx上設置範圍的innerHTML,但它不被調用。

Page1.aspx的

function GetMessage() 
    var xmlhttp; 
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp = new XMLHttpRequest(); 
    } 
    else {// code for IE6, IE5 
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     document.getElementById("lblMessage").innerHTML = xmlhttp.responseText; 
    } 
    } 
    xmlhttp.open("GET", "wfrmHelper.aspx?action=message", true); --returns string 
    xmlhttp.send(); 
    } 

是否有可能調用JavaScript在了XMLHttpRequest在網頁上?

+0

.NET現在帶有jQuery。爲什麼你在做XHR很難? –

+0

你在哪裏調用GetMessage()函數?一旦Page1.aspx完成加載,您將不得不這樣做。 – lbstr

+0

我使用的是XHR,因爲在這個項目的構建中,我們沒有在網頁上使用jQuery並使用moo工具。 – user1167466

回答

0

在你第一次使用MasterPage.apsx的XHR中,你正在調用服務器並獲取一些HTML(我猜這個Javascript GetMessage是混合在那個頁面上的)。除非您將XHR的responseText附加到文檔中,否則JavaScript將永遠不會被評估。因此......在LinkPages()中,您需要將XKR調用的響應添加到文檔中,然後GetMessage函數將由瀏覽器進行評估。在添加之前,它只是內存中的一個字符串。在將它放在DOM上之前,它實際上並沒有轉化爲腳本。我希望這是有道理的。

-1

回覆:是否可以在XMLHttpRequest的響應頁面中調用javascript?

是的,但當您將響應添加到頁面時,它不會自動發生。

相反,您需要在響應中找到腳本,然後調用每個腳本。

更好的是響應包含兩個部分:一個用於html,一個用於執行腳本。例如,響應將在一個JSON結構兩個屬性:

{'html': '<div>blah blah....', // the html part of the response 
    'js': 'the javascript....'} // the javascript that you want to execute 

此外

  • 您還需要考慮如果傳入的JS取決於你需要加載任何庫。新的庫腳本可以在運行時添加。
  • 直接調用xmlhttprequest是一個非常糟糕的主意。使用jQuery或其他庫作爲中間件。

新增

爲什麼這是一個壞主意,叫XMLHttpRequest的直接:

  1. 錯誤。你必須編寫更多的軟件(與使用庫相比)。更多sw ==更多的錯誤,更多的維護等等。一個壞主意。
  2. 測試。您的軟件必須變成依賴於功能或依賴於瀏覽器。無論哪種方式,您的代碼都比依賴於許多人/應用程序正在使用的經過良好測試和支持的庫更脆弱。圖書館的廣泛使用可以保證它在瀏覽器發生變化時能夠繼續正常運行。
  3. 可維護性。您的附加軟件(處理不同的瀏覽器案例)使維護人員比使用標準庫的軟件更長時間瞭解和更新。
  4. 費用。更多的錯誤,更少的測試和更多的維護困難意味着您的軟件隨着時間的推移將花費比使用標準庫的sw更多的費用。
  5. 虛假經濟。你有很多JS庫的選擇。如果下載大小有問題,您可以使用更完整的(更大)或更小,更輕的庫。 (並注意我說應該使用lib,我當然沒有說需要使用jQuery。)
  6. 重複的代碼。目前庫很常見,lib已經被頁面加載或者可以從瀏覽器緩存加載的可能性非常好。在任何一種情況下,使用非庫代碼將佔用比使用lib更多的空間/時間。

總之,不使用標準庫的唯一原因是如果你是一名學生,並且該作業禁止使用庫。

我看不到任何理由讓熟練的開發人員不使用lib來覆蓋Ajax調用的瀏覽器不兼容性。如果您不同意,請提供意見。

+1

-1可以自由地說你更喜歡jQuery,但是不要說「直接調用xmlhttprequest是一個非常糟糕的主意」 – Christophe

+0

請參閱我的答案。 –

0

在你的情況,一個iframe可能會工作得更好:

<iframe src="Page1.aspx" onload="LinkPages()"></iframe> 

如果你喜歡一個XMLHttpRequest,那麼你就需要找到一種方法,你得到的迴應後運行該腳本,如@解釋aaronfrost。像jQuery這樣的庫會爲你做(如果你使用jQuery.load,jQuery有一個可以運行腳本的globalEval函數)。