в jQuery $(документ).ready () срабатывает дважды

поэтому я просеивал по сети, пытаясь выяснить, что здесь происходит, и я не смог получить конкретный ответ.

у меня есть один $(документ).готов на моем сайте, что швы для запуска несколько раз, независимо от кода, который находится внутри него.

Я прочитал отчеты об ошибках для jQuery о том, как это .готовое событие будет срабатывать дважды, если у вас есть исключение, которое происходит в вашем операторе. Однако даже когда у меня есть следующий код, он все еще работает дважды:

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

в консоли все, что я вижу, "готово" регистрируется дважды. Возможно ли, что другой .готов с исключением в нем вызовет проблему? Насколько я понимаю, это все .готовые теги были независимы друг от друга, но я не могу найти, где это вступает в игру?

вот головной блок для сайта:

<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, но как вы можете видеть, я только вызов функции.JS файл один раз (где этот.готовая функция есть)

12 ответов


событие ready не может срабатывать дважды. Более чем вероятно, что у вас есть код, который перемещает или управляет элементом, в котором содержится код, который заставляет браузер повторно выполнять блок сценария.

этого можно избежать, включив в теги script в <head> или перед закрывающим тегом </body> tag and не используя $('body').wrapInner();. используя $('body').html($('body').html().replace(...)); имеет тот же эффект.


Это случилось и со мной, но я понял, что сценарий был включен дважды из-за плохого слияния.


Это случилось со мной при использовании KendoUI... вызов всплывающего окна вызовет document.ready событие для запуска несколько раз. Простое решение-установить глобальный флаг, чтобы он запускался только один раз:

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

это своего рода Хак-иш, но он работает.


убедитесь, что вы не включаете JS-файл дважды. Это было мое дело!--1-->


попробуйте поместить это в свои функции.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 
}

однако я предлагаю вам посмотреть больше, чтобы увидеть, где вы звоните во второй раз.


вы можете рассмотреть возможность использования

window.onload

вместо

$(document).ready

У меня была аналогичная проблема, когда я пытался обновить частичный. Я вызвал return ActionResult вместо return PartialViewResult. ActionResult заставил мой ready () работать дважды.


существует возможность столкнуться с этой проблемой, когда вы добавляете один и тот же контроллер дважды в 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>

у меня сегодня была аналогичная проблема. А <button type="submit"> причинил $(document).ready(...) событие для повторного запуска в моем случае. Изменение кода <button type="button"> решил проблему для меня.

посмотреть документ.функция ready снова вызывается после кнопки submit? здесь на stackoverflow для получения более подробной информации.


в моем случае $(документ).готов был стрелять дважды из-за плохого CSS, проверьте, есть ли какая-либо часть вашего CSS background-image: url('');


Если iframe не показывают ничего и используется по другим причинам (например, загрузка файла без перезагрузки), вы можете сделать что-то вроде этого :

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

обратите внимание, что src не включен, что предотвращает второй на готовом триггере в документе.


У меня была эта проблема с window.функция load была выполнена дважды: Причина была в том, что у меня была ссылка на тот же javascript-файл на главной странице, а также на .net usercontrol. Когда я удалил ссылку на главной странице, функция load была выполнена только один раз.