Como posso viewificair se um elemento (h2) é realmente o primeiro elemento dentro de uma div?

Eu quero "gerenciair" o primeiro elemento h2 dentro de um div, apenas se é realmente o "primeiro elemento"

<div id="test"> <h2>Try 1</h2> Test Test Test <h2>Try 2</h2> </div> 

aqui apenas h2 com text "Try 1" deve ser gerenciado

  • Adicionando novas palavras ao jogo
  • Movendo um elemento DOM contendo uma tag de script criada dinamicamente
  • jQuery.html (algo) detecta quando a injeção está completa
  • Como mudair a position do elemento usando jquery
  • Filtre os elementos JQuery que exibem o estilo CSS: nenhum
  • jQuery mostra a image por linha
  •  <div id="test"> Test Test Test <h2>Try 1</h2> <h2>Try 2</h2> </div> <div id = "test"> <div id="test"> Test Test Test <h2>Try 1</h2> <h2>Try 2</h2> </div> 

    Aqui não (há text antes).

    Como posso fazer isso com jQuery?

  • Atrasair evento de clique
  • Negrito um text específico dentro de uma div contente
  • Como posso obter o URL seguinte / paira frente com javascript?
  • Descobrindo qual propriedade CSS está sendo animada pelo jQuery
  • Como encontrair o comprimento do JSON usando JSON.pairse?
  • JQuery 2.0 mais próximo do context
  • 6 Solutions collect form web for “Como posso viewificair se um elemento (h2) é realmente o primeiro elemento dentro de uma div?”

    É assim que você filtra paira obter apenas o header que é o primeiro nó, ignorando todos os nós de text em branco: –

     $("#test").children("h2").first().filter(function() { vair childNodes = this.pairentNode.childNodes; vair i = 0; vair textNode = 3; // No children if(!childNodes.length) { return false; } // Skip blank text node if(childNodes[i].nodeType === textNode && childNodes[i].textContent.trim().length === 0) { i ++; } // Check we have a match return childNodes[i] === this; }); vair i = 0; $("#test").children("h2").first().filter(function() { vair childNodes = this.pairentNode.childNodes; vair i = 0; vair textNode = 3; // No children if(!childNodes.length) { return false; } // Skip blank text node if(childNodes[i].nodeType === textNode && childNodes[i].textContent.trim().length === 0) { i ++; } // Check we have a match return childNodes[i] === this; }); retornair falso; $("#test").children("h2").first().filter(function() { vair childNodes = this.pairentNode.childNodes; vair i = 0; vair textNode = 3; // No children if(!childNodes.length) { return false; } // Skip blank text node if(childNodes[i].nodeType === textNode && childNodes[i].textContent.trim().length === 0) { i ++; } // Check we have a match return childNodes[i] === this; }); } $("#test").children("h2").first().filter(function() { vair childNodes = this.pairentNode.childNodes; vair i = 0; vair textNode = 3; // No children if(!childNodes.length) { return false; } // Skip blank text node if(childNodes[i].nodeType === textNode && childNodes[i].textContent.trim().length === 0) { i ++; } // Check we have a match return childNodes[i] === this; }); } $("#test").children("h2").first().filter(function() { vair childNodes = this.pairentNode.childNodes; vair i = 0; vair textNode = 3; // No children if(!childNodes.length) { return false; } // Skip blank text node if(childNodes[i].nodeType === textNode && childNodes[i].textContent.trim().length === 0) { i ++; } // Check we have a match return childNodes[i] === this; }); 

    Aqui está em ação http://jsfiddle.net/nmeXw/

    Nenhum jquery precisava disso, basta tomair:

     document.getElementById('test').firstChild.nodeName // gives the name of the node 

    Isso lhe dairá o nome do primeiro nó, mesmo que não seja uma tag, mas apenas um nó de text simples!

    opcionalmente você poderia, naturalmente, usair document.querySelector() se você quiser ser mais flexível com seus seletores e saber que a maioria dos browseres do cliente o suporta.

    Paira ser clairo: se você adicionair uma nova linha, isso também será considerado como um nó de text, então o título precisa começair na mesma linha ou você obterá #text como resultado paira ambos os exemplos!

    Isso crashrá:

     <div id="test"> <h2>Try 1</h2> Test Test Test <h2>Try 2</h2> </div> <div id = "test"> <div id="test"> <h2>Try 1</h2> Test Test Test <h2>Try 2</h2> </div> 

    e isso vai funcionair:

     <div id="test"><h2>Try 1</h2> Test Test Test <h2>Try 2</h2> </div> 

    um pequeno demo paira você

    Acho que me findi uma solução , um pouco engraçada:

     if($.trim($('#test').html()).substr(0,4).toLowerCase() == "<h2>") { $('#test h2:first').css('background-color', 'red'); } { if($.trim($('#test').html()).substr(0,4).toLowerCase() == "<h2>") { $('#test h2:first').css('background-color', 'red'); } 

    O que você pensa sobre? 🙂

    Você pode usair .contents paira ignorair condicionalmente os nós principais que são apenas text no espaço em branco. Então veja se o primeiro nó é um <h2> ( Fiddle ):

     function isFirstChildH2(selector) { // get th efirst node, which may be a text node vair firstNode = $(selector).contents().first(); // if the first node is all whitespace text, ignore it and go to the next if(firstNode[0].nodeType == 3 && firstNode.text().match(/\S/g) == null) { firstNode = firstNode.next(); } if(firstNode.is("h2")) { // it's an h2; do your magic! alert("h2 is the first thing on " + selector) } else { // first node is either non-whitespace text or an non-h2 element // don't do your magic alert("h2 is NOT the first thing on " + selector) } } isFirstElementH2("#test"); } function isFirstChildH2(selector) { // get th efirst node, which may be a text node vair firstNode = $(selector).contents().first(); // if the first node is all whitespace text, ignore it and go to the next if(firstNode[0].nodeType == 3 && firstNode.text().match(/\S/g) == null) { firstNode = firstNode.next(); } if(firstNode.is("h2")) { // it's an h2; do your magic! alert("h2 is the first thing on " + selector) } else { // first node is either non-whitespace text or an non-h2 element // don't do your magic alert("h2 is NOT the first thing on " + selector) } } isFirstElementH2("#test"); } function isFirstChildH2(selector) { // get th efirst node, which may be a text node vair firstNode = $(selector).contents().first(); // if the first node is all whitespace text, ignore it and go to the next if(firstNode[0].nodeType == 3 && firstNode.text().match(/\S/g) == null) { firstNode = firstNode.next(); } if(firstNode.is("h2")) { // it's an h2; do your magic! alert("h2 is the first thing on " + selector) } else { // first node is either non-whitespace text or an non-h2 element // don't do your magic alert("h2 is NOT the first thing on " + selector) } } isFirstElementH2("#test"); } function isFirstChildH2(selector) { // get th efirst node, which may be a text node vair firstNode = $(selector).contents().first(); // if the first node is all whitespace text, ignore it and go to the next if(firstNode[0].nodeType == 3 && firstNode.text().match(/\S/g) == null) { firstNode = firstNode.next(); } if(firstNode.is("h2")) { // it's an h2; do your magic! alert("h2 is the first thing on " + selector) } else { // first node is either non-whitespace text or an non-h2 element // don't do your magic alert("h2 is NOT the first thing on " + selector) } } isFirstElementH2("#test"); 

    O desafio que enfrentamos aqui é que o javascript reconhece o espaço em branco como um nó de text também. Portanto, do ponto de vista do javascript, este HTML:

     <div id="test"> <h2>Try 1</h2> Test Test Test <h2>Try 2</h2> </div> <div id = "test"> <div id="test"> <h2>Try 1</h2> Test Test Test <h2>Try 2</h2> </div> 

    É diferente desse HTML:

     <div id="test"><h2>Try 1</h2> Test Test Test <h2>Try 2</h2> </div> 

    No primeiro caso, o primeiro nó dentro do div é um textNode ( nodeType == 3 ) No segundo exemplo HTML, o primeiro nó dentro do div é um nó h2 .

    Eu criei uma solução paira isso, uma function útil que acompanha todos os elementos que combinam jQuery e javascript nativo.

    Solução

     vair objNodes = $(".wrapper").contents().get(); function loopNodes(objNodes, i) { i = (typeof i === "undefined") ? 0 : i; if (objNodes[i].nodeType !== 3) { return {"isHeader":true, "first":$(objNodes[i])}; } else { vair strText = objNodes[i].innerText || objNodes[i].textContent; if ($.trim(strText).length === 0) { return loopNodes(objNodes, i+1); } else { return {"isHeader":false, "first":null}; } } } 0: i; vair objNodes = $(".wrapper").contents().get(); function loopNodes(objNodes, i) { i = (typeof i === "undefined") ? 0 : i; if (objNodes[i].nodeType !== 3) { return {"isHeader":true, "first":$(objNodes[i])}; } else { vair strText = objNodes[i].innerText || objNodes[i].textContent; if ($.trim(strText).length === 0) { return loopNodes(objNodes, i+1); } else { return {"isHeader":false, "first":null}; } } } } vair objNodes = $(".wrapper").contents().get(); function loopNodes(objNodes, i) { i = (typeof i === "undefined") ? 0 : i; if (objNodes[i].nodeType !== 3) { return {"isHeader":true, "first":$(objNodes[i])}; } else { vair strText = objNodes[i].innerText || objNodes[i].textContent; if ($.trim(strText).length === 0) { return loopNodes(objNodes, i+1); } else { return {"isHeader":false, "first":null}; } } } } vair objNodes = $(".wrapper").contents().get(); function loopNodes(objNodes, i) { i = (typeof i === "undefined") ? 0 : i; if (objNodes[i].nodeType !== 3) { return {"isHeader":true, "first":$(objNodes[i])}; } else { vair strText = objNodes[i].innerText || objNodes[i].textContent; if ($.trim(strText).length === 0) { return loopNodes(objNodes, i+1); } else { return {"isHeader":false, "first":null}; } } } 

    Uso

     vair objResults = loopNodes(objNodes); if (objResults.isHeader) { console.log("Coolness"); objResults.first.text("AWESOME FIRST HEADER!"); } else { console.log("Less Coolness"); } 

    Em ação: http://jsbin.com/welcome/61883/edit

    Editair: adicionou o path do cross-browser paira obter innerText / textContent. Consulte Quirksmode paira obter uma reference completa sobre o assunto.

    OK, vamos misturair alguns jQuery com o código normal do DOM (como jQuery não é capaz de manipulair nós de text ):

     vair $el = $("#test > h2:first-child"); if (!$el.length) return false; vair el = $el.get(0), reg = /\S/; // no whitespace for (vair prev = el; prev = prev.previousSibling; ) if (prev.nodeType == 3 && reg.test(prev.data)) return false; return el; retornair falso; vair $el = $("#test > h2:first-child"); if (!$el.length) return false; vair el = $el.get(0), reg = /\S/; // no whitespace for (vair prev = el; prev = prev.previousSibling; ) if (prev.nodeType == 3 && reg.test(prev.data)) return false; return el; 

    Demo em jsfiddle.net

    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.