Вопрос по jquery, javascript – jQuery $ (document) .ready () запускается дважды

61

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

У меня есть один $ (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).

@ngen - Конечно, вот оно,jsfiddle.net/alokswain/xNEtg... причина в том, что мы просто слушаем событие и можем прослушивать несколько раз, сколько захотим, просто простой случай нескольких привязок к одному событию: документ готов, который запускается один раз. Alok Swain
Можете ли вы дать какую-либо информацию о версии jQuery, которую вы используете, и браузерах, в которых это происходит? Victor
Это только логированиеonce for me. Elliot Bonneville
Что-то вызывает обновление страницы или загрузку второй страницы - какой-то инструмент отладки, такой как Firebug или что-то еще? Dylan Beattie
Я предполагаю, что один и тот же код внедрен дважды. событие готовности DOM запускается один раз, когда DOM готов, обработчик готовности просто связывается с этим событием. если он связан дважды, он будет выполнен дважды. Может быть, вам следует проверить весь javascript, чтобы увидеть, повторяется ли этот код где-то еще, или, возможно, вы просто оставили консольный журнал в каком-то другом обработчике, где выполняется другой код, но вы просто оставили консольный журнал. Alok Swain

Ваш Ответ

12   ответов
10

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

Error: User Rate Limit Exceeded
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 
}

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

Error: User Rate Limit Exceeded Xenology
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>
58

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsrc="#"Error: User Rate Limit ExceededsrcError: User Rate Limit Exceeded"about:blank"Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Xenology
Error: User Rate Limit Exceeded Xenology
2

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

window.onload

вместо

$(document).ready
Error: User Rate Limit Exceeded
36

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

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

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

0

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

1

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

30

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

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

Это что-то вроде взлома, но это работает.

0

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

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

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

0

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

Похожие вопросы