Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Перестают работать скрипты после добавления ajax-контента на страницу (https://javascript.ru/forum/jquery/51747-perestayut-rabotat-skripty-posle-dobavleniya-ajax-kontenta-na-stranicu.html)

alecto 18.11.2014 01:28

Перестают работать скрипты после добавления ajax-контента на страницу
 
Есть форум на PHPBB3, есть блоки в сообщениях, которые изначально свернуты и разворачиваются при наведении на них мышкой.

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

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

Возможно ли перезагрузить скрипт для всей страницы при обновлении аякс? т.е. отключить мой скрипт и включить его заново, например по событию .ajaxComplete()? но именно предварительно отключить, чтобы не было двойного выполнения скрипта, подключенного в document ready.

на всякий случай приложу скрипт, который сейчас подключается в document ready
$('.postprofile').hover(function() {
		if ($(window).width() > 843) {
			$(this).find('.avatar img').stop(true, true).css({margin: '-20px 0 -40px 0'}).animate({margin: '0'},300);
			$(this).find('.profile-custom-field').stop(true, true).show(300);
			$(this).find('.profile-joined').stop(true, true).show(300);
			$(this).find('.profile-rank').stop(true, true).show(300);
			$(this).find('.profile-posts').stop(true, true).show(300);
				var txt1 = '<span id="temp_added_text" style="display: block; padding-left: 70px;"><br/>▲<br/><br/></span>';
			$(this).find('.profile-contact').append(txt1);
		}
	    }, function() {
		if ($(window).width() > 843) {
			$(this).find('.avatar img').stop(true, true).css({margin: '-20px 0 -40px 0'});
			$(this).find('.profile-custom-field').stop(true, true).hide();
			$(this).find('.profile-joined').stop(true, true).hide();
			$(this).find('.profile-rank').stop(true, true).hide();
			$(this).find('.profile-posts').stop(true, true).hide();
			$(this).find('#temp_added_text').remove();
		}
	});



если для иллюстрации нужна ссылка на страницу где можно посмотреть - приложу, если это не запрещено.

или может быть другое решение проблемы?

рони 18.11.2014 01:45

alecto,
поставьте ваш код на ближайший не перезаписываемый элемент выше

$('body').on('mouseenter', '.postprofile', function() {})
также для mouseleave

alecto 18.11.2014 01:53

сделал как вы посоветовали и, похоже все заработало!

$('body').on('mouseenter', '.postprofile', function() {
		if ($(window).width() > 843) {
			$(this).find('.avatar img').stop(true, true).css({margin: '-20px 0 -40px 0'}).animate({margin: '0'},300);
			$(this).find('.profile-custom-field').stop(true, true).show(300);
			$(this).find('.profile-joined').stop(true, true).show(300);
			$(this).find('.profile-rank').stop(true, true).show(300);
			$(this).find('.profile-posts').stop(true, true).show(300);
				var txt1 = '<span id="temp_added_text" style="display: block; padding-left: 70px;"><br/>&#9650;<br/><br/></span>';
			$(this).find('.profile-contact').append(txt1);
		}


})
 $('body').on('mouseleave', '.postprofile', function() {
		if ($(window).width() > 843) {
			$(this).find('.avatar img').stop(true, true).css({margin: '-20px 0 -40px 0'});
			$(this).find('.profile-custom-field').stop(true, true).hide();
			$(this).find('.profile-joined').stop(true, true).hide();
			$(this).find('.profile-rank').stop(true, true).hide();
			$(this).find('.profile-posts').stop(true, true).hide();
			$(this).find('#temp_added_text').remove();
		}
})


спасибо вам огромное!

рони 18.11.2014 01:58

alecto,
может есть элемент ближе чем body - меньше нагрузка

alecto 18.11.2014 02:15

#posts - "обертка" всех сообщений на странице и, он ближе чем body.
попробовал - работает.
большая нагрузка получается?

alecto 18.11.2014 02:18

<div id="posts">
      <div id="p73275" class="post has-profile bg2 online">
         <div class="inner">
            <dl id="profile73275" class="postprofile">
            <div class="postbody">
            <div class="back2top">
         </div>
     </div>
     <hr class="divider">
   <div id="p73299" class="post has-profile bg1">
     <hr class="divider">
   <div id="posts_content">
   <div id="post_ajax">
</div>

alecto 18.11.2014 02:25

если я правильно понимаю механизм, то события мыши вызываются для каждого элемента, входящего в #posts, а дальше выполняется проверка на принадлежность классу postprofile? т.е. таких вызовов могут быть сотни или тысячи, в зависимости от содержимого и количества сообщений?
в первоначальном варианте события мыши назначались максимум 10 элементам на странице.

или я ошибаюсь?

рони 18.11.2014 02:26

Цитата:

Сообщение от alecto
большая нагрузка получается?

всё зависит от количества элементов на странице среди которых 'наш'

рони 18.11.2014 02:28

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

alecto 18.11.2014 02:28

сообщения могут содержать десятки и сотни изображений со своими "обертками" дивами + текст со своим форматированием, видео и тд и тп.
т.е. минимум - сотни элементов, максимум - многие тысячи.
поэтому актуально...
Цитата:

если я правильно понимаю механизм, то события мыши вызываются для каждого элемента и их дочерних элементов, входящих в #posts, а дальше выполняется проверка на принадлежность классу postprofile? т.е. таких вызовов могут быть сотни или тысячи, в зависимости от содержимого и количества сообщений?
в первоначальном варианте события мыши назначались максимум 10 элементам на странице.


Часовой пояс GMT +3, время: 17:38.