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再次执行它(如文档中所述)
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标头.
...
如果
text
或html
指定,则不进行预处理.数据只是传递给成功处理程序,并通过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)