Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JS][Jquery]Odwołanie się do elementu
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
grzes999
Witam
Mam na stronie kilka divów z taka samą zawartoscią czyli

  1. <div id="strona">
  2. <img src="img/slide-1.jpg" width="20%" height="20%" />
  3. <p id="opis">Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>
  4. <p id="dostepna">online <span id="tak">dostepna</span></p>
  5. <p id="www" style="display:none"><a href="#">www.inna_strona.pl</a></p>
  6. </div>


I teraz w JS chcę aby po kliknieciu spana o id tak wyświetliło się p o id www.Kod, który napisaęłm działa ale tylko do pierwszego diva i nie bardzo wiem jak się odwołać do poszczegołnych divów sad.gif próbowałem this ale nie wychodzi mi to za bardzo sad.gif

Oto mój kod JS

  1. $(function () {
  2. $('#tak').click(function () { $('#www').slideDown('normal')
  3. });
  4. });
kamil4u
Id musi być unikalne. Użyj klasy i pętli.

I opisz problem dokładniej, bo ciężko zrozumieć teraz.
grzes999
Po prostu w dive znacznik p o id www czli to

  1. <p id="www" style="display:none"><a href="#">www.inna_strona.pl</a></p>


jest ukryte i chce żeby po kliknięciu w

  1. <span id="tak">dostepna</span>


Wyświetlil www pod spodem. I wszystko działa tylk chodzi o to w jaki sposób to zapisać żeby po kliknięciu pokazywało się to co chce. Gdyż na stronie będzie kilka takich miejsc i będą one generowane automatycznie. A jeszcze jaśniej chodzi o to jak napisać jak najkrytszy kod w JS żeby to działało bo można pisać dla każdego elementu osobny kod ale mija to się z celem.
piotr.mroczek
możesz np. nadać poszczegołnym parom elementów tą samą klasę, jak klikniesz jeden, to szukasz drugiego z taka sama klasa i zmieniasz mu np styl na display:block
musisz po prostu powiązać jakoś te elementy. ew zawsze możesz jawnie przekazywać argument do funkcji (np id elementu do odkrycia) i po nim szukać elementu
zegarek84
Cytat(kamil4u @ 19.02.2012, 16:30:33 ) *
Id musi być unikalne.

Powinno być unikalne ale nie musi (choć taka zasada potem znacznie ułatwia pracę - no jakiś zasad powinno się przestrzegać) - sam o tym zapomniałem jak na szybko komuś pomagałem a byłem po treningu i 3 piwach.
jQuery optymalizuje zapytanie i przy odwołaniu do id korzysta z .querySelector(), gdzie możesz się przekonać, iż można odszukać wszystkie id korzystając z metody .querySqlectorAll()... więc by jQuery nie optymalizowało wyszukiwania wystarczy zapisać w tej formie:
$('[id="tak"]')
wzorując się na kodzie wyżej, i na tym, iż dany "p" jest stale względem wcześniejszego klikniętego spana w tej samej pozycji napisałem kodzik z palca (jeśli miało by szukać po id to kod musiałby być dłuższy i byłby mniej optymalny gdyż wcześniej trzeba by sprawdzić, na której pozycji jest klikany span):
[JAVASCRIPT] pobierz, plaintext
  1. $(function(){
  2. $('[id="tak"]')
  3. .click(
  4. function(){
  5. $(this).parent().next().slideDown('normal');
  6. }
  7. );
  8. });
[JAVASCRIPT] pobierz, plaintext

powinno zadziałać ale nie gwarantuję
kamil4u
Cytat
Powinno być unikalne ale nie musi


http://www.w3.org/TR/html4/struct/global.html#h-7.5.2
Cytat
This attribute assigns a name to an element. This name must be unique in a document.


Oczywiście można się "kłócić" czy to właśnie W3C jest jedynym,właściwym źródłem, ale na chwilę obecną to ona wyznacza standardy.
zegarek84
dlatego napisałem, że powinien być unikalny... a ponieważ powyższy kod działa (a przynajmniej wyszukiwanie większej liczby elementów o tym samym id nawet przez document.querySelectorAll('#moje_id') oraz style CSS) dodałem, że nie musi ;p
grzes999
Wielkie dzięki za pomoc właśnie o takie coś mi chodziło. Temat można zamknąc.
kamil4u
@zegarek84: Z tego się później rodzą same problemy. W manualu jak wół jest napisane must be, a to, że przeglądarki są idiotoodporne to zupełnie inna kwestia. Nie bez powodu wymyślono atrybut class. Później ktoś robi stronę, jest "mistrzem" HTML,a jak przyjdzie dodać coś przez JS, to wychodzi z tego jedno wielkie g i trzeba przerabiać całą stronę. Należy i zawsze trzeba używać tego samego atrybutu id tylko raz! Nie ma od tego wyjątków. A Twoje argumenty, że można bo działa, to tak jakbyś napisał, że dodawanie można zastąpić mnożeniem, bo 2+2=2*2( id można zastąpić klasą, bo działa .querySelectorAll ).

-----------
Nie patrzyłem dawno w źródła jQuery, ale chyba $ korzysta z .querySelectorAll, a co za tym idzie dla starszych przeglądarek używane jest zwykłe .getElementById, co z kolei powoduje różne wyniki dla różnych przeglądarek(nowsza, starsza): http://jsfiddle.net/zh7S5/

Ty co prawda zastosowałeś sztuczkę, żeby wymusić szukanie po atrybucie, a nie wprost po DOM, ale początkujący tak nie zrobią( nie wpadną na to), a po drugie znacznie wydłużasz czas poszukiwania elementów.

Nie widzę żadnych zalet takiego rozwiązania, a początkującym może się wszystko pomieszać i później tylko narzekają, że coś im nie działa.
zegarek84
nie namawiam, by tak robić, wręcz przeciwnie, pisałem, że id powinien być unikalny

jQuery korzysta albo z .getElementById albo z .querySelector po znalezieniu hash'a (nie z .querySelectrorAll) w celu optymalizacji i w myśl poprawnych zasad... swoją drogą silnikiem selektorów CSS w jQ jest biblioteka Sizzle...

swoją droga na podanym przykładzie w jsfiddle masz błąd gdyż .getElementById podobnie jak .querySelector zwraca bezpośrednio element lub null, więc nie mają własności .length - tą własność mają dynamiczne listy (nie pamiętam nazwy, coś w stylu DOMList) oraz tablice, dynamiczne listy są zwracane przez .querySelectorAll, .getElementsByTagName itp.
kamil4u
Wiem, że nie mają - właśnie po to dałem "|| 0", żeby pokazać, że nie mają tej własności(length) a co za tym idzie nie da się poprawnie pobrać wszystkich elementów DOM( o tym samym ID ) przez getElementById(jak w przykładzie). To był taki skrót myślowy i mój błąd, że nie opisałem dokłądniej smile.gif

Pisałem to bardziej po to, żeby inni( początkujący ) wiedzieli, że tak nie wolno robić. Lepiej użyć słowa musi, niż powinno. Doskonale wiem, że Ty to wiesz i sobie bez problemu poradzisz w takiej sytuacji, Twoja wiedza z JS jest spora. Ale czytałem już tematy o powtarzających się id i później ktoś odpowiadał mi, że to nie jest błąd i trzeba zmienić JS, a nie HTML, bo wcześniej "działało". Rodzi to niepotrzebne problemy.

Bardziej zwróciłem uwagę na inną część Twojego postu: "dodałem, że nie musi ;p". Musi biggrin.gif
Skończymy dyskusję, bo mamy w gruncie rzeczy to samo zdanie. Powtórzę: Moja dygresja dotyczyła początkujących.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.