409 Stimmen

Wie wähle ich Textknoten mit jQuery aus?

Ich möchte alle absteigenden Textknoten eines Elements als jQuery-Sammlung erhalten. Was ist der beste Weg, das zu tun?

3voto

colllin Punkte 8984

Wenn Sie davon ausgehen können, dass alle Kinder entweder Elementknoten oder Textknoten sind, dann ist dies eine Lösung.

Um alle untergeordneten Textknoten als Jquery-Sammlung zu erhalten:

$('selector').clone().children().remove().end().contents();

Um eine Kopie des ursprünglichen Elements zu erhalten, aus der die nicht textbezogenen Kinder entfernt wurden:

$('selector').clone().children().remove().end();

1voto

Mr_Green Punkte 38875

Kann auch so gemacht werden:

var textContents = $(document.getElementById("ElementId").childNodes).filter(function(){
        return this.nodeType == 3;
});

Der obige Code filtert die textNodes aus den direkten Kindknoten eines bestimmten Elements.

1voto

iConnor Punkte 19491

Aus irgendeinem Grund contents() hat bei mir nicht funktioniert. Wenn es bei Ihnen nicht funktioniert hat, habe ich hier eine Lösung gefunden, die ich erstellt habe jQuery.fn.descendants mit der Option, Textknoten einzuschließen oder nicht

Verwendung


Alle Nachkommen, einschließlich Textknoten und Elementknoten, abrufen

jQuery('body').descendants('all');

Alle Nachkommen abrufen, die nur Textknoten zurückgeben

jQuery('body').descendants(true);

Alle Nachkommen abrufen und nur Elementknoten zurückgeben

jQuery('body').descendants();

Coffeescript Original :

jQuery.fn.descendants = ( textNodes ) ->

    # if textNodes is 'all' then textNodes and elementNodes are allowed
    # if textNodes if true then only textNodes will be returned
    # if textNodes is not provided as an argument then only element nodes
    # will be returned

    allowedTypes = if textNodes is 'all' then [1,3] else if textNodes then [3] else [1]

    # nodes we find
    nodes = []

    dig = (node) ->

        # loop through children
        for child in node.childNodes

            # push child to collection if has allowed type
            nodes.push(child) if child.nodeType in allowedTypes

            # dig through child if has children
            dig child if child.childNodes.length

    # loop and dig through nodes in the current
    # jQuery object
    dig node for node in this

    # wrap with jQuery
    return jQuery(nodes)

Drop-In Javascript Version

var __indexOf=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++){if(t in this&&this[t]===e)return t}return-1}; /* indexOf polyfill ends here*/ jQuery.fn.descendants=function(e){var t,n,r,i,s,o;t=e==="all"?[1,3]:e?[3]:[1];i=[];n=function(e){var r,s,o,u,a,f;u=e.childNodes;f=[];for(s=0,o=u.length;s<o;s++){r=u[s];if(a=r.nodeType,__indexOf.call(t,a)>=0){i.push(r)}if(r.childNodes.length){f.push(n(r))}else{f.push(void 0)}}return f};for(s=0,o=this.length;s<o;s++){r=this[s];n(r)}return jQuery(i)}

Unveränderte Javascript-Version: http://pastebin.com/cX3jMfuD

Dies ist browserübergreifend, eine kleine Array.indexOf Polyfill ist im Code enthalten.

0voto

Rahen Rangan Punkte 715

Wenn Sie alle Tags entfernen möchten, versuchen Sie Folgendes

Funktion:

String.prototype.stripTags=function(){
var rtag=/<.*?[^>]>/g;
return this.replace(rtag,'');
}

Verwendung:

var newText=$('selector').html().stripTags();

0voto

Guillermo Punkte 16684

Ich hatte das gleiche Problem und löste es mit:

Code:

$.fn.nextNode = function(){
  var contents = $(this).parent().contents();
  return contents.get(contents.index(this)+1);
}

Verwendung:

$('#my_id').nextNode();

Ist wie next() sondern gibt auch die Textknoten zurück.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X