Ich möchte alle absteigenden Textknoten eines Elements als jQuery-Sammlung erhalten. Was ist der beste Weg, das zu tun?
Antworten
Zu viele Anzeigen?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();
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.