防止在jQuery中加载(或解析)时执行脚本

时间:2011-08-30 14:00:12

标签: javascript jquery

我有一个基于jQuery的“ajax引擎”。收到响应后,我必须在插入页面之前操纵响应。但我需要将响应作为jQuery对象。 我这样做:

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

但是此时jQuery(或浏览器本身?)执行包含在响应中的脚本 - 确实不会发生这种情况。我稍后会执行脚本手册。

特别是我会:

  1. 解析响应(访问包含的标记/元素)
  2. 将元素插入页面(DOM操作)
  3. 执行可能的脚本(已收到)
  4. 谢谢

    编辑: 如果有人也有兴趣,我已经通过扩展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请求完成之前,它不会执行脚本。为我工作。

2 个答案:

答案 0 :(得分:4)

您无法阻止脚本执行脚本,这些脚本是您尝试使用.html()或.append()添加的标记字符串的一部分。至少没有扩展jQuery的domManip功能。它会使用.html()或.append()提取您尝试添加的html标记中的所有脚本,并对其进行描述。

但是,您可以自己从字符串中提取内部文本(js)的脚本标记,仅通过.html()或.append()添加标记,然后在需要时自行评估脚本。 / p>

答案 1 :(得分: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()