阻止jquery ajax从脚本或html响应中执行javascript

Krz*_* Dk 8 html javascript ajax jquery

根据文件:

如果指定了html,则在将HTML作为字符串返回之前,将执行检索到的数据中的任何嵌入式JavaScript.同样,脚本将执行从服务器撤回的JavaScript,然后不返回任何内容.

怎么预防这个?我有js将修改通过ajax获得的内容.在返回html之前执行它是没有意义的,因为它没有内容可以处理(至少在我的情况下).

我的代码:

function do_ajax(url)
    {
    $.ajax(
        {
        cache: false,
        url : url,
        success: function(response, status, xhr)
            {
            var ct = xhr.getResponseHeader("content-type") || "";
            if (ct.indexOf('script') > -1) {
                try {
                eval(response);
                }
                catch(error) { }
                }
                else
                {
                var edit_dialog = $('<div class="edit_dialog" style="display:hidden"></div>').appendTo('body');
                edit_dialog.html(response);
                edit_dialog.dialog({ modal:true, close: function(event, ui) { $(this).dialog('destroy').remove(); } });
                }

            },
        error:function (xhr, ajaxOptions, thrownError){
                   alert(xhr.status);
                   alert(thrownError);
                }
        });
    }
Run Code Online (Sandbox Code Playgroud)

ajax收到的脚本执行两次.首先由我在eval(响应)中,然后jquery再次执行它(如文档中所述)

Mar*_*ery 8

Lee的答案已经充分解决了HTML响应的问题 - 除非您将HTML添加到DOM,否则嵌入在这些中的脚本实际上并不会自动执行,这与您引用的错误文档相反.

这样就会在你的问题标题中询问另一个案例 - 防止脚本响应在收到时自动执行.您可以使用该dataType设置轻松完成此操作.

$.ajax('myscript.js', {
    dataType: 'text',
    success: function (response) {
        // Do something with the response
    }
})
Run Code Online (Sandbox Code Playgroud)

设置dataType'text'将导致jQuery忽略Content-Type从服务器返回的标头并将响应视为纯文本,从而阻止JavaScript响应的默认行为(即执行它们).来自(最近更正的)文档:

预处理的类型默认依赖于响应的Content-Type,但可以使用dataType选项显式设置.如果提供了dataType选项,则将忽略响应的Content-Type标头.

...

如果texthtml指定,则不进行预处理.数据只是传递给成功处理程序,并通过jqXHR对象的responseText属性提供.


Joe*_*oey -1

文档指出,在 HTML 作为字符串返回之前,检索到的数据中的任何嵌入的 Javascript都将被执行。如果您想更改使用 ajax 调用检索到的任何内容,您可以在 succes 属性中执行此操作:

$.ajax({
  url: "example.html",
  type: "GET",
  dataType: "html",
  succes: function(data){
     // Example: alert(data);
     // Do whatever you want with the returned data using JS or jQuery methods
  }
});
Run Code Online (Sandbox Code Playgroud)