internetul Windows. Android

Tehnicienii care lucrează cu dom: elemente părinte, copil și adiacente. Manipulări cu DOM pe JavaScript pur verificând existența filialelor

De regulă, atunci când trebuie să efectuați orice acțiune cu DOM, dezvoltatorii folosesc jQuery. Cu toate acestea, aproape orice manipulare DOM se poate face pe JavaScript pur folosind DOM API.

Luați în considerare acest API în detaliu:

La final veți scrie biblioteca simplă DOM, care poate fi utilizată în orice proiect.

DOM solicitări

Solicitările DOM se efectuează utilizând metoda.QuerySelector (), care este primită ca argument un selector CSS arbitrar.

Const myelement \u003d document.QuerySelector ("# foo\u003e div.bar")

El va returna primul element de fit. Dimpotrivă, este posibil să verificați dacă elementul selectorului corespunde:

MyElement.Matches ("div.bar") \u003d\u003d\u003d Adevărat

Dacă aveți nevoie să obțineți toate elementele corespunzătoare selectorului, utilizați următorul design:

Const myelemente \u003d document.querySelectorall ("bar")

Dacă știți cum să vă referiți la elementul părinte, puteți căuta pur și simplu printre elementele copilului său, în loc să căutați pe tot parcursul codului:

Const mychildelemet \u003d myelement.QuerySelector ("intrare") // în schimb: // document.querySelector ("# foo\u003e div.bar intrare")

Întrebarea apare: de ce utilizați apoi alte metode mai puțin convenabile cum ar fi .gelementsbytagname ()? Există o mică problemă - rezultatul de ieșire .QuerySelector () nu este actualizat și când adăugăm un nou element (vezi), nu se va schimba.

Const elemente1 \u003d document.querySelectorall ("div") const elemente2 \u003d document.getelementsytagname ("div") const nou -element \u003d document.Creeelement (document "div". Lungime \u003d\u003d\u003d Elemente2. Lungime // FALSE

De asemenea, QuerySelectorall () colectează totul într-o singură listă, ceea ce nu face foarte eficient.

Cum să lucrați cu liste?

În plus față de toate U.QuerySelectorall () există două nuanțe mici. Nu puteți doar să apelați metodele rezultatelor și să vă așteptați ca acestea să se aplice fiecăruia (așa cum ați putea fi obișnuiți să o faceți cu jQuery). În orice caz, va fi necesar să sorți toate elementele din ciclu. Al doilea - obiectul returnat este o listă de elemente, nu o matrice. În consecință, metodele de matrice nu vor funcționa. Desigur, există metode pentru liste, ceva de genul .Foreceh (), dar, din păcate, nu sunt potrivite pentru toate cazurile. Deci, este mai bine să convertiți o listă într-o matrice:

// utilizând Array.De () Array.De (MyElements) .Fore "sau prototip (până la ES6) Array.protype.Forech.Call (Myelemente, Dosomenetwitheachelement) // mai ușoară: )

Fiecare element are unele proprietăți care se referă la "familia".

MyElement.Children MyElement.FirsstelmentChild myeelement.LastelementChild myeelement.Previoulementsibling myeelement.nexTelementsibling

Deoarece interfața elementului (element) este moștenită din interfața nodului (nod), sunt prezente și următoarele proprietăți:

Myelement.Childnoduri myeelement.firstchild myeelement.Lastchild myelement.previoussibling myelement.nextsibling myelement.parennode myeelement.parentement

Primele proprietăți se referă la element, iar ultima (cu excepția .parelementului) poate fi listele de elemente de orice tip. În consecință, puteți verifica tipul de element:

Myelement.firstchild.noDetype \u003d\u003d\u003d 3 // Acest element va fi un nod text

Adăugarea de clase și atribute

Adăugați o nouă clasă este foarte simplă:

Myelement.classlist.add ("foo") myeelement.classlist.remove ("bar") myelement.classlist.toggle ("Baz")

Adăugarea unei proprietăți pentru un articol apare la fel ca pentru orice obiect:

// Obținerea valorii atributului const valoare \u003d myelement.Value // Setați atributul ca proprietate a elementului myelement.value \u003d "(! Lang: foo" // Для установки нескольких свойств используйте.Object.assign() Object.assign(myElement, { value: "foo", id: "bar" }) // Удаление атрибута myElement.value = null !}

Puteți utiliza metode.getattribute (), .SetAttribute () i.removeattribute (). Acestea schimbă imediat atributele HTML ale elementului (spre deosebire de proprietățile DOM), care vor determina redresarea browserului (puteți vedea toate modificările studiind elementul utilizând instrumentele de dezvoltator din browser). Astfel de perverți nu numai că necesită mai multe resurse decât instalarea proprietăților DOM, dar pot duce, de asemenea, la erori neașteptate.

De regulă, ele sunt folosite pentru elemente care nu au proprietăți DOM corespunzătoare, cum ar fi Colspan. Sau dacă utilizarea lor este cu adevărat necesară, de exemplu, pentru moștenirea proprietăților HTML (vezi).

Adăugarea stilurilor CSS

Adăugați-le în același mod ca și alte proprietăți:

Myelement.style.marginleft \u003d "2em"

Unele proprietăți specifice pot fi setate folosind .Style, dar dacă doriți să obțineți valori după unele computere, este mai bine să utilizați fereastra.GetComplutestyle (). Această metodă primește un element și returnează CssstyleDeclară, care conține stiluri atât elementul însuși, cât și părintele acestuia:

Fereastră.GetComplutestyle (Myeelement) .GetPropertyValue ("Margin-stânga")

Schimba dom.

Puteți muta elemente:

// Adăugarea elementului1 ca element de ultim element2 Element1.appendandild (element2) // Insert element2 ca element element copil1 în fața elementului element31.vinserbore (element2, element3)

Dacă nu doriți să vă deplasați, dar trebuie să introduceți o copie, folosim:

// crearea unei clone const myelementclone \u003d myelement.clonenode () myparenelement.appendordild (MyelementClone)

Metoda. Clonenode () ia o valoare booleană ca argument, iar elementele copilului sunt, de asemenea, clonate.

Desigur, puteți crea elemente noi:

Const mynewelement \u003d document.creElement ("div") const mynewtextnode \u003d document.createtextnode ("unele text")

Și apoi introduceți-le așa cum se arată mai sus. Nu va funcționa direct pentru a șterge, dar îl puteți face prin elementul părinte:

Myparenelement.removechild (Myeelement)

Puteți contacta și indirect:

Myelement.parentNode.removechild (Myeelement)

Metode pentru elemente

Fiecare element are proprietăți precum .innerhtml i.textcccccccccontent, conțin cod HTML și, în consecință, textul în sine. Următorul exemplu modifică conținutul elementului:

// Schimbați html myelement.innerhtml \u003d `

Conținut nou

beep Boop Beep Boop

`// Astfel, conținutul este șters de MyElement.Innerhtml \u003d Null // Adăugați la HTML MyElement.Innerhtml + \u003d Continuați să citiți ...

De fapt, schimbarea în HTML este o idee rea, deoarece toate modificările făcute mai devreme sunt pierdute, iar manipultorii de evenimente sunt supraîncărcați. Este mai bine să folosiți această metodă numai căderea tuturor HTML și înlocuirea acestuia cu o copie de pe server. Ca aceasta:

Const link \u003d document.creelemente ("a") const text \u003d document.createtextnode ("Continuați lectură ...") const hr \u003d document.creelement ("hr") link.href \u003d "foo.html" link.appendordild ( Text) MyElement.appendandild (link) myeelement.appendandild (HR)

Cu toate acestea, acest lucru va implica doi redrawrs în browser, în timp ce .innerhtml va duce doar la unul. Puteți ocoli-o, dacă mai întâi adăugați totul la documentul de documentare și apoi adăugați un fragment de care aveți nevoie:

Const fragment \u003d document.CreatedocumentFragment () fragment.appendandchild (text) Fragment.appendandild (HR) MyElement.appendandild (fragment)

Stivuitoare de evenimente

Unul dintre cei mai simpli agenți:

Myelement.onclick \u003d funcția onClick (eveniment) (consola.log (eveniment.type + "a fost concediat"))

Dar, de regulă, ar trebui evitată. Aici.onclick este o proprietate de element și, în teorie, îl puteți schimba, dar nu veți putea adăuga alți manipulatori utilizând o altă caracteristică care se referă la cea veche.

Pentru a adăuga manipulatori este mai bine să utilizați.AdDeventlistener (). Este nevoie de trei argumente: tipul de eveniment, funcția care va fi numită de fiecare dată când este declanșată și obiectul de configurare (vom reveni mai târziu la acesta).

MyElement.AdDeventListener ("CLICK", FUNCTION (consola.log))) MyElement.AdDeventlistener ("CLICK", FUNCTION (EVENIMENT) (CONSOLE.LOG (Eveniment.type + "a fost concediat din nou"))

Proprietatea Event.TArget adaugă elementul pentru care evenimentul este fixat.

Și astfel puteți accesa toate proprietățile:

. , Funcție (eveniment) (consola.log (event.target.value))))

Prevenirea implicită

Pentru a face acest lucru, utilizați metoda.preventdefault (), care blochează acțiunile standard. De exemplu, va bloca trimiterea formularului dacă autorizația de pe partea clientului nu a avut succes:

Myform.addeventlistener ("Trimiteți", funcția (const name \u003d this.QuerySelector ("# # nume") dacă (nume.value \u003d\u003d\u003d "(! Lang: Donald Duck") { alert("You gotta be kidding!") event.preventDefault() } }) !}

Metoda.Soppropagare () vă va ajuta dacă aveți un manipulator specific de evenimente, fixat în spatele elementului copil și al doilea manipulator al aceluiași eveniment atribuit părintelui.

Așa cum am menționat mai devreme, metoda .addeventlistener () ia al treilea argument opțional ca obiect cu configurația. Acest obiect trebuie să conțină oricare dintre următoarele proprietăți booleane (implicit toate în valoarea falsă):

  • captură: evenimentul va fi atașat la acest element înainte de orice alt element de mai jos în DOM;
  • odată: Evenimentul poate fi fixat numai o singură dată;
  • pasiv: eveniment.preventdefault () va fi ignorat (excepție în timpul erorii).

Cea mai obișnuită proprietate este

Myelement.addeventlistener (tip, ascultător, adevărat)

Procesoarele sunt șterse utilizând metoda The.RemoveeventListener () Gazduirea a două argumente: tipul evenimentului și referința la funcția de ștergere. De exemplu, proprietatea ONC poate fi implementată după cum urmează:

MyElement.AdDeventlistener ("schimbare", Listener de funcții (eveniment) (consola.log (eveniment.type + "a fost declanșat pe" + acest) Acest.removeeventlistener ("schimbare", ascultător))

Moştenire

Să presupunem că aveți un element și doriți să adăugați un handler de evenimente pentru toate elementele copilului. Apoi, ar trebui să le conduceți în ciclu folosind metoda Myform.QuerySelectorlall ("intrare"), după cum se arată mai sus. Cu toate acestea, puteți adăuga pur și simplu elemente în formular și verificați conținutul lor utilizând evenimentul.target.

Myform.addeventlistener ("schimbare", funcție (eveniment) (const țint \u003d event.target dacă (țintă.Matches ("intrare") (consola.log (țintă.value)))))

Și încă un plus al acestei metode este că manipulatorul va fi legat automat la elemente noi de copii.

Animaţie

Cea mai ușoară modalitate de a adăuga animație folosind CSS cu proprietatea de tranziție. Dar pentru o mai mare flexibilitate (de exemplu, JavaScript este cel mai potrivit.

Apelați metoda Window.settimeout () până când animația sa terminat, nu este cea mai bună idee, deoarece aplicația dvs. poate atârna, în special pe dispozitivele mobile. Este mai bine să utilizați fereastră.RequalstaNimarăFrame () pentru a salva toate modificările la următoarea redesenare. Este nevoie de o funcție ca argument, care la rândul său primește o ștampilă de timp:

Const start \u003d fereastră.Performance.Now () const duration \u003d 2000 fereastră.RequentațieFrame (const progres \u003d acum - porniți myelement.style.Opacitate \u003d progres / durată dacă (progresul< duration) { window.requestAnimationFrame(fadeIn) } }

În acest fel, se realizează o animație foarte netedă. În articolul său, Mark Brown vorbește pe acest subiect.

Vă scriem biblioteca

Faptul că în DOM să efectueze orice operațiune cu elementele tot timpul trebuie să fie sortate, poate părea foarte plictisitor în comparație cu sintaxa de $ JQuery ("Foo"). CSS (Culoare: Red ") . Dar de ce să nu scrieți câteva din metodele voastre, facilitând această sarcină?

Const $ \u003d funcția $ (elemente const \u003d array.De (selectați.queryselectorlall (selector) retur (elemente, html (newtml) (element \u003d\u003e element.innerhtml \u003d newhtml)) returnează acest lucru), css (element \u003d\u003e obiect.assign (element.style, newcss))) returnați acest lucru), activat (eveniment, manipulator, opțiuni) (Acest lucru.Fore (element \u003d\u003e (element.addeventlistener (eveniment, manipulator, opțiuni))) returnați acest))

Aplicațiile complexe și grele web au devenit obișnuite astăzi. Crossbox și bibliotecile de tip jQuery ușor de utilizat cu funcționalitatea lor largă pot ajuta cu fermitate în manipularea Dom în zbor. Prin urmare, nu este surprinzător faptul că mulți dezvoltatori folosesc mai des biblioteci decât lucrează cu API nativ Dom, cu care au existat multe probleme. Și, deși distincțiile din browsere rămân încă o problemă, Dom este acum într-o formă mai bună de 5-6 ani în urmă, când JQuery a câștigat popularitate.

În acest articol, voi demonstra posibilitățile de DOM privind manipularea HTML, concentrându-se asupra relației elementelor parentale, a copilului și a elementelor vecine. În concluzie, voi da date privind sprijinirea acestor oportunități în browsere, dar considerăm că biblioteca de tip JQuery rămâne o opțiune bună datorită disponibilității bug-urilor și inconsecvențelor în implementarea funcționării native.

Numărarea filialelor

Pentru a demonstra, voi folosi următorul markup HTML, în timpul articolului îl vom schimba de mai multe ori:

  • Exemplu unul.
  • Exemplu doi.
  • Exemplul trei.
  • Exemplu patru.
  • Exemplu de cinci.
  • Exemplu șase.


Vary_list \u003d document.getelementbyid ("mylist"); Consola.log (mylist.children.length); // 6 consola.log (Mylist.ChildelementCount); // 6.

După cum puteți vedea, rezultatele sunt aceleași, deși tehnicile sunt utilizate diferite. În primul caz, folosesc proprietatea copiilor. Această proprietate este doar citită, returnează colecția de elemente HTML în interiorul elementului solicitat; Pentru a număra numărul lor, folosesc proprietatea de lungime a acestei colecții.

În al doilea exemplu, folosesc metoda ChildelementCount, care mi se pare un mod mai precis și potențial mai susținut (vom discuta mai târziu, nu cred că aveți probleme cu înțelegerea a ceea ce face).

Aș putea încerca să folosesc copii.Length (în loc de copii.Length), dar uita-te la rezultat:

Vary_list \u003d document.getelementbyid ("mylist"); consola.log (Mylist.Childnodes.Lend); // 13.

Returnează 13, deoarece copiii sunt o colecție de toate nodurile, inclusiv spațiile - consideră acest lucru dacă sunteți importantă decât diferența dintre filiale și elementele copilului.

Verificați existența filialelor

Pentru a verifica prezența elementului filialei, pot folosi metoda Haschildnodes (). Metoda returnează o valoare logică, raportând la disponibilitatea sau absența acestora:

Vary_list \u003d document.getelementbyid ("mylist"); consola.log (mylist.haschildnodes ()); // Adevărat.

Știu că există filiale în lista mea, dar pot schimba HTML astfel încât să nu fie; Acum, marcajul arată astfel:



Și aici este rezultatul noii lansare a lui Haschildnodes ():

Consola.log (mylist.haschildnodes ()); // Adevărat.

Metoda încă returnează adevărat. Deși lista nu conține niciun element, există un spațiu care este un tip valid de nod. Această metodă ia în considerare toate nodurile, nu numai elementele de noduri. Pentru a face haschildnodes () a revenit fals, trebuie să schimbăm din nou marcajul:



Și acum rezultatul așteptat este afișat în consola:

Consola.log (mylist.haschildnodes ()); // Fals

Bineînțeles, dacă știu că pot întâlni un spațiu, mai întâi voi verifica existența nodurilor copilului, apoi folosind proprietatea NodeType, definim dacă există elemente-elemente între ele.

Adăugarea și eliminarea filialelor

Există tehnici care pot fi utilizate pentru a adăuga și șterge elemente din DOM. Cel mai faimos dintre ele se bazează pe o combinație de metode de create () și a apendicchild ().

Var Myel \u003d document.Creeelement ("div"); document.body.appendandchild (Myel);

În acest caz, eu creez

Utilizarea metodei CreateELeELement () și apoi adăugați-o la corp. Foarte simplu și probabil ați folosit această tehnică înainte.

Dar, în loc să introduceți un element special creat, pot utiliza și Apendchild () și pur și simplu mișcați elementul existent. Să presupunem că avem următorul markup:

  • Exemplu unul.
  • Exemplu doi.
  • Exemplul trei.
  • Exemplu patru.
  • Exemplu de cinci.
  • Exemplu șase.

Exemplu de text.

Pot schimba locația listei utilizând următorul cod:

Vary_list \u003d document.getelementbyid ("mylist"), container \u003d document.getelementbyid ("C"); Container.appendandild (Mylist);

Final DOM va arăta astfel:

Exemplu de text.

  • Exemplu unul.
  • Exemplu doi.
  • Exemplul trei.
  • Exemplu patru.
  • Exemplu de cinci.
  • Exemplu șase.

Rețineți că întreaga listă a fost eliminată din locul dvs. (deasupra paragrafului) și apoi introdusă după aceasta în fața corpului de închidere. Și, de obicei, metoda AppendChild () este utilizată pentru a adăuga elemente create folosind createLelement (), poate fi folosit și pentru a muta elementele existente.

De asemenea, pot elimina complet elementul copil din DOM folosind eliminațiChild (). Acesta este modul în care lista noastră este ștearsă din exemplul anterior:

Vary_list \u003d document.getelementbyid ("mylist"), container \u003d document.getelementbyid ("C"); Container.removechild (mylist);

Acum elementul este îndepărtat. Metoda RemoveChild () returnează un element la distanță și îl pot salva în cazul în care va avea nevoie mai târziu.

Vary myoldchild \u003d document.body.removechild (Mylist); document.body.appendandchild (Myoldchild);

Aceasta este metoda copiluluiNode.remove (), relativ recent adăugată la specificație:

Vary_list \u003d document.getelementbyid ("mylist"); mylist.remove ();

Această metodă nu returnează un obiect la distanță și nu funcționează în IE (numai la margine). Și ambele metode elimină nodurile de text în același mod ca și elementele de noduri.

Înlocuind filialele

Pot înlocui elementul copilului existent, indiferent dacă acest element nou există sau l-am creat de la zero. Aici este marcajul:

Exemplu de text.

Var mypar \u003d document.getelementbyid ("par"), mydic \u003d document.creelemente ("div"); Mydic.classname \u003d "exemplu"; Mydiv.createTextNode ("noul element text")); document.body.ReplaceChild (Mydiv, MyPAR);

Noul text de element

După cum puteți vedea, metoda înlocuitoare () ia două argumente: un element nou și elementul vechi înlocuit de acesta.

De asemenea, pot folosi această metodă pentru a muta elementul existent. Uitați-vă la următoarea HTML:

Exemplu Text 1.

Exemplu textul 2.

Exemplu textul 3.

Pot înlocui primul paragraf al treilea paragraf cu următorul cod:

Var mypelementbyid ("par1"), mypar3 \u003d document.getelementbyid ("par3"); document.body.ReplaceChild (MYPAR1, MYPAR3);

Acum, DOM generat arată astfel:

Exemplu textul 2.

Exemplu Text 1.

Eșantionarea elementelor specifice pentru copii

Există mai multe modalități diferite de a selecta un anumit element. După cum se arată mai devreme, pot începe să folosesc colecția de copii sau proprietățile copilului. Dar aruncați o privire la alte opțiuni:

Proprietățile lui Firstelmentchild și LastelementChild fac exact ceea ce se poate aștepta de la ei după numele lor: Alegeți primele și ultimele elemente fiice. Să ne întoarcem la marcajul nostru:

  • Exemplu unul.
  • Exemplu doi.
  • Exemplul trei.
  • Exemplu patru.
  • Exemplu de cinci.
  • Exemplu șase.


Pot alege primul și ultimul element cu aceste proprietăți:

Vary_list \u003d document.getelementbyid ("mylist"); Consola.log (mylist.firstelementchild.innerhtml); // "exemplu o" consolă.log (mylist.lastelementchild.innerhtml); // "Exemplu șase"

De asemenea, pot utiliza proprietățile previziune și nextlementsibling, dacă vreau să aleg elemente de copil altul decât primul sau ultimul. Acest lucru se face prin combinarea proprietăților de FirstelementChild și LastelementChild:

Vary_list \u003d document.getelementbyid ("mylist"); Consola.log (mylist.firstelementchild.nextelementsibling.innerhtml); // "exemplu două" console.log (mylist.lastelementchild.previouslementsibling.innerhtml); // "Exemplu de cinci"

De asemenea, există proprietăți similare ale Primuluichild, LastChild, Previoussibling și Nextsibling, dar iau în considerare toate tipurile de noduri și nu doar elemente. De regulă, proprietățile care iau în considerare numai elementele de noduri sunt utile decât cele care aleg toate nodurile.

Introduceți conținutul în DOM

Am considerat deja modalități de a introduce elemente în Dom. Să mergem la un subiect similar și să aruncăm o privire la noile opțiuni în inserarea conținutului.

În primul rând, există o metodă simplă Introducere (), este în mare parte similară cu înlocuirea (), are două argumente și, în același timp, funcționează atât cu elemente noi, cât și cu cele existente. Aici este marcajul:

  • Exemplu unul.
  • Exemplu doi.
  • Exemplul trei.
  • Exemplu patru.
  • Exemplu de cinci.
  • Exemplu șase.

Exemplu alineatul

Acordați atenție paragrafului, o voi elimina mai întâi, apoi introduceți în fața listei, totul este bine:

Vary_list \u003d document.getelementbyid ("mylist"), container \u003d document.getelementby ("C"), mypar \u003d document.getelementbyid ("par"); Container.vinserbore (mypar, mylist);

În HTML rezultat, paragraful va fi în fața listei și acesta este un alt mod de a transfera elementul.

Exemplu alineatul

  • Exemplu unul.
  • Exemplu doi.
  • Exemplul trei.
  • Exemplu patru.
  • Exemplu de cinci.
  • Exemplu șase.

Ca și înlocuitorul (), Insertbefore () ia două argumente: elementul este adăugat și elementul din fața căruia vrem să îl introducem.

Această metodă este simplă. Să încercăm acum o metodă de introducere mai puternică: metoda InsertDJacentml ().



Pseudo cod

$ ("dreapta"). Faceți clic pe (Funcție () (dreapta () () ();

Mesajul de alarmă va fi:

corp div.lol arightarrow.

Cum pot să-l folosesc pe JavaScript / JQuery?

Folosind jQuery, ca aceasta (urmată de o soluție care nu utilizează jQuery, cu excepția unui eveniment, mult mai puțin provocări ale funcțiilor, dacă este importantă):

Exemplu în timp real:

$ ("dreapta"). Faceți clic pe (Funcție () (Var dreaptaRrowparents \u003d; $ (Acest) .Parente (). Nu ("HTML"). Fiecare (Funcție () (VAR Intrare \u003d this.tagname .tolowowcacase (); dacă (this.classname) (intrare + \u003d "." + this.classname.replace (/ / g, "");) dreapta (intrare);)); alertă (rubarrowparents.join ("")); Întoarce-te fals;));

(În exemplele vii, am actualizat atributul de clasă Div ca Lol multi până când demonstrează procesarea mai multor clase.)

Iată o soluție pentru conformitatea precisă a elementului.

Este important să înțelegeți că selectorul ( Nu este real), care arată uneltele de crom, în mod unic nu identifică elementul în DOM. ( De exemplu, nu va distinge lista elementelor consecutive. Nu există informații de poziționare / indexare)

$ .fn.fullselector \u003d Funcție () (Calea Var \u003d the.Parents (). Addback (); Var QuickCss \u003d PATH.Get () Hartă (Funcție (element) (VAR Self \u003d $ (element), ID \u003d element .ID? "#" + item.id: "", CLS \u003d item.classlist.length? item.classlist.tostring (). Split ("") .map (funcția (c) (return "." + C; )) + ")": ""; dacă (nume \u003d\u003d\u003d "html" || name \u003d\u003d\u003d "corp") (denumire de retur;) Nume returnare + index + id + CLS;)). Alăturați-vă ("\u003e") ; Returnați QuickCss;);

Și îl puteți folosi astfel:

Consola.log ($ ("unele-selector"). Fullseulator ());

Am mutat un fragment de la T.J. Crowder pentru un plugin mic jquery. Am folosit versiunea de jquery, chiar dacă are dreptate, că acest lucru este complet suplimentar, dar o folosesc numai pentru scopuri de depanare, așa că nu-mi pasă.

Folosind:

Span imbricat.
Span simplu.
Pre.


// rezultat (matrice): ["corp", "div.sampleclass"] $ ("span"). Getdompath (fals) // rezultat (șir): corp\u003e div.sampleclass $ ("span"). Getdompath ( ) // Rezultat: [corp "," Div # testul "] $ (" pre "). Getdompath (fals) // rezultat (șir): corp\u003e div # testul $ (" pre "). Getdompath ()

Var obj \u003d $ ("# show-editor-buton"), calea \u003d ""; În timp ce (eticheta)! \u003d "Undefined") (dacă (ЕBJ.ATTR)) (PATH \u003d "." + Obj.attr ("clasa"). Înlocuiți (/ \\ s / g, ".") + Calea;) dacă (obj.attr ("id") (calea \u003d "#" + obj.attr ("id") + cale;) calea \u003d "" + obj.prop ("tagname"). Tolowercase () + cale; obj \u003d Obj.parent ();) consola.log (calea);

bună ziua Această caracteristică permite o eroare asociată cu elementul curent care nu este afișat pe cale.

Verifica acum

$ j ("wrapper"). Faceți clic pe (funcția (eveniment) (Event)); Var dreaptaRrowparents \u003d; $ j (event.target) .parente () nu ("html, corp") .ech (funcția (funcția ( ) (VAR Intrare \u003d this.tagname.tolowowcase (); dacă (this.classname) (intrare + \u003d "." + This.classname.replace (/ / g, "");) altceva dacă (acesta (intrare + \u003d "#" + "id.id;) intrare \u003d înlocuire (intrare", "..", ""); dreapta (intrare);)); dreapta);)); ")); dreapta (); //rifhevent.target .Nodename.tolowowcacase () \u003d\u003d "A" || eveniment.target.nodename.tolowercaca () \u003d\u003d "H1") (VAR Intrare \u003d Event.TArget.nodename.tolowowcacase (); dacă (event.target.classname) (Intrare + \u003d "." + EVENT.TARGET.Classname.replace (/ / g, ".");) Altfel dacă (event.target.id) (intrare + \u003d "#" + eveniment.target.id;) dreaptaRrowparents.push (intrare); //)

Unde $ j \u003d variabila jquery

de asemenea, rezolvați problema cu .. în clasa de nume

iată o funcție de înlocuire:

Funcție EscapeRegeXP (STR) (retur Str.Replace (/ ([+ +? ^ \u003d $ () () | \\ [\\] \\ / \\]) / G, "\\\\ $ 1");) Funcția înlocuită (retur Str.Replace (Regexp nou (EscapeRegexp (Găsire), "g"), înlocuiți);)

Iată versiunea nativă a lui JS, care returnează calea jquery. De asemenea, adaug identificatori pentru articole daca sunt. Acest lucru vă va oferi posibilitatea de a face cel mai scurt mod dacă vedeți identificatorul în matrice.

Calea var \u003d getdompath (element); Consola.log (calea.join ("\u003e"));

Corp\u003e Section: Eq (0)\u003e DIV: EQ (3)\u003e Secțiune # Content\u003e Secțiune # Firehose\u003e Div # Firehogelist\u003e Articolul # Firehose-46813651\u003e H2\u003e Span # Title-46813651

Iată o funcție.

Funcție Getdompath (EL) (Var Stack \u003d; în timp ce (El.ParentNode! \u003d Null) (console.log (El.nodename); var sibount \u003d 0; var sibindex \u003d 0; pentru (var i \u003d 0; i< el.parentNode.childNodes.length; i++) { var sib = el.parentNode.childNodes[i]; if (sib.nodeName == el.nodeName) { if (sib === el) { sibIndex = sibCount; } sibCount++; } } if (el.hasAttribute("id") && el.id != "") { stack.unshift(el.nodeName.toLowerCase() + "#" + el.id); } else if (sibCount > 1) (Stack.Shift (El.nodename.tolowowcase () + ": EQ (" + SIBIINDEX + ")");) ; ) Retur Stack.Slice (1); // elimină elementul HTML)