2013-04-03 6 views
0

Это простой сценарий загрузки из неттоков, и я попытался изменить его в соответствии с моими потребностями. Но я не могу получить функцию res, которая изменяет размер загруженных элементов, чтобы произойти, прежде чем функция showewcontent работает. Теперь он изменяется после видимости, что очень плохо выглядит. Но если я ставлю вызов функции раньше, ничего не произойдет, потому что контент еще не загружен.Функция вызова загрузчика jQuery

$(document).ready(function() { 
    var hash = window.location.hash.substr(1); 
    var href = $('#menu a').each(function(){ 
     var href = $(this).attr('href'); 
     if(hash==href.substr(0,href.length-4)){ 
      var toLoad = hash+'.php #content'; 
      $('#content').load(toLoad); 
     } 
    }); 
    $('#menu a').click(function(){ 
     var toLoad = $(this).attr('href')+' #content'; 
     $('#content').hide('slow',loadContent); 
     window.location.hash = $(this).attr('href').substr(0,$(this).attr('href').length-4); 
     function loadContent() { 
      $('#content').load(toLoad,'',showNewContent()); 
     } 
     function showNewContent() { 
      $('#content').show("0", res) 
     } 
     return false; 
    }); 
}); 
+0

Функция 'showNewContent()' вызывает 'res()' в качестве обратного вызова. Почему вы ожидаете, что 'res()' произойдет первым? Почему бы не вызвать 'res()' как обратный вызов 'load()', а затем выполнить 'showNewContent()'? –

ответ

0

Вы res() определяется как обратного вызова для show(), то есть он будет вызван после функция show() завершается.

Я хотел бы изменить структуру обратного вызова, так что она содержит все работы, которую вы хотите сделать:

$('#menu a').click(function(e) { 
    var toLoad = $(this).attr('href') + ' #content'; 
    $('#content').hide('slow', function() { 
     var self = this; 
     $(self).load(toLoad, '', function() { 
      res(); 
      $(self).show("0"); 
     }); 
    }); 
    window.location.hash = $(this).attr('href').substr(0,$(this).attr('href').length-4); 
    e.preventDefault(); 
} 

Тогда вам не нужно определения функций внутри обработчика щелчка.

FYI, вместо return false;, было бы лучше использовать e.preventDefault(); в конце вашего обработчика щелчков. Вам необходимо будет определить e в качестве параметра функции обратного вызова щелчка. См. this для обсуждения return false; vs. e.preventDefault().

Кроме того, если изменение размера занимает заметное количество времени, вы можете захотеть, чтобы функция res() выполняла обратный звонок таким же образом, что и show(). Затем вы можете показывать контент только после его загрузки и изменения размера.

+0

e.preventDefault(); вызывает сбой сценария, вместо загрузки ссылки #content (href). Ваше решение очень помогло мне понять проблему, но она не работает, объекты отображаются с неправильными пропорциями - я могу только догадываться, почему, но если функция вызывается в '$ ('# content'). Show («0», res) 'работает отлично. –

+0

'function loadContent() { $ ('# content'). Load (toLoad, '', function() {$ ('# content'). Css (" видимость "," скрытый "). Css (" display "," inline "); res(); $ ('# content'). css (" видимость "," видимая ");});}' работает достаточно хорошо, спасибо за вашу помощь! –

+0

@PeterMagic: Я внес некоторые изменения после ответа на мой ответ, чтобы помочь уточнить, что я намеревался. Вы также можете комбинировать свои '.css()' изменения, делая: '$ ('# content'). Css ({" visibility ":" hidden "," display ":" inline "});' –

Смежные вопросы