这需要一些设置才能让您了解我正在尝试做什么。它涉及模板调用和异步调用。我了解异步调用的复杂性和细微差别。
我有一段 javascript,位于 .js 文件中。该脚本包含一些需要用实际变量替换的“标签”,这些变量在每次使用时都不同。您会注意到脚本中嵌入了“{{tags}}
”。您还会注意到该脚本包含对 C# 通用处理程序的 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;
代码立即执行,通用处理程序调用触发,并立即失败,并显示“无效日期格式”(尝试使用 DateStart 的第一行),因为 DateStart 仍然等于“{{DATESTART}}”。 替换标签的代码都不会执行。
即使我在该行上设置断点并尝试进入它以查看可能发生的情况,它仍然会立即触发通用处理程序调用。
在调试器中,我在立即窗口中对代码和 scriptCode 进行了 typeof
处理,并且都返回“string”。
我很想相信正在发生某种 JavaScript 错误,立即终止 JavaScript 代码块并停止其执行。
但是通用处理程序是如何被触发的呢?从表面上看,.get().done()
检索到的 javascript 似乎是通过简单地将其分配给另一个变量来执行的。这可能吗?谁能看出这里出了什么问题吗?
最佳答案
查看 jQuery.ajax()
的文档:http://api.jquery.com/jquery.ajax/
当dataType
为script
时:
"script": Evaluates the response as JavaScript and returns it as plain text.
所以 jQuery 在你有机会解析你的 javascript 之前就对其进行了评估。 然后它会为您提供脚本的文本,但此时为时已晚。尝试将数据类型更改为“文本”,然后解析它。
关于javascript - 为什么包含在一个字符串变量中的 Javascript 一旦被分配给另一个字符串变量就会立即执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49482454/