Почему jQuery .load() запускается дважды?

Я использую jQuery 1.4 с jQuery History и пытаюсь выяснить, почему Firebug/Web Inspector показывает 2 запроса XHR GET при каждой загрузке страницы (удваивает эту сумму при посещении домашней страницы моего сайта (/ или же /#).

например, посетите эту (или любую) страницу с включенным Firebug.

Вот отредактированный / соответствующий код (см. Полный исходный код): -

$(document).ready(function() {

    $('body').delegate('a', 'click', function(e) {
        var hash = this.href; 
        if (hash.indexOf(window.location.hostname) > 0) { /* Internal */
         hash = hash.substr((window.location.protocol+'//'+window.location.host+'/').length); 
         $.historyLoad(hash); return false;     
  } else if (hash.indexOf(window.location.hostname) == -1) { /* External */ 
   window.open(hash); return false; 
  } else { /* Nothing to do */ }
        });


 $.historyInit(function(hash) {
  $('#loading').remove(); $('#container').append('<span id="loading">Loading...</span>'); 
   $('#ajax').animate({height: 'hide'}, 'fast', 'swing', function() { 
    $('#page').empty(); $('#loading').fadeIn('fast');

    if (hash == '') { /* Index */ 
     $('#ajax').load('/ #ajax','', function() { ajaxLoad(); }); 
    } else {
        $('#ajax').load(hash + ' #ajax', '', function(responseText, textStatus, XMLHttpRequest) {
      switch (XMLHttpRequest.status) { 
       case 200: ajaxLoad(); break;
       case 404: $('#ajax').load('/404 #ajax','', ajaxLoad); break; // Default 404
       default: alert('We\'re experiencing technical difficulties. Try refreshing.'); break;
       }
      });
     }

}); // $('#ajax')
  }); // historyInit()


  function ajaxLoad() {
   $('#loading').fadeOut('fast', function() { 
    $(this).remove(); $('#ajax').animate({height: 'show', opacity: '1'}, 'fast', 'swing');
    });
   }

    });

Несколько замечаний, которые могут быть полезны:

  • Использование WordPress со стандартным / стандартным.htaccess
  • Я перенаправляю /links-like/this в /#links-like/this только через JavaScript (PE)
    • Я достигаю вышеизложенного с window.location.replace(addr); и не window.location=addr;
  • Не стесняйтесь посетить мой сайт, если это необходимо.

Заранее спасибо.

2 ответа

Решение

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

На моем живом сайте.load() был вложен в 2 уровня обратных вызовов: -

$.historyInit(function(hash) {
    $('html, body').animate({scrollTop: '0'}, 500, 'swing', function() { \\ level 1
        $('#loading').remove(); $('#container').append('<span id="loading">Loading...</span>'); 
        $('#ajax').animate({height: 'hide'}, 'fast', 'swing', function() { \\ level 2
            $('#page').empty(); $('#loading').fadeIn('fast');

            if (hash == '') { /* Index */ 
                $('#ajax').load('/ #ajax','', function() { ajaxLoad(); }); 
            } else {
                $('#ajax').load(hash + ' #ajax', '', function(responseText, textStatus, XMLHttpRequest) {
                    switch (XMLHttpRequest.status) { 
                        case 200: ajaxLoad(); break;
                        case 404: $('#ajax').load('/404 #ajax','', ajaxLoad); break; // Default 404
                        default: alert('We\'re experiencing technical difficulties. Try refreshing.'); break;
                        }
                    });
                }

            }); // $('#ajax')
        }); // $('html, body')
    }); // historyInit()

... перемещение if (hash) утверждение за пределами обратных вызовов возвращает меня к 1 XHR GET для всех страниц (с / как единственное исключение).

Еще раз спасибо за попытку помочь Пауло.

Я думаю, что вы ответили на свой вопрос:

"Я перенаправляю /links-like/this в /#links-like/this только через JavaScript (PE)"

Другие вопросы по тегам