javascript - 为什么包含在一个字符串变量中的 Javascript 一旦被分配给另一个字符串变量就会立即执行?

标签 javascript jquery ajax asynchronous

这需要一些设置才能让您了解我正在尝试做什么。它涉及模板调用和异步调用。我了解异步调用的复杂性和细微差别。

我有一段 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/

dataTypescript时:

"script": Evaluates the response as JavaScript and returns it as plain text.

所以 jQuery 在你有机会解析你的 javascript 之前就对其进行了评估。 然后它会为您提供脚本的文本,但此时为时已晚。尝试将数据类型更改为“文本”,然后解析它。

关于javascript - 为什么包含在一个字符串变量中的 Javascript 一旦被分配给另一个字符串变量就会立即执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49482454/

相关文章:

jquery - jquery.com这样的开源库是如何赚钱的

ajax - 在内部网络上提供对我的自托管 Web API 的互联网访问。安全威胁?

PHP/jQuery AJAX 算法只能每隔一段时间工作

javascript 高度数学重新计算每个页面更改

javascript - 正则表达式/javascript

jquery - 属性名称无法识别

javascript - 向服务器发送二进制数据

javascript - 在 javascript 中不会多次掉落到同一位置

javascript - 如何从用户动态地给 img 一个 src

Jquery 悬停在这个类上