Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Событие click вызывается несколько раз. Почему? (https://javascript.ru/forum/jquery/30917-sobytie-click-vyzyvaetsya-neskolko-raz-pochemu.html)

rusbody 20.08.2012 15:16

Событие click вызывается несколько раз. Почему?
 
Здравсвуйте!

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

Заходим сюда http://rusbody.com/photonew/1.html и жмём на ссылку "Открыть модальное окно" Во сплывшем окне, полистайте пару раз фото (вперед, назад) и закройте модальное окно.

Потом если вы ещё раз нажмёте на ссылку "Открыть модальное окно" то она будет загружать два раза вподряд - В этом и есть косяк.


Вот код

$(document).ready(function(){
		// ставим ссылки
		photossilki();
		
			 
		  
	  
function photocontent(link,pid) {
				$.ajax({
				  type: 'POST',
				  url: link,
				  data: {pid: "pid"},
				  success: function(data){
					$(".rcontent").html(data + "<div class='photo-load'></div>");
					window.location.hash = "photo_" + pid;
					$(".body2").css("height", $(document).height()).show();
					$(".photo-load").hide();
					photossilki();
					//alert("ok");
				  },
				  error: function(xhr, textStatus, error){
					  $(".rcontent").html(xhr.statusText);
				  }
				});
				
					
			};
	  
function photossilki() {	
		
	      $("a.pr").click(function(){			
 		    $(".body").css("overflow", "hidden");  			
			var pid = $(this).attr("id");
			var link = $(this).attr("href");
			$(".body2").show();	
			$(".photo-load").show();
			//$(".rcontent").html("Загрузка..."); 
			
			photocontent(link,pid);
			return false;
	      });
		  
		  }

LittlePony 20.08.2012 15:53

просто в порядке предположения, может и дурацкого: а не происходит ли $(document).ready() при загрузке аяксового контента?

LittlePony 20.08.2012 15:55

А! невнимательность же, извините.
В функции photocontent вызов функции photossilki, в которой обработчик на клик навешивается ещё раз.
http://api.jquery.com/one/
должно решить проблему.

rusbody 20.08.2012 16:04

Цитата:

photossilki, в которой обработчик на клик навешивается ещё раз
Да именно в этом и вся загвоздка! Эту функцию я вешаю, чтобы на ссылки повесить события. как решить проблему?

Спасибо за быстрый ответ, но ONE проблему не решило :(

LittlePony 20.08.2012 16:13

Цитата:

Сообщение от rusbody (Сообщение 199065)
Эту функцию я вешаю, чтобы на ссылки повесить события.

На новые ссылки, подгруженные аяксом? Тогда нужно не .click() использовать, а .live():
$("a.pr").live("click",function(){…})

rusbody 20.08.2012 16:42

тоже не помогло, первый раз работает, а на новые ссылки не срабатывает

LittlePony 20.08.2012 17:05

а что-то я не вижу новых ссылок с классом pr.
Что вообще должно происходить? Какой результат ожидается?

rusbody 20.08.2012 17:08

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

Deff 20.08.2012 19:01

rusbody, Танцы c Бубном :
function photossilki() {   
  $("a.pr").one('click', function(){

rusbody 20.08.2012 21:39

Deff пробовал, всё равно несколько раз загружется

Deff 20.08.2012 22:16

rusbody,
Тады ток вживую дебажить - на слух - тяжко

melky 20.08.2012 22:17

для начала обновите jQuery.
потом пробните так, должно работать.
$(document).ready(function () {
	// ставим ссылки
	$("body").on("click", "a.pr", function () {
		$(".body").css("overflow", "hidden");
		var pid = $(this).attr("id");
		var link = $(this).attr("href");
		$(".body2").show();
		$(".photo-load").show();
		//$(".rcontent").html("Загрузка..."); 

		photocontent(link, pid);
		return false;
	});

	function photocontent(link, pid) {
		$.ajax({
			type: 'POST',
			url: link,
			data: {
				pid: "pid"
			},
			success: function (data) {
				$(".rcontent").html(data + "<div class='photo-load'></div>");
				window.location.hash = "photo_" + pid;
				$(".body2").css("height", $(document).height()).show();
				$(".photo-load").hide();
				//alert("ok");
			},
			error: function (xhr, textStatus, error) {
				$(".rcontent").html(xhr.statusText);
			}
		});


	};
});

rusbody 20.08.2012 22:33

melky не работает, посмотри

melky 20.08.2012 22:42

Цитата:

Сообщение от rusbody (Сообщение 199198)
melky не работает, посмотри

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

rusbody 21.08.2012 09:18

Ну а дальше страницы вообще не листаются

LittlePony 21.08.2012 10:11

rusbody, так всё же что должно в итоге получиться? Каков ожидаемый результат? Может нужно всего лишь написать попроще, и тогда всё заработает.

rusbody 21.08.2012 11:48

Допетрил сам) Нужно удалять старые bindы перед установкой нового!

Спасибо всем, кто пытался мне помочь

Deff 21.08.2012 14:16

Цитата:

Сообщение от rusbody
Допетрил сам) Нужно удалять старые bindы перед установкой нового!

Спасибо всем, кто пытался мне помочь
Цитата:

Сообщение от Deff
rusbody, Танцы c Бубном :
function photossilki() {
     $("a.pr").one('click', function(){

Вы просто не ставили скрипт !!! - либо сократили one до on!

rusbody 21.08.2012 15:24

Deff ставил, результат был тот же

Deff 21.08.2012 15:35

rusbody, Слабо вериться
one =>http://jquery-docs.ru/Events/one/#typedatafn

Единственный обработчик , который срабатывает единожды и снимается
наверно сократили до on

rusbody 21.08.2012 15:45

Deff, зачем мне тебе врать? пишу же что не помогло

Deff 21.08.2012 15:51

rusbody,
Ок -просто интересно было убедицо -
Тогда вывод - что функция вызывается - а клика может и не происходить - тогда обработка по клику присоединяется к очередному вызову функции

rusbody 21.08.2012 16:17

Это и происходило


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