37 Stimmen

jQuery, findet heraus, ob ein Element einen Text hat

Ich habe mit einigen generierten Bereichen zu tun und möchte herausfinden, welcher davon keinen Text enthält.

Der Aufschlag beträgt:

<span id="layer6">
    <span class="drag col">  Some text</span>
    <span class="drag col">  More text</span>
    <span class="drag col">  </span>
    <span class="drag col">  I also have text</span>
</span>

Mit diesem Code kann ich die Einträge mit "etwas Text" abrufen, aber nicht die leeren Einträge:

if ($('#layer6 > span.col:contains("some text")').length > 0) {
    alert ("I have text");
}

Wie bekommt man die leeren Exemplare? Ich denke an die Verwendung von .length, um es zu tun, aber ich habe es nicht geschafft.

54voto

Alex Punkte 4912
$("span.col").each(function(){
    if (!$(this).text().trim().length) {
        $(this).addClass("foo");
    }
});

http://jsfiddle.net/cfgr9/1/

Anstatt eine Klasse hinzuzufügen, können Sie natürlich tun, was Sie wollen, das Objekt zurückgeben usw.

UPDATE: Seltsames verstecktes Zeichen nach dem letzten Semikolon entfernt, das einen js-Fehler verursachte.

10voto

luminancedesign Punkte 91
$('span:empty').css('background-color','red');

9voto

Gumbo Punkte 617646

Utilice filter um die Elemente zu filtern, die keinen textlichen Inhalt haben:

$('#layer6 > span.col').filter(function(){
    return $(this).text().trim() != "";
}).length

5voto

user187291 Punkte 52315

Ich bin mir eines solchen Selektors nicht bewusst, aber es ist einfach zu schreiben

jQuery.expr[':'].empty = function(obj) { return jQuery(obj).text().replace(/^ \s +| \s +$/, "").length == 0; }

jQuery.expr[':'].hasNoText = function(obj) {
    return jQuery.trim(jQuery(obj).text()).length == 0;
}

und dann, zum Beispiel

$("#layer6 span:hasNoText").text("NEW TEXT")

Nur für Googler: hier ist die erweiterte Version. $("node:matches(/regexp/)") wählt Knoten aus, deren Textinhalt mit dem angegebenen Regexp übereinstimmt.

    <script>
    /// :matches(regexp)    
    /// regexp is like js regexp except that you should double all slashes
    jQuery.expr[':'].matches = function(obj, index, args) {
        var m = (args[3] + "").match(/^\/(.+?)\/(\w*)$/);
        var re = new RegExp(m[1], m[2]);
        return jQuery(obj).text().search(re) >= 0;
    }
    </script>

Demo:

    <script>
    $(function() {
        $("div").click(function() {
            $("div:matches(/foobar/)").text("foobar was here")
            $("div:matches(/foo\\s+bar/i)").text("some text")
            $("div:matches(/^\\s+$/)").text("only spaces")
        });
    });
    </script>

    html before 

    <div>foobar</div>
    <div>Foo Bar</div>
    <div>       </div>

    html after 

    <div>foobar was here</div>
    <div>some text</div>
    <div>only spaces</div>

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