Das folgende Beispiel implementiert einen einfachen Selektor zum Test auf das Vorhanden-Sein eines Name-Tags:
$.extend($.expr[':'], { hasNameTag: function(a) { return $(a).attr("name") != undefined; } }); $('div:hasNameTag').click(function() { alert('The element you clicked has got a name tag'); });
Der Code und die Benutzung dürfte recht selbsterklärend sein. Hier kann man das ganze auch nochmal testen:
Source: 6-demo1.html
Interessanter - und damit auch gleichzeitig komplexer - wird es, wenn man den gewünschten Selektor parametrisieren möchte:
Angenommen, es interessiert nicht nur, ob ein Name-Tag gesetzt wurde, sondern auch der Wert selber ist von Interesse:
Wert 1Wert 2Wert 3
"Selektiere alle divs, deren name-Tag auf "b" lautet!"
Auch dies ist kein Problem und lässt sich leicht über einen eigenen Selektor implementieren. Lediglich die Signatur des Selektors muss dazu erweitert werden:
// :selectByTagMatch('string') selectByTagMatch : function(objNode, intStackIndex, arrProperties, arrNodeStack) { // get function arguments var arrArguments = eval("(['" + arrProperties[ 3 ] + "'])"); // create a jQuery version of this node. var $obj = $( objNode ); // check for matches for (var i = 0 ; i < arrArguments.length ; i++){ // Check for tag equality. if ($obj.attr( "name" ) != undefined && $obj.attr( "name" ) == arrArguments[ i ]){ // We found a tag match, return true to // indicate that this node should be included // in the returned jQuery stack. return( true ); } } return false; }
Auch hier gibt es eine kleine Demo:
Source: 6-demo2.html
Abschließend noch eine kleine Anmerkung zu Zeile 5:
var arrArguments = eval("(['" + arrProperties[ 3 ] + "'])");
Je nach Parameter Typ (String vs. int) dürfen die ' nicht vergessen werden.