Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [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 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
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 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 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

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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 08:38