Dostęp do identyfikatora elementu na którym wykonano zdarzenie

0
function xxx() {
for ( var i = 1; $("#menu"+i).length; i++)
	{	
	$('#menu'+i).click( function() { prezentacja() });
	}


	
}

function prezentacja() {

alert(this.id);


} 

Ogólnie chodzi mi o to zeby w pętli móc przypisać zdarzenie poszczególnym elementom , a następnie w wywołac odpowiednia funkcję. I tuaj chciałbym uzyskać dostęp do identyfikatora elementu na którym zostało wykonane zdarzenie click.. ale niestety zwracane jest "undefined". co robie zle?

0
function xxx() {
for ( var i = 1; $("#menu"+i).length; i++)
	{	
	$('#menu'+i).click(prezentacja);
	}


	
}

function prezentacja() {

alert(this.id);


} 

zamiast pętli nadaj tym elementom na przykład klasę i potem możesz przypisać funkcję click jedną linią

$('.nazwaklasy').click(prezentacja);

0

niestety podany przez ciebie przykład nie działał.
rozwiązałem to w ten sposób

function xxx()
{

	$('#menu'+i).click( function() { var a = "#"+this.id; prezentacja(a,i) });
	

	
}
	
function prezentacja(a,i) {
alert(a)
}

.class nadać nie mógłbym ponieważ kazdy z elementów ma inne położenie i inne tła, więc musza mieć odrebny identyfikator..

0

Odpowiadałem już w Twoim topiku - nadaj elementowi nadrzędnemu do tych menusów jakąś klasę, id, i wybieraj elementy menu wg #glowne menu>a albo nawet bez zmieniania kodu: [id^=menu] - i używaj tego selektora zamiast tworzyć taki OHYDNY for (n razy wybranie elementów (przy sprawdzaniu length), potem znowu wybieranie tego elementu selektorem - ale to znowu oznacza przelecenie przez cały DOM). Czyli mając menu z 5 elementami lecisz przez DOM aż 5x5 razy! A możesz zrobić to zgrabnie o tak:

$('[id^=menu]').click(function(){ var id=$(this).id; prezentacja('#'+id, id.replace('menu', '')); });

Tutaj elementy z DOM wybierasz raz i robi dokładnie to samo.

0

Kilka rzeczy tu jest źle. Konkretnie:

dlaczego alert(this.id) wyświetliło undefined:
ponieważ funkcja prezentacja nie została wywołana jako metoda (obj.prezentacja()) i nie nastąpiło powiązanie this z obiektem, zamiast tego this jest referencją do obiektu window, a widocznie window.id nie zostało zadeklarowane.

Odnośnie do posta dzek69:

wybieranie tego elementu selektorem - ale to znowu oznacza przelecenie przez cały DOM

Nieprawda. Selektor, który odwołuje się do jakiegoś ID nie przeszukuje całego DOMu, nawet kawałka. Elementy, które mają ID są spamiętane w tablicy i odwołanie do nich jest szybkie (więc jQuery nie jest głupie i nie przeszukuje DOM bez potrzeby).

Skoro chcesz przypisać funkcję w jQuery na jakieś zdarzenie elementom i ta funkcja ma zależeć od ID tych elementów to najlepiej zrobić to tak:

jakasFunkcja(idElementu) {
  // możemy wydobyć z tego stringa liczbę
  // i coś z tą liczbą zrobić
}

$('.element').click(function (event) {
  jakasFunkcja(event.target.id);
});
0
kobylecki napisał(a)

Nieprawda. Selektor, który odwołuje się do jakiegoś ID nie przeszukuje całego DOMu, nawet kawałka. Elementy, które mają ID są spamiętane w tablicy i odwołanie do nich jest szybkie (więc jQuery nie jest głupie i nie przeszukuje DOM bez potrzeby).

Brzmi to trochę nieprecyzyjnie, więc pozwolę sobie wyjaśnić.

Istnieje popularna w programowaniu funkcyjnym (w JavaScripcie również) technika zwana "spamiętywaniem". jQuery samo w sobie jednak niczego takiego nie robi dla ID-ków. jQuery dla ID-ków idzie na skróty i nie przegląda ręcznie DOM, ale jednak wywołuje jedną metodę DOM -- szybkie .getElementById().

To, jak przeglądarki implementują .getElementById() zależy od... implementacji. Obecnie jednak faktycznie keszują sobie ID-ki. Oczywiście, nie z w zwykłej "tablicy", tylko tablicy mieszającej/hashmapie (ang. hashtable).

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