【问题标题】:Why is Javascript contained in a string variable executing as soon as it is assigned to another string variable?为什么 Javascript 包含在字符串变量中,一旦分配给另一个字符串变量就执行?
【发布时间】:2018-03-26 00:37:46
【问题描述】:

这需要一些设置让您了解我想要做什么。它涉及模板和异步调用。我知道异步调用的复杂性和细微差别。

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

代码立即执行,Generic Handler 调用触发,并立即以“无效的日期格式”(尝试使用 DateStart 的第一行)失败,因为 DateStart 仍然等于“{{DATESTART}}”。 没有执行替换标记的代码。

即使我在该行设置断点并尝试单步执行 INTO 以查看可能发生的情况,它仍会立即触发通用处理程序调用。

在调试器中,我typeof'd 即时窗口中的 code 和 scriptCode,都返回“string”。

我很想相信某种 JavaScript 错误正在发生,立即杀死 JavaScript 代码块并停止它的执行。

但是通用处理程序是如何被解雇的呢?从表面上看,.get().done() 检索到的 javascript 似乎是通过简单地将其分配给另一个变量来执行的。这甚至可能吗?谁能看到这里出了什么问题?

【问题讨论】:

    标签: javascript jquery ajax asynchronous


    【解决方案1】:

    查看jQuery.ajax() 的文档:http://api.jquery.com/jquery.ajax/

    dataTypescript 时:

    “script”:将响应评估为 JavaScript 并将其作为纯文本返回。

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

    【讨论】:

    • 我假设 get() 的选项存在,就像 ajax() 一样。如果这能解决问题,我还有一个问题。我在哪里运送你的啤酒箱? ;-)
    • 你的鹰眼拯救了这一天,@Mark_M。非常感谢!
    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 2020-04-28
    • 2020-03-12
    • 2022-10-17
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多