我有几种不同的形式,每种形式都会返回不同的东西。我需要检测它是否是一个简单的字符串(所以我可以将它放在错误/状态区域)或者如果它的javascript我什么也不做,让它执行。
目前这是我正在检查的方式,但我想确保这是100%坚固可靠......我想不出任何其他方式。
另一种选择是始终使用JSON,但后来我需要一个JSON垫片,以及尝试将javascript序列化为JSON。
$.ajax({
type: 'POST',
url: form.attr('action'),
data: form.serialize()
})
.done(function(data, textStatus, xhr) {
if (!xhr.getResponseHeader('Content-Type').match(/text\/javascript/i)) {
form.find('.status').text(data).removeClass().addClass('status status-done').slideDown(200);
} else {
// this is where i do nothing and let JS run
}
})
以下是有效的,但我担心会出现一些不起作用的边缘情况(不确定可能是什么,但重要的是这部分可以100%工作)
答案 0 :(得分:0)
注意,不确定要求的细节。如果正确解释问题,在form
个不同的元素,来自$.ajax()
请求的不同响应类型? a)检查响应类型string
? b)什么都不做?
可以使用
检查string
响应中的响应类型json
if (typeof data.data === "string") {
// do stuff , with `string`
}
如果$.ajax()
期望json
响应,则接收js,可以立即运行该作品。在下面的部分中,第一个回复是string
,在if
处通过.done()
进行过滤。第二个响应json
对象具有js函数表达式作为属性,它似乎立即在$.ajax()
success
textStatus
运行。仍然能够检查type
处的object
的回复else
,但是script
。请参阅xhr.repsonseText
xhr.reponseJSON
和console
尝试
var urls = [["/echo/json/","abc"]
, ["/echo/json/",
{"abc":
(function() {
setTimeout(function() {
$("body").append("<div id=data>"
+ "object" + "</div>");
$("#data")
.hide(0)
.fadeIn(1200)},1200)
}())
}]
];
var request = function(url, _data) {
$.ajax({
type: 'POST',
url: url,
data: {json : JSON.stringify({"data":_data})}
})
.done(function(data, textStatus, xhr) {
if (typeof data.data === "string") {
$("body").append("<div>" + data.data + "</div>")
} else {
console.log(typeof data.data
, data
, xhr.responseText
, xhr.responseJSON);
// this is where i do nothing and let JS run
}
})
};
$.each(urls, function(k, v) {
request(v[0], v[1])
});
jsfiddle http://jsfiddle.net/guest271314/y9b7t740/
见
jQuery getScript() vs document.createElement('script'),script.js
Calling a JavaScript function returned from an Ajax response