2011-08-30 58 views
3

我有一個基於jQuery的「ajax引擎」。接收到響應後,我必須在插入頁面之前操作響應。但我需要將響應作爲一個jQuery對象。 我這樣做有:阻止在jQuery中加載(或解析)腳本執行

tmpActualResult = $('<span/>').html(actualResult); 

而此時的jQuery(或瀏覽器本身?)執行,其包括在響應腳本 - 而正是這一點不應該發生。稍後我將執行腳本手冊。

特別

我將:

  1. 解析響應(可以訪問所包含的標籤/元素)
  2. 插入元素融入到網頁(DOM操縱)
  3. 執行可能的腳本(這是收)
在感謝

編輯: 如果有人也感興趣,我已經通過擴展jQuery.domManip函數創建了一個更通用的解決方案,如第一個答案中的建議。

(function($, oldDomManip) { 
// Override the core domManip function 
$.fn.domManip = function() { 

    function evalScript(i, elem) { 
     jQuery.globalEval(elem.text || elem.textContent || elem.innerHTML || ""); 
    } 

    var scripts = []; 
    // let jQuery build the fragments 
    var results = jQuery.buildFragment(arguments[0], this, scripts); 
    // change parameter to created fragments 
    arguments[0] = results.fragment.childNodes; 
    // do what jQuery will do - without scripts 
    oldDomManip.apply(this, arguments); 
    if (scripts.length) { 
     // if connection is active 
     if (jQuery.active != 0) { 
      $(this).bind("ajaxStop.scriptCache", function() { 
       $.each(scripts, evalScript); 
       $(this).unbind("ajaxStop.scriptCache"); 
      }); 
     } else 
      $.each(scripts, evalScript); 
    } 
    return this; 
}; 
})(jQuery, jQuery.fn.domManip); 

在ajax請求完成之前它不會執行腳本。爲我工作。

+0

究竟是什麼反應? –

+0

此時一個簡單的HTML字符串。 (有可能的腳本標籤) – chuem

回答

3

您不能阻止腳本執行腳本,這些腳本是您嘗試使用.html()或.append()添加的標記字符串的一部分。至少不是沒有擴展jQuery的domManip功能。它提取所有使用.html()或.append()添加的HTML標記中的腳本並對其進行處理。

但是,您可以自己從字符串中提取腳本標記及其內部文本(js),只需通過.html()或.append()添加標記,然後在需要時自行評估腳本。

+0

好的謝謝 - 至少有可能獲得腳本? like:$('').append(response).find(「script」); – chuem

+0

在將響應放入DOM(使用.append()函數)之前,您必須從響應中獲取腳本。 – gislikonrad

+0

非常感謝,我將嘗試擴展domManip函數,我需要更全面的解決方案。 – chuem

1

試試這個:

var container = document.createElement('div'); 
container.innerHTML = "<div> i am html with script tag <script type="text/javascript">alert('Script executed');</script>end</div>" 
$(container).doSomething()