Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [JavaScript]Jak znaleźć element a potem jego parent?
phpamator
post
Post #1





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/wink.gif)

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

pozdrawiam
amator

Ten post edytował phpamator 1.09.2017, 21:16:39
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Chcesz wybrać elementy, których dzieci mają określone id lub nazwę, czy elementy, które posiadają w innerHTML jakiś string?
Go to the top of the page
+Quote Post
phpamator
post
Post #3





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


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 ?


Ten post edytował phpamator 1.09.2017, 21:35:30
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
phpamator
post
Post #5





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


Nie wiem jak "sprawdzić innerHtml rodzica pod względem zawartości stringu" ...


Ten post edytował phpamator 1.09.2017, 23:00:04
Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Nie rodzica, innerText rodzica.
Go to the top of the page
+Quote Post
phpamator
post
Post #7





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


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ę ...

Ten post edytował phpamator 1.09.2017, 23:35:12
Go to the top of the page
+Quote Post
trueblue
post
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Kod
span.filter-title:contains('"+blockName+"')
Go to the top of the page
+Quote Post
phpamator
post
Post #9





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaa
hahahah
no to ci powiem, że nic z tego, nie działa (IMG:style_emoticons/default/wink.gif)
Za to działa tak:

  1. var block = jQuery('span.filter-title:contains("'+blockName+'")').parent().parent().html();


Ten post edytował phpamator 2.09.2017, 19:54:22
Go to the top of the page
+Quote Post
trueblue
post
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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();
Go to the top of the page
+Quote Post
Pyton_000
post
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


albo `.closest('div.layered-navigation.option-block')`
Go to the top of the page
+Quote Post
phpamator
post
Post #12





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/wink.gif)

chociaż wersja a'la python_000 też jest ok (IMG:style_emoticons/default/smile.gif)

Dzięki panowie (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/wink.gif)

Go to the top of the page
+Quote Post
trueblue
post
Post #13





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Nie dodałem również nawiasów, jQuery, itd. Bez przesady. Podałem Ci fragment, w którym jest błąd.
Go to the top of the page
+Quote Post
phpamator
post
Post #14





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


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.

Ten post edytował phpamator 4.09.2017, 14:29:38
Go to the top of the page
+Quote Post
trueblue
post
Post #15





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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?

Go to the top of the page
+Quote Post
Pyton_000
post
Post #16





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


i `block.lenght > 0` bo zdaje się że jQ i tak zwróci obiekt ale bez rezultatów.
Go to the top of the page
+Quote Post
phpamator
post
Post #17





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
trueblue
post
Post #18





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Indeksy swoją drogą. Wtedy blockName jest dostępny bezpośrednio.
Wprowadziłeś warunek, o którym pisał Pyton_000?
Go to the top of the page
+Quote Post
phpamator
post
Post #19





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


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.

Ten post edytował phpamator 4.09.2017, 15:20:22
Go to the top of the page
+Quote Post
trueblue
post
Post #20





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A nie prościej by było napisać, co nadal nie działa?
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 12:18