jQuery 3 ready函数无法正常工作

时间:2018-09-26 14:23:22

标签: javascript jquery document-ready

下午好!

我从jquery 1.11.1移到了jquery 3.3.1。我在页面上有以下代码: ...

<script type="text/javascript">
function onJqueryLoad() {
    $(function () {
        console.log(document.readyState);
        window.app = new App({logsUrl: '3434'});
    });
}
</script>
<script type="text/javascript" src="~/Scripts/jquery-3.3.1.js" defer onload="onJqueryLoad()"></script>
...
// more scripts
...
<script type="text/javascript" src="~/Scripts/Common/App.js" defer></script>

... 在控制台中,我看到以下错误:

  

互动

     

jquery-3.3.1.js:3818 jQuery。延迟的例外:未定义应用   ReferenceError:未定义应用        在HTMLDocument。 (http://localhost:53228/:12:35)        atmaythrow(http://localhost:53228/Scripts/jquery-3.3.1.js:3534:29)        处理中(http://localhost:53228/Scripts/jquery-3.3.1.js:3602:12)未定义

     

未捕获的ReferenceError:未定义应用        在HTMLDocument。 ((索引):12)        atmaythrow(jquery-3.3.1.js:3534)        进行中(jquery-3.3.1.js:3602)

事实证明,$ (function () {的内容是在加载App.js脚本之前被调用的,并且document.readyState的状态为“交互式”。

但是,如果您在导入jquery时不使用“ defer”:

<script type="text/javascript" src="~/Scripts/jquery-3.3.1.js" onload="onJqueryLoad()"></script>

然后控制台将显示为状态:“完成”,并且不会出现任何问题。 状态document.readyState互动(https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState)的描述:

  

文档已完成加载,并且已对文档进行了解析,   但是子资源,例如图像,样式表和框架仍然   正在加载。

我无法找到有关状态“交互”是否表示所有脚本都已加载的详细信息。

我在chrome和firefox的最新版本中进行了检查,但是在Microsoft Edge中没有问题。

在早期版本的jquery 1.11.1中,没有此类错误。

https://jsfiddle.net/uez1y7ft/4/-如果在没有现金的情况下使用,该错误会不时出现(ctrl + f5-请参阅控制台)。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

是的,这是jquery的问题。您需要使用document.AddEventListener("DOMContentLoaded", function() {...});或修复jquery库。您可以在这里查看有关此问题的讨论:https://github.com/jquery/jquery/issues/3271

答案 1 :(得分:-1)

尝试一下。

我已经对脚本重新排序,删除了deferonload属性,并添加了一行以在jQuery完成初始化后调用onJqueryLoad。

<script type="text/javascript" src="~/Scripts/jquery-3.3.1.js"></script>
<script type="text/javascript" src="~/Scripts/Common/App.js"></script>
<script data-worldcore>
function onJqueryLoad() {
  console.log(document.readyState);
  window.app = new App({logsUrl: '3434'});
}
$(function(){ onJqueryLoad(); } );
</script>