为什么Javascript包含在字符串变量中,只要它被分配给另一个字符串变量就会执行?

时间:2018-03-26 00:37:46

标签: javascript jquery ajax asynchronous

这个需要一些设置才能让你理解我想要做的事情。它涉及模板和异步调用。我知道异步调用的复杂性和细微差别。

我在.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。这甚至可能吗?任何人都可以看到这里有什么问题吗?

1 个答案:

答案 0 :(得分:3)

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

dataTypescript时:

  

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

所以jQuery正在评估你的javascript,然后才有机会解析它。 然后它会为您提供脚本文本,但到目前为止还为时已晚。尝试将数据类型更改为' text'然后解析它。