【问题标题】:How do I stop all JavaScript executing from within an ajax call?如何停止从 ajax 调用中执行的所有 JavaScript?
【发布时间】:2015-10-26 07:05:49
【问题描述】:

我有以下 JavaScript 代码:

Interface.init = function()
{
    $.ajax({
        type: "POST",
        url: "/Validate",
        async: false,
        success: function (data) {
            if (data.Valid) {
                // All good, continue executing JS code
            }
            else {
                // Display error messsage, attempt to stop executing JS code...
                return false;
            }
        },
        error: function () {
            // Display error message, attempt to stop executing JS code...
            return false;
        }
    });

    // More JavaScript functions used to load content, etc...
}

加载时索引页面调用Interface.init()

<html>
    <script type="text/javascript">
        $(document).ready(function () {
            Interface.init();
        });
    </script>
</html>

ajax函数用于检查加载页面的设备是否有效。它运行synchronously,因此页面在继续之前等待验证完成。如果验证成功,则退出 ajax 函数并继续执行其余的 JavaScript 代码。如果验证失败(或验证过程中出现错误),我不希望执行任何剩余的 JavaScript 代码。

我目前正在使用return false,但我也尝试过return 并抛出诸如throw new Error("Validation failed") 之类的错误(正如许多其他问题所建议的那样)。

所有这些似乎都是退出 ajax 函数,页面上所有剩余的 JavaScript 继续执行。在ajax 函数之外,这些方法按预期工作以阻止剩余代码执行,但我希望这可以在ajax 函数中完成。这有可能吗?

【问题讨论】:

  • "页面等待验证完成后再继续。如果验证成功,则退出ajax函数,继续执行剩下的JavaScript代码。如果验证失败(或者在验证过程中出现错误),我希望页面上的所有 JavaScript 都停止执行。” 停止 js 取决于来自$.ajax() 的响应?
  • @Frédéric Hamidi - 您将其标记为重复的问题,与我在这里提出的问题甚至不相近。
  • @sfinks,那么请在此处准确解释您的要求。 我想要 ALL 页面上的JavaScript 停止执行 对我来说很清楚。
  • @FrédéricHamidi 你读过这个问题的答案了吗?无论如何,如果验证失败或发生错误,则不应对该页面进行任何操作,即。没有更多的代码要执行,页面基本上就死了。
  • @sfinks, sigh,是的,我已经阅读了副本下的答案,他们基本上说不可能停止 ALL 页面中的脚本,这就是您所要求的(在您的第二个代码 sn-p 下的段落末尾,强调和全部)。如果这不是您要问的,那么请编辑您的问题以使其更清楚。谢谢。

标签: javascript jquery ajax validation


【解决方案1】:

您可以在函数之前创建一个外部变量并在它之后使用它,例如:

Interface.init = function()
{
    var error = false;
    $.ajax({
        type: "POST",
        url: "/Validate",
        async: false,
        success: function (data) {
            if (data.Valid) {
                // All good, continue executing JS code
            }
            else {
                error = true;
            }
        },
        error: function () {
            error = true;
        }
    });

    if (error) return;
    // More JavaScript functions used to load content, etc...
}

但实际上,我建议不要使用async=false,取而代之的是,您可以将其余代码包装在一个函数中,并在回调中调用它,例如:

Interface.init = function()
{
    $.ajax({
        type: "POST",
        url: "/Validate",
        success: function (data) {
            if (data.Valid) {
                // All good, continue executing JS code
                loadAll();
            }
        },
        error: function () {

        }
    });

    function loadAll() {
        // More JavaScript functions used to load content, etc...
    }
}

【讨论】:

  • @sfinks_29 更新了我的答案,展示了一个不使用 async=false 的方法示例
  • @FrédéricHamidi 虽然他说“我希望页面上的所有 JavaScript 都停止执行”,但我完全清楚他的目标是不执行他拥有的所有代码在 AJAX 调用下方。
  • @FrédéricHamidi 如果发生错误则禁用 javascript 可能不是 OP 的要求。我的猜测是,如果发生错误或验证失败,它不会停止初始化。停止 ALL javascript 可能不是 OP 想要的,因为那样的话,将无法从错误中恢复并且可能使网页无用。
  • @FrédéricHamidi 那个重复的问题与这个问题完全没有任何联系。
  • @FrédéricHamidi 问题是:他的问题有几十行,而你专注于一行,他并不是说你在解释什么——其他人都看到了,还有 OP已经说过我的回答对他有用,但你在这里有点任性。
猜你喜欢
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多