javascript
  • xmlhttprequest
  • response
  • 2012-02-02 40 views 2 likes 
    2

    通過Javascript請求,XMLHttpRequest響應一些額外的Javascript,需要添加到頁面的請求頁面。執行使用包含腳本標記的XMLHttpRequest編寫的Javascript嗎?

    使用eval(),如果響應是一樣的東西:

    alert('This is the js response'); 
    

    ......那麼這工作得很好。

    但是,文本返回可能是這個樣子:

    <script language="javascript">var checkVar='checkVar: value 1';</script> 
    

    ,但最有可能的:

    <script src="http://www.somesite.com/setCheckVarValue.js"></script> 
    

    ...其中附加的JS需要在頁面上加載。

    我確保XMLHttpRequestsynchronous,因爲我想在此之後引用checkVar。

    所以:

    <script type="text/javascript" src="http://www.mysite.com/addJSToPage.js" /> 
    // at this point, since this is a synchronous call, page processing waits 
    // until the response is received that needs to include the additional JS 
    // to load; this, for testing sets the value of checkVar 
    
    <script type="text/javascript" > 
        alert(checkVar); 
    </script> 
    

    警報消息應閱讀 「checkVar:值1」。

    由於其他原因,這不僅僅如設置var checkVar in addJSToPaged.js一樣簡單,所以我不在尋找那種推薦。

    我使用alert(checkVar)只是作爲一個測試,以確保在響應中通過JS設置了一個值。

    我想我可以去掉開始和結束的腳本標記,並保持這種做法。但是,我想知道是否有任何解決方案支持我所尋找的?

    謝謝。

    UPDATE

    繼普拉香特的建議,在addJSToPage.js我說:

    var dynamicElement = document.createElement('div'); 
    

    然後從XMLHttpRequest的響應,我所做的:

    dynamicElement.appendChild = xmlhttp.responseText; 
    

    仍然沒有看到checkVar的值。

    +0

    您可能需要將其注入到DOM中,eval是邪惡的。在這種情況下,您可能需要回復該消息並對響應文本進行警報。 – Prashanth 2012-02-02 06:11:11

    +0

    @Prashanth - 它不如一個警報那麼簡單;更新了描述,因爲響應將是一個JS引用來加載更多的JS。 – ElHaix 2012-02-02 06:33:13

    +0

    對,將它注入到dom中,然後可以調用該函數。我想不出一個有效的用例,你需要用javascript來回應。 – Prashanth 2012-02-02 07:23:14

    回答

    2

    重新蓋上 - 需要存在於能夠動態地加載一些內容到網頁加載過程後/,並有它執行。通過執行,我不只是指改變某些div上的文本 - 這很容易。但是,如果我們想要動態加載一些新的JS,請說出來自某個外部源的警報,然後注入它,以及它的腳本標記和其他一些HTML代碼,那麼解決方案就是使用以下jQuery調用:

    jQuery(dynamicResponse).appendTo('body'); 
    

    dynamicResponse來自異步$.ajax({})XmlHttpRequest響應。一旦出現,它會被附加到任何DOM元素上,在appendTo()中指定並執行。

    3

    忽略這樣一個事實,無論你在做什麼都可能是一個壞主意,Prashanth有正確的想法將其插入到DOM中。你也可以去掉標籤,只是評價爲「正常」。

    沒有忽略一個事實,即1)eval是邪惡的,2)動態加載遠程代碼是壞的; 3)同步AJAX是額外的不好,我有這樣一段話:

    除非你知道自己在做什麼,任何事情都是一個壞主意,它很難調試,可能會暴露大量的安全漏洞和各種其他問題。然後通過加載遠程代碼來實現這一點,這顯然是以超出控制範圍的方式生成的,因爲您無法獲取腳本。同步Ajax是不好的,因爲只有一個在JavaScript線程阻塞在阿賈克斯,直到它被加載後,從字面上鎖定了整個頁面,因爲即使之類的東西滾動產生JavaScript事件,其目前正在忙於引擎必須檢查處理。儘管請求在本地計算機上運行得很快,但連接速度慢或質量差的人可能會等待一段時間,直到連接超時。 AJAX中的'A'是異步的,有一個很好的理由,使用回調函數,它們在那裏是有原因的。

    如果你只是在做數據傳遞,使用JSON,這是JavaScript對象符號,這恰好也是有效的JavaScript一個簡單的數據格式。您可以使用eval,但我建議使用JSON解析器,我認爲大多數現代瀏覽器都內置了它們(這裏可能是錯誤的)。 JSON是很好的,因爲它可以表達複雜的數據結構,生成和解析很簡單,並且得到廣泛的支持。

    +0

    我明白你在說什麼。我最初使用異步方法,但正如我所提到的,我想確保響應文本(這是一個JS引用)執行。 – ElHaix 2012-02-02 07:07:39

    +0

    除此之外,我看到eval()的問題,因爲它只會讓您從自己的域中執行腳本。我認爲集成jQuery的getScript()可能是一個更好的解決方案,並避免討論的許多陷阱。 – ElHaix 2012-02-02 19:02:15

    +0

    想想吧,它不僅僅是一個可以添加的Javascript包含。從本質上講,我需要能夠將任何額外的HTML(可以是帶標籤的完整JavaScript)注入Javascript的頁面。 Prashanth的選擇可能是要走的路。 – ElHaix 2012-02-02 19:30:13

    1

    下面是示例

    var script = document.createElement("script"); 
    //innerHTML can be the response from your server. But send the text with script tag. 
    script.innerHTML = "var foo = function(){console.log('injected into the DOM')}" 
    document.body.appendChild(script) // insert into the DOM 
    foo() // call the function 
    
    +0

    在進一步的說明中,我發佈了這個:http://stackoverflow.com/questions/9125163/how-to-combine-analytics-and-remarketing-pixels-into-one-using-jquery。它可能不僅僅是一個JS函數,而是加載一個JS庫或圖像等任何建議? – ElHaix 2012-02-03 18:06:58

    相關問題