Użycie dwukrotnie tego samego elementu DOM

0

Witam forumowiczów!

Mam mały problem z jquery:(
Mianowicie - nie mogę 2 razy wyciągnąć tego samego elementu z DOM
za pomocą funkcji wybieram wszystkie elementy listy (li) i je sortuje potem chce aby po kliknięciu w jeden z elementów otworzył się dialogbox (jquery ui) i albo działą mi jedno albo drugie - razem ni cholery;/

kod jest następujący:

$(document).ready(function(){
// FRAGMENT ODPOWIADAJACY ZA DIALOG BOX	
	var $loading = $('<img src="loading.gif" alt="loading" class="loading">');
		$('#stage li a').each(function() {
			var $dialog = $('<div></div>')
				.append($loading.clone());
			var $link = $(this).one('click', function() {
				$dialog
					.load($link.attr('href') + ' #content')
					.dialog({
						title: $link.attr('title'),
						width: 500,
						height: 300
					});
				$link.click(function() {
					$dialog.dialog('open');
					return false;
				});
				return false;
			});
		});
//KONIEC FRAGMENTU DIALOGBOX
//FRAGMENT ODPOWIADAJACY ZA SORTOWANIE ITP		
	var items = $('#stage li'),
		itemsByTags = {};
	
	items.each(function(i){
		var elem = $(this),
			tags = elem.data('tags').split(',');
		
		elem.attr('data-id',i);
		
		$.each(tags,function(key,value){
			
			value = $.trim(value);
			
			if(!(value in itemsByTags)){
				itemsByTags[value] = [];
			}
			
			itemsByTags[value].push(elem);
		});
		
	});

	createList('Wszystkie',items);

	$.each(itemsByTags,function(k,v){
		createList(k,v);
	});
	
	$('#filter a').live('click',function(e){
		var link = $(this);
		
		link.addClass('active').siblings().removeClass('active');
		
		$('#stage').quicksand(link.data('list').find('li'));
		e.preventDefault();
	});
	
	$('#filter a:first').click();
	
	function createList(text,items){
		var ul = $('<ul>',{'class':'hidden'});
		
		$.each(items,function(){
			
			$(this).clone().appendTo(ul);
		});

		ul.appendTo('#container');
		
		var a = $('<a>',{
			html: text,
			href:'#',
			data: {list:ul}
		}).appendTo('#filter');
	}
//KONIEC FRAGMENTU SORTOWANIA
});

I tak jak wytne fragment odpowiedzialny za sortowanie to nie ma problemu aby po kliknieciu w element listy wyswietlil sie dialog box, jeśli wszystko jest razem to sortowanie działa ale po kliknieciu na link (który miał otworzyć dialogboxa) zostaje po prostu przenoszony do strony która miałą wylądować w dialogu.

struktura strony wygląda następująco:

        <nav id="filter"></nav>

        <section id="container">
              <ul id="stage">
            	<li data-tags='tag1 tag2 '><a href="a.htm"><img src='4.jpg' alt="opis" /></a></li>
                <li data-tags='tag1  '><a href="b.htm"><img src='4.jpg' alt="opis" /></a></li>
                <li data-tags='tag2 tag3'><a href="c.htm"><img src='4.jpg' alt="opis" /></a></li>


               </ul>
        </section>

//edit
Macie jakieś propozycje jak to rozwiązać?
co jest nie tak?

0

Jeden trop, trochę na ślepo, bo nie miałem czasu się w to wgłębiać (tym bardziej że używasz zewnętrznego pluginu, który też musiałbym pewnie przeanalizować)

We fragmencie odpowiedzialnym za dialog dodajesz funkcje obsługi zdarzenia click do linków wewnątrz listy. Potem jednak sortowanie zapewne usuwa te elementy. Być może tworzy ich kopie, ale nie są to już dokładnie te same elementy, do których dodałeś funkcje obsługi zdarzenia click.

Rozwiązanie: delegacja zdarzeń. W kodzie dialogów, zamiast dodawać funkcje obsługi zdarzenia bezpośrednio do linków, wywołaj np. na samej liście (elemencie ul) metodę .on("click", "a", ...) (poczytaj o metodzie .on() w dokumentacji: http://api.jquery.com/on/ ). Zadziała to tak, że obsługa zdarzenia będzie podpięta tak naprawdę pod listę, a nie pod poszczególne linki. Będzie przechwytywała wszystkie zdarzenia click, jakie zajdą wewnątrz listy. Ale odpali Twoją funkcję obsługi zdarzenia tylko jeśli kliknięty zostanie link. Wewnątrz funkcji obsługi zdarzenia, this będzie wskazywało na kliknięty link. Jeśli żaden kod nie usuwa tak naprawdę samej listy, a tylko jej zawartość, to to zadziała: obsługa zdarzenia cały czas będzie przypięta do (nienaruszonej) listy.

0

Chyba niezbyt rozumiem...

Może więcej pokaże całościowa strona - http://labs.myfreak.pl/mama/ ?

Jeśli dobrze analizuje kod to nigdzie nie jest usuwana lista elementów... siedzę już nad tym sporo czasu i no nie wiem, może już po prostu nie widzę co jest nie tak a muszę to szybko skończyć bo święta tuż tuż a ręcznie haftowane kartki czekają :)

eksperymentowałem z tym .on() ale dalej nic;/
setny raz sprawdzam linia po linii i nie widzę niczego co mogłoby być nie tak, javascript muszę jeszcze poćwiczyć niestety ale termin goni - czy ktoś mógłby pomóc znaleźć błąd/poprawić bo ja już nie mam pomysłów :(

Znowu kombinowanie na wielką skale wedle Twoich podpowiedzi ale dalej nici... czy mógłbym prosić o konkretniejsze wskazówki bo albo Cie nie zrozumiałem albo coś robię nie tak...

0

Może przepisz cały kod jeszcze raz?
Wtedy na bieżąco będziesz widział co piszesz i zobaczysz błąd?

1 użytkowników online, w tym zalogowanych: 0, gości: 1