75

我一直在网上搜索,试图找出这里发生了什么,但我无法得到具体的答案。

我的网站上有一个$(document).ready可以多次运行的接缝,无论其中的代码如何。

我已经阅读了关于 jQuery 的错误报告,.ready如果您的语句中出现异常,该事件将如何触发两次。但是,即使我有以下代码,它仍然会运行两次:

$(document).ready(function() {
    try{    
        console.log('ready');
        }
    catch(e){
        console.log(e);
    }
});

在控制台中,我看到的只是“准备就绪”记录了两次。是否有可能另一个带有异常的 .ready 会导致问题?我的理解是所有 .ready 标签都是相互独立的,但我似乎找不到它在哪里发挥作用?

这是该网站的主要内容:

<head>
<title>${path.title}</title>
<meta name="Description" content="${path.description}" />
<link href="${cssHost}${path.pathCss}" rel="stylesheet" type="text/css" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="media/js/fancybox/jquery.fancybox.pack.js" type="text/javascript" ><!-- --></script>
<script src="/media/es/jobsite/js/landing.js" type="text/javascript" ><!-- --></script>
<script src="/media/es/jobsite/js/functions.js" type="text/javascript"><!-- -->    </script>
<script src="/media/es/jobsite/js/jobParsing.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="/media/es/jobsite/js/queryNormilization.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="${jsHost}/js/jquery/jquery.metadata.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="${jsHost}/js/jquery/jquery.form.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.7/jquery.validate.min.js" type="text/javascript" charset="utf-8"><!----></script>
<script src="${jsHost}/js/jquery.i18n.properties-min.js" type="text/javascript" charset="utf-8"><!----></script>

<script type="text/javascript" charset="utf-8">

function updateBannerLink() {
    var s4 = location.hash.substring(1);
    $("#banner").attr('href','http://INTELATRACKING.ORG/?a=12240&amp;c=29258&amp;s4='+s4+'&amp;s5=^');
}

</script>
</head>

不注意 JSP 变量,但正如您所见,我只调用了 functions.js 文件一次(这是 .ready 函数存在的地方)

4

13 回答 13

70

就绪事件不能触发两次。很可能发生的情况是您的代码正在移动或操纵包含代码的元素,导致浏览器重新执行脚本块。

这可以通过在结束标记中<head>或之前包含脚本标记而不使用. 使用具有相同的效果。</body>$('body').wrapInner();$('body').html($('body').html().replace(...));

于 2012-05-23T20:04:52.467 回答
42

这也发生在我身上,但我意识到由于合并错误,该脚本被包含了两次。

于 2014-02-20T11:21:43.287 回答
34

这发生在我使用 KendoUI 时...调用弹出窗口会导致document.ready事件多次触发。简单的解决方案是设置一个全局标志,使其只运行一次:

var pageInitialized = false;
$(function()
{
    if(pageInitialized) return;
    pageInitialized = true;
    // Put your init logic here.
});

这有点hack-ish,但它有效。

于 2012-05-23T20:33:32.133 回答
14

确保您没有两次包含 JS 文件。那是我的情况

于 2015-02-26T23:33:12.743 回答
3

您可以考虑使用

window.onload

代替

$(document).ready
于 2014-12-25T18:52:30.813 回答
2

尝试把它放在你的functions.js中以防止它被执行两次:

var checkit = window.check_var;
if(checkit === undefined){ //file never entered. the global var was not set.
    window.check_var = 1;
}
else {
    //your functions.js content 
}

但是,我建议您仔细研究一下,看看您第二次打电话到哪里。

于 2012-05-23T20:21:07.313 回答
1

当我尝试刷新部分时,我遇到了类似的问题。我调用了返回 ActionResult 而不是返回 PartialViewResult。ActionResult 导致我的 ready() 运行两次。

于 2016-11-03T08:58:24.837 回答
1

当您在 html 中添加两次相同的控制器时,可能会遇到此问题。
例如:
[js]

app.controller('AppCtrl', function ($scope) {
 $(document).ready(function () {
        alert("Hello");
        //this will call twice 
    });
});

[html]

//controller mentioned for the first time
<md-content ng-controller="AppCtrl">
    //some thing
</md-content>

//same controller mentioned again 
<md-content ng-controller="AppCtrl">
    //some thing
</md-content>
于 2017-02-25T13:37:19.007 回答
1

我今天有一个类似的问题。在我的情况下, A<button type="submit">导致$(document).ready(...)事件再次触发。更改代码<button type="button">为我解决了这个问题。

提交按钮后再次调用 document.ready 函数?在stackoverflow上了解更多细节。

于 2018-05-11T21:13:50.863 回答
0

在我的情况下, $(document).ready 由于 CSS 错误而触发了两次,请检查您的 CSS 的任何部分是否有background-image: url('');

于 2017-07-17T15:35:31.363 回答
0

如果 iframe 没有显示任何内容并且用于其他原因(例如上传文件而不重新加载),您可以执行以下操作:

<iframe id="upload_target" name="upload_target" style="width:0;height:0;border:0px solid #fff;"></iframe>

请注意,不包含 src 会阻止文档上的第二个就绪触发器。

于 2017-07-24T11:35:06.983 回答
0

我在 window.load 函数执行了两次时遇到了这个问题:原因是因为我在主页中引用了相同的 javascript 文件以及 .net 用户控件。当我删除主页中的引用时,加载函数只执行了一次。

于 2017-09-07T22:25:11.297 回答
0

今天早上我遇到了这种情况......在仔细检查了我最近操作的 jquery 模态表单中的一些 html 代码后,我发现我不小心删除了一个关闭表标记。我还没有花时间完全理解为什么会导致document.ready 函数被调用两次,但确实如此。添加结束表标签解决了这个问题。

jQuery JavaScript Library v1.8.3(是的,它是一个遗留应用程序)

于 2020-03-06T12:02:30.477 回答