Ajax Unexpected token < error on 404 而不是普通的 ajax

使用 jQuery Ajax 函数时,在指定错误和成功处理程序时,您会期望指定的错误处理程序函数捕获无效文件和 404 错误,但由于某种原因我的代码没有。


代码:


// using jQuery 3.4.1

// this code has been taken from a larger function, but the issue can be replicated by pasting

// the following code into the JS Console.


var scriptPath = 'http://mywebserver.localhost/application/invalid.js';


jQuery.ajax( {

    async: false,

    type: 'GET',

    url: scriptPath,

    crossOrigin: false,

    data: null,

    global: false,

    cache: true,

    success: function() {

        debugger;

        // do some stuff

        onResult();

    },

    error: function( jqXHR, textStatus, errorThrown ) {

        debugger;

        Lib.showNetworkErrorAlert( jqXHR, textStatus, errorThrown );

    },

    dataType: 'script'

} );

这导致:


未捕获的错误来自:~未知~


错误:未捕获的语法错误:意外的令牌“<”在: http://mywebserver.localhost/ ........ 行:1


澄清一下,我已经查看了那里的 SO 问题,但我发现的问题往往集中在错误的原因上。我知道错误'Unexpected token < in ...'是什么,它只是JS试图将目标解析为JS,而是给出了404错误html文件,所以第一个标签中的<触发了错误。


我试图找出和理解的是为什么会出现此错误而不是指定的正常错误处理程序。至少我会认为将 dataType 设置为 script 会使其实现更好的错误,嘿,这是一个 HTML 404 错误文件,而不是脚本。


非常感谢任何帮助和见解。


更新:这是 Dev Tools 中的 Network 选项卡,显示它正在返回 404。

http://img4.mukewang.com/62aaf0300001a74a07870233.jpg

智慧大石
浏览 138回答 1
1回答

呼如林

事实证明,这实际上是 jQuery 中的一个错误——而不是我错误地使用它——早在 2018 年就报告了该错误,但该修复仅指定包含在 jQuery 中4.0.0。然而,这可能还需要一段时间,所以我现在再次报告了这个错误以包含在更多当前版本中,管理员已经讨论了这个问题并决定将它作为一个修复程序包含在3.5.0.错误的解释通常,使用该dataType:script属性会告诉 jQuery 的 Ajax 函数“我正在提供一个脚本,请在 JavaScript 加载后执行它”。问题是无论响应状态代码如何,文件(或返回的任何内容)都将被评估为 JavaScript(即使不是 JavaScript),如果 404 错误返回 404 错误 HTML 页面,这当然会导致错误。可以在Github上看到解决方案(只是为了不在这里解释错误),但简单来说,它不应该再为不成功的 HTTP 响应执行脚本。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript