这个需要一些设置才能让你理解我想要做的事情。它涉及模板和异步调用。我知道异步调用的复杂性和细微差别。
我在.js文件中有一段javascript。该脚本包含一些需要用实际变量替换的“标签”,这些变量在每次使用时都是不同的。您会注意到脚本中嵌入了“{{tags}}
”。您还会注意到该脚本包含对C#Generic Handler的ajax调用。 :
// this is template code from LoadFlights.js, called from LoadFlights() in main.js...
$.ajax({
type: "POST",
url: "js/handlers/LoadFlights.ashx",
dataType: "text",
cache: false,
data: {
DateStart: "{{DATESTART}}",
DateEnd: "{{DATEEND}}",
Specific: JSON.stringify({DAY: "{{DAY}}", DEP: "{{DEP}}", CARRIER: "{{CARRIER}}", FLT: "{{FLT}}", LEGCD: "{{LEGCD}}"})
},
success: function (result) {
callback_LoadFlights(result);
},
error: function (result) {
alert(result.responseText);
return false;
}
});
function callback_LoadFlights(result) {
alert(result);
}
// end
我通过jquery .get()
调用获取脚本,并且在.done()
回调中,我尝试将检索到的脚本代码分配给变量。
function runScript(source, parameters) {
if (URLExists(source)) {
var getScript = $.get({
url: source,
dataType: "script"
})
.done(function (scriptCode) {
var code = scriptCode;
// replace any passed parameters...
for (var p in parameters) {
code = code.replace("{{" + p + "}}", parameters[p]);
}
// remove any unused parameter placeholders...
while (code.indexOf("{{") >= 0) {
code = code.substr(0, code.indexOf("{{")) + code.substr(code.indexOf("}}") + 2);
}
var s = document.createElement('script');
s.type = "text/javascript";
s.text = code;
document.body.appendChild(s);
})
.fail(function () {
alert("Failed to retrieve script: " + source);
})
}
(为了简洁起见,我省略了else
。)
在这一行上会发生什么:
var code = scriptCode;
代码立即执行,并且Generic Handler调用触发,并立即失败并显示“无效日期格式”(尝试使用DateStart的第一行),因为DateStart仍然等于“{{DATESTART}}”。 没有替换代码的代码执行。
即使我在该行设置了一个断点并尝试单步 INTO 它以查看可能发生的情况,它仍会立即触发通用处理程序调用。
在调试器中,我typeof
'在立即窗口中都有代码和scriptCode,并且都返回“string”。
我很想相信某种JavaScript错误正在发生,立即杀死JavaScript代码块并停止执行。
但是如何解雇Generic Handler呢?从各方面来看,好像通过简单地将它分配给另一个变量来执行.get().done()
检索到的javascript。这甚至可能吗?任何人都可以看到这里有什么问题吗?
答案 0 :(得分:3)
查看jQuery.ajax()
的文档:http://api.jquery.com/jquery.ajax/
当dataType
为script
时:
" script":将响应评估为JavaScript并将其作为纯文本返回。
所以jQuery正在评估你的javascript,然后才有机会解析它。 然后它会为您提供脚本文本,但到目前为止还为时已晚。尝试将数据类型更改为' text'然后解析它。