Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]Jak znaleźć element a potem jego parent?
Forum PHP.pl > Forum > Przedszkole
phpamator
Pytanie do specjalistów od jQuery.
Chciałbym posegregować elementy według pewnej kolejności którą że tak powiem mam w tablicy.
Wybierając kolejno z tablicy identyfikator chę wyszukać element posiadający takie id bądź nazwę i przenieść we wskazane miejsce.
Brzmi może dzwnie ale ... cóż tak chciałbym zrobić.
Samo znajdowanie elementu to nie problem, problem jak teraz wskazać "rodzica" tego elementu i go wyciągnąć wraz z całą zawartością (.html()).

Przykład:
  1. <dl class="filter-block">
  2. <!-- blok do przeniesienia pogrubiony o ile zgadza się string .text() ze span class="filter-title" -->
  3. <div class="layered-navigation option-block">
  4. <div childblock_id="manufacturer" class="odd option-block-head toggle-block" style="cursor: pointer;">
  5. <!-- element wyszukiwany w/g klasy 'filter-title' .text() -->
  6. <span class="filter-title">Brands</span>
  7. <span class="open-close">+</span>
  8. </div>
  9. </div>
  10.  
  11. <div class="layered-navigation option-block">
  12. <div childblock_id="price" class="odd option-block-head toggle-block" style="cursor: pointer;">
  13. <span class="filter-title">Price</span>
  14. <span class="open-close">+</span>
  15. </div>
  16. </div>
  17. </dl>

czyli jeśli w tablicy znajduje się określony string wybierz TEN element/blok $('div .layered-navigation,.option-block').html()
tylko nie wiem jak zrobić z niego 'this' jeśli znajduje się w nim lub jego dziecku wskazany string.
mam nadzieję, że się jasno wyraziłem wink.gif

W międzyczasie znalazłem to: https://api.jquery.com/child-selector/ ...
ale nie do końca czaję ...

pozdrawiam
amator
trueblue
Chcesz wybrać elementy, których dzieci mają określone id lub nazwę, czy elementy, które posiadają w innerHTML jakiś string?
phpamator
Dziecko dziecka zawiera tekst i po tym tekście rozpoznaję, następnie muszę zebrać innerHtml z parenta tego dziecka dziecka
czyli tak:
  1. <div name="rodzic">
  2. <div name="pierwsze_dziecko">
  3. <div>
  4. <span name="drugie_dziecko">Moj string</span>
  5. </div>
  6. </div>

czyli znajduje "mój string" i muszę zdefiniować to co jest jego rodzicem i dopiero zebrać cały html() rodzica i przenieść.

ooo ale jeśli mogę wybrać rodzica który ma dziecko z określonym stringiem to chyba też będzie ok ?
trueblue
Skoro dzieci Ciebie nie interesują, to sprawdzałbym każdego rodzica pod względem zawartości stringu w innerText. Wtedy nie musisz się zagłębiać w dzieci.
Chyba, że tekst ma być określonym dziecku/tagu.
phpamator
Nie wiem jak "sprawdzić innerHtml rodzica pod względem zawartości stringu" ...
trueblue
Nie rodzica, innerText rodzica.
phpamator
wymyśliłem tak:
[JAVASCRIPT] pobierz, plaintext
  1. var blockName = newOrder[i][1];// newOrder[i][1] to oczywiście szukany string pobrany z tablicy
  2. var block = jQuery("span.filter-title:contains(blockName)").parent().parent().html();
  3. // ale nie bardzo chce mi podstawić szukany string
[JAVASCRIPT] pobierz, plaintext


co źle zrobiłem ?
http://jsfiddle.net/SayjQ/59/ to mi pomogło trochę ...
trueblue
Kod
span.filter-title:contains('"+blockName+"')
phpamator
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaa
hahahah
no to ci powiem, że nic z tego, nie działa wink.gif
Za to działa tak:

  1. var block = jQuery('span.filter-title:contains("'+blockName+'")').parent().parent().html();
trueblue
A ja Ci powiem, że działa zarówno tak jak podałeś, jak i:
  1. var block = jQuery("span.filter-title:contains('"+blockName+"')").parent().parent().html();

ale Ty pewnie pomieszałeś kolejność cudzysłowów.

A skoro chcesz pobrać od razu rodzica, to tak będzie czytelniej:
  1. var block = jQuery("div.layered-navigation.option-block span.filter-title:contains('"+blockName+"')").html();
Pyton_000
albo `.closest('div.layered-navigation.option-block')`
phpamator
Zdecydowanie nie działało ale nie będę się sprzeczał, nie uwzględniłeś zewnętrznych '' i napisałeś span.filter-title:contains('"+blockName+"')
dlatego poniższy kod robił NIC wink.gif
var block = jQuery('span.filter-title:contains('"+blockName+"')').parent().parent().html();
aaaale po zmianie owszem, działa.

Bardziej podoba mi się jednak ta druga forma wink.gif

chociaż wersja a'la python_000 też jest ok smile.gif

Dzięki panowie smile.gif

to jednak było prostsze niż początkowo myślałem, przy okazji nauczyłem się co nieco jak można zmyślnie łączyć niektóre parametry, żeby wyszukać interesujący element wink.gif

trueblue
Nie dodałem również nawiasów, jQuery, itd. Bez przesady. Podałem Ci fragment, w którym jest błąd.
phpamator
Działa, działa ale ..... coś nie do końca jak oczekiwałem.
Popatrzcie i podpowiedzcie proszę co źle zrobiłem albo jaka jest szansa, że to wogóle będzie robiło to o czym mówiłem.

[JAVASCRIPT] pobierz, plaintext
  1. jQuery(document).ready(function(){
  2. //Variables & arrays
  3. var i = 0;
  4. var block ='';
  5. var blockName = '';
  6. var newOrder = [[1,'Brands'],[2,'Price'],[3,'Number of Cameras Supported'],[4,'Screen Size'],[5,'Split Screen'],[6,'Touch Screen'],[7,'Pan & Tilt'],[8,'Zoom'],[9,'Room Temp'],[10,'Lullabies'],[11,'Wi-Fi'],[12,'Nightvision'],[13,'Light Projector'],[14,'Two-Way Talk'],[15,'Temperature Display'],[16,'Recordable'],[17,'Outdoor Range (Metres)']];
  7. // each leci po kolei wszystkie elementy tablicy i wyszukuje w/g nich na stronie, jak znajdzie przenosi w inne miejsce
  8. // czy to tak działa czy coś mi się wydaje, że to tak działa ?
  9. // bo coś mi się wydaje, że nawet po przeniesieniu może znajdowaćjuż przeniesione i robić bałagan.
  10. // dlatego wyszukiwanie musi być tylko w określonym rodzicu ..... ale może mi się tylko wydaje :)
  11. // po przeładowaniu powinien cały proces wykonać od początku .... prawda ?
  12. jQuery.each(newOrder,function(){
  13. blockName = newOrder[i][1];
  14. block = jQuery('span.filter-title:contains("'+blockName+'")').parent().parent().html();
  15. if (block) {
  16. console.log(blockName);
  17. jQuery('span.filter-title:contains("'+blockName+'")').parent().parent().remove();
  18. jQuery('#narrow-by-list').prepend(block);
  19. i++;
  20. }else{
  21. console.log(blockName+' not found');
  22. }
  23. })
  24. })
[JAVASCRIPT] pobierz, plaintext


Może przykład jest beznadziejnie prosty może wręcz banalny ale jeszcze nie czaję tego.
trueblue
Uprościłbym pętlę skoro korzystasz z each.

  1. //bez deklaracji i wyżej
  2. jQuery.each(newOrder, function(i, blockName){
  3. //nazwa bloku jest w blockName[1]
  4. //bez inkrementacji i


Przecież jeśli przenosisz element w innej miejsce, to i tak nie szukasz go w pętli ponownie. Jeśli przeniosłeś Brands, to w kolejnej iteracji szukasz Price.

Jak się objawia ta usterka?

Pyton_000
i `block.lenght > 0` bo zdaje się że jQ i tak zwróci obiekt ale bez rezultatów.
phpamator
Cytat(trueblue @ 4.09.2017, 14:33:58 ) *
Uprościłbym pętlę skoro korzystasz z each.

  1. //bez deklaracji i wyżej
  2. jQuery.each(newOrder, function(i, blockName){
  3. //nazwa bloku jest w blockName[1]
  4. //bez inkrementacji i


Przecież jeśli przenosisz element w innej miejsce, to i tak nie szukasz go w pętli ponownie. Jeśli przeniosłeś Brands, to w kolejnej iteracji szukasz Price.

Jak się objawia ta usterka?


Tak teoretycznie miało to działać ale ... z jakiegoś powodu podczas wykonywania pętli (wkleiłem tam console.log() żeby widzieć ile z listy przeszło a ile nie przeszło bo może tak być lista/tablica nie zawiera wszystkich tylko niektóre nazwy) jakby przestaje kolejno dodawać/przenosić elementy, działa dobrze praktycznie tylko dla pierwszych 2 czyli Brands i Prices.
Powinienem widzieć też jakie zostały pominięte wraz z nazwami a skrypt pokazuje mi jedną tylko nazwę z ilością powtórzeń.

Czyli co, usunąć indexy, zostawić tylko same nazwy w tablicy mówisz ?
trueblue
Indeksy swoją drogą. Wtedy blockName jest dostępny bezpośrednio.
Wprowadziłeś warunek, o którym pisał Pyton_000?
phpamator
Zmodyfikowałem i faktycznie, lepiej działa i widzę że prawidłowo teraz sortuje a jeśli niema na liście zostawia.

Tak dodałem warunek "a'la python_ooo" ale z nim coś nie halo.
trueblue
A nie prościej by było napisać, co nadal nie działa?
phpamator
No może wink.gif
Po dodaniu block.lenght>0
skrypt przestaje działać po pierwszych 2 nazwach wink.gif

[JAVASCRIPT] pobierz, plaintext
  1. jQuery(document).ready(function(){
  2. //Variables & arrays
  3. var i = 0;
  4.  
  5. var block ='';
  6.  
  7. var blockName = '';
  8.  
  9. var newOrder = ["Brands","Price","Number of Cameras Supported","Screen Size","Split Screen","Touch Screen","Pan & Tilt","Zoom","Room Temp","Lullabies","Wi-Fi","Nightvision","Light Projector","Two-Way Talk","Temperature Display","Recordable"];
  10.  
  11. //var newOrder = [[1,'Brands'],[2,'Price'],[3,'Number of Cameras Supported'],[4,'Screen Size'],[5,'Split Screen'],[6,'Touch Screen'],[7,'Pan & Tilt'],[8,'Zoom'],[9,'Room Temp'],[10,'Lullabies'],[11,'Wi-Fi'],[12,'Nightvision'],[13,'Light Projector'],[14,'Two-Way Talk'],[15,'Temperature Display'],[16,'Recordable'],[17,'Outdoor Range (Metres)']];
  12. //Functions &
  13. jQuery.each(newOrder,function(i,blockName){
  14.  
  15. block = jQuery('span.filter-title:contains("'+blockName+'")').parent().parent().html();
  16.  
  17. if (block.length >0){
  18.  
  19. console.log(blockName);
  20.  
  21. jQuery('span.filter-title:contains("'+blockName+'")').parent().parent().remove();
  22.  
  23. jQuery('#pafka').append(block);
  24.  
  25. }else{
  26.  
  27. console.log(blockName+ ' not found');
  28.  
  29. }
  30.  
  31. })
  32.  
  33. })
[JAVASCRIPT] pobierz, plaintext


Co znowu skopałem ?
trueblue
  1. block = jQuery('span.filter-title:contains("'+blockName+'")');
  2. if (block.length >0){
  3. var blockParent=block.parent().parent();
  4. var htmlParent=blockParent.html();
  5. blockParent().remove();
  6. jQuery('#pafka').append(htmlParent);


Nie musisz dwukrotnie szukać span zawierającego ten tekst, bo przed warunkiem go znalazłeś.
phpamator
Aaaaaa rozumiem ..... jakby trochę wink.gif

przy okazji upraszcza się kod wink.gif

blockParent(). ..... nie jest funkcją smile.gif

i kiedy block.lenght>0 pomija wszystkie i wywala nie znaleziono smile.gif
Pyton_000
co to znaczy że przestaje działać. Co wywala konsola?
phpamator
No własnie wywala błąd "blockParent()" nie jest funkcją więc wywaliłem nawiasy i śmiga ale .lenght >0 powoduje, że nie widzi nazw.
i tak wugląda w konsoli smile.gif
Pyton_000
daj przed ifem

console.log(blockName, block.length);

I pokaż przykładowy cały kod html gdzie są te wartości. Może HTML też jest skopany?
trueblue
Zgadza się:
  1. blockParent.remove()

A co wyświetla console.log(block) przed ifem?
phpamator
teraz jest ok, wyświetla nazwe i 1 albo jeśli nie znalazł nazwe i not found wink.gif

a z długością ... literówka chyba bo nic innego nie mogło być smile.gifsmile.gif


Może by tak zamiast przenosić poprostu posortować według listy w arrayu ?

Pyton_000
to co działa czy nie działa? Pokaż ostatecznie kod jaki masz.
phpamator
Działa,
kod wygląda tak:

[JAVASCRIPT] pobierz, plaintext
  1. jQuery(document).ready(function(){
  2. //Variables & arrays
  3. var i = 0;
  4.  
  5. var block ='';
  6.  
  7. var blockName = '';
  8.  
  9. var newOrder = ["Price","Brands","Number of Cameras Supported","Screen Size","Split Screen","Touch Screen","Pan & Tilt","Zoom","Room Temp","Lullabies","Wi-Fi","Nightvision","Light Projector","Two-Way Talk","Temperature Display","Recordable"];
  10.  
  11. //var newOrder = [[1,'Brands'],[2,'Price'],[3,'Number of Cameras Supported'],[4,'Screen Size'],[5,'Split Screen'],[6,'Touch Screen'],[7,'Pan & Tilt'],[8,'Zoom'],[9,'Room Temp'],[10,'Lullabies'],[11,'Wi-Fi'],[12,'Nightvision'],[13,'Light Projector'],[14,'Two-Way Talk'],[15,'Temperature Display'],[16,'Recordable'],[17,'Outdoor Range (Metres)']];
  12. //Functions &
  13. jQuery.each(newOrder,function(i,blockName){
  14.  
  15. block = jQuery('span.filter-title:contains("'+blockName+'")');
  16.  
  17. console.log(blockName, block.length);
  18.  
  19. if (block.length>0){
  20.  
  21. var blockParent=block.parent().parent();
  22.  
  23. var htmlParent=blockParent.html();
  24.  
  25. blockParent.remove();
  26.  
  27. console.log(blockName+ ' moved')
  28.  
  29. jQuery('#pafka').append(htmlParent);
  30.  
  31. }else{
  32.  
  33. console.log(blockName+ ' not found');
  34.  
  35. }
  36.  
  37. })
  38.  
  39. })
[JAVASCRIPT] pobierz, plaintext
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.