Seleziona gli elementi per attributo


253

Ho una raccolta di caselle di controllo con ID generati e alcuni di essi hanno un attributo aggiuntivo. È possibile utilizzare JQuery per verificare se un elemento ha un attributo specifico? Ad esempio, posso verificare se il seguente elemento ha l'attributo "myattr"? Il valore dell'attributo può variare.

<input type="checkbox" id="A" myattr="val_attr">A</input>

Ad esempio, come posso ottenere una raccolta di tutte le caselle di controllo che hanno questo attributo senza selezionare una per una? È possibile?


2
Per inciso, un <input /> è un tag vuoto che non è pensato per avere contenuto al suo interno. Forse non ti preoccupi di convalidare la vista dato che hai presente Myatttr ...
ScottE


Se hai già una raccolta e vuoi filtrare solo gli elementi con attributo specifico - fallo -$filtered = $collection.filter('[attribute_name]');
jave.web

Risposte:


190

Vuoi dire che puoi selezionarli? Se è così, allora sì:

$(":checkbox[myattr]")

4
Nota che se stai verificando l'esistenza (presumibilmente in un'istruzione if, ad esempio) è probabilmente più corretto / affidabile fare: if ($ (": checkbox [myattr]"). Length ()> 0) ...
Rinogo,

14
@rinogo: in realtà tutto ciò che serve è if ($ (": checkbox [myattr]"). length). La lunghezza after () non è necessaria, né lo> 0, 0 viene valutato come falso nei test di uguaglianza che non richiedono una parità rigorosa (sia valore che tipo).
bmarti44,

1
Genera errori js se provi qualcosa del tipo: td [myattr]. Quindi penso che questa funzione mirasse specificamente alle caselle di controllo.
preso in giro il

6
I due punti selezionano le pseudo-classi, determinate dal tipo attr. Per applicare la stessa cosa a td, basta omettere i due punti.
dhochee,

O se volevi vedere se qualcosa non aveva un attributo come trovare tutti i link che non hanno hrefattributi. $("#myBox").find('a').filter(':not([href])')
timbrown,

368
if ($('#A').attr('myattr')) {
    // attribute exists
} else {
    // attribute does not exist
}

MODIFICARE:

Quanto sopra cadrà nel else-branch quando myattresiste ma è una stringa vuota o "0". Se questo è un problema, dovresti testare esplicitamente undefined:

if ($('#A').attr('myattr') !== undefined) {
    // attribute exists
} else {
    // attribute does not exist
}

3
Non è un'ottima risposta. "undefined" non è una parola chiave in Javascript. Vedi constc.blogspot.com/2008/07/…
mhenry1384

16
Hai ragione ... Ma la ridefinizione undefinedè considerata un caso limite e il confronto sopra funzionerà nel 99% di tutti i casi.
Stefan Gehrig,

6
Non funziona se l'attributo ha una stringa vuota. Un esempio è myattr = ''
mythicalprogrammer il

3
@mhenry - allora saresti in errore :) Se stavi costruendo il progetto per me o accanto a me, ti richiederei di correggere l'errore. Se fosse un pacchetto open source allora io (insieme a molti utenti) smetterei di usarlo sulla base del fatto che era scarsamente codificato. Se non lo cambiassi, qualcun altro alla fine biforcerebbe una versione senza l'errore e la gente lo userebbe invece, e perderesti il ​​tuo progetto, come è successo molte volte prima quando qualcuno crea un pacchetto che è una buona idea con scarsa attuazione. Ad ogni modo ti insegnerebbe una lezione sulle pratiche di programmazione :)
Jimbo Jonny,

8
if (typeof $ ('# A'). attr ('myattr')! == 'undefined')
James Westgate

166

So che è passato molto tempo da quando la domanda è stata posta, ma ho trovato il controllo per essere più chiaro in questo modo:

if ($("#A").is('[myattr]')) {
    // attribute exists
} else {
    // attribute does not exist
}

(Come trovato su questo sito qui )

La documentazione su is è disponibile qui


Secondo il W3C, gli attributi booleani sono definiti dalla presenza o dall'assenza dell'attributo. jQuery fornisce il metodo .attr () per manipolare i valori degli attributi. Ma come possiamo aggiungere un attributo senza valore? Il metodo fornito per verificare la presenza di un attributo non è descritto nella documentazione di jQuery (1.8.2). Sai come aggiungere un attributo con jQuery?
chmike

@chmike Per aggiungere un attributo, lo farei in questo modo: $ ("# A"). prop ("myNewAttribute", someValue); Puoi dare a someValue qualsiasi valore a tua scelta: stringa, numero, stringa vuota, vero / falso.
Jonathan Bergeron,

Ciò aggiungerà l'attributo con un valore assegnato che non è lo stesso di un attributo senza valore.
chmike,

5
Sono d'accordo, questa è la risposta migliore (usando jQuery) - molto chiara e concisa. Mi sono ritrovato a chiedermi perché jQuery non abbia solo una funzione hasAttribute () e la risposta è che javascript nativo ne ha già una. Qualsiasi elemento Dom HTML ha un metodo hasAttribute ('attributoNome'). Quindi potresti fare: $ ('# A') [0] .hasAttribute ('myattr') @chmike - Non credo che puoi aggiungere un attributo vuoto usando le funzioni jQuery, ma puoi farlo con l'elemento Dom HTML oggetto in un modo simile come segue: $ ("# A") [0] .setAttributeNode (document.createAttribute ("myNewAttribute"));
Daniel Howard,

1
Solo un commento a cui mi piace questa risposta, ma ero confuso riguardo ai commenti che chiedevano come aggiungere un attributo senza un valore. Questi non sono correlati alla domanda o alla risposta.
arrivederci,

9

Questo funzionerà:

$('#A')[0].hasAttribute('myattr');


@RetroCoder, qual è il tuo punto sul tuo link? Questo test sembra abbastanza buono, soprattutto perché spesso lo usi $(this).<something>quando puoi fare this.hasAttribute('...')direttamente qui (e non ti importa dei browser più vecchi, ovviamente.)
Alexis Wilke,

8

In JavaScript, ...

null == undefined

... ritorna true*. È la differenza tra ==e ===. Inoltre, il nome undefinedpuò essere definito (non è una parola chiave come nullè), quindi è meglio controllare in qualche altro modo. Il modo più affidabile è probabilmente quello di confrontare il valore di ritorno typeofdell'operatore.

typeof o == "undefined"

Tuttavia, il confronto con null dovrebbe funzionare in questo caso.

* Supponendo che undefinedin realtà non sia definito.


Non definito non è una parola chiave riservata in JavaScript. In jQuery è possibile mungere il suo nome esattamente perché è costruito con il contratore "var" e non valutato. In cima al codice della biblioteca magica, infatti, c'è una riga che afferma "var undefined;" e in questo modo una variabile non definita viene definita con quel nome nell'ambito jQuery ... Ma potrebbe essere ugualmente denominata "senza nome" digitando "var unnamed;"
Emanuele Del Grande,

1
Questo non controlla un attributo, questo controlla una proprietà in un oggetto JavaScript perché questo ha 6 voti?
ncubica,

5

$("input[attr]").length potrebbe essere un'opzione migliore.


4

Un paio di idee sono state gettate in giro usando "typeof", jQuery ".is" e ".filter", quindi ho pensato di pubblicare un rapido confronto di loro. Il tipo di sembra essere la scelta migliore per questo. Mentre gli altri funzioneranno, sembra che ci sia una chiara differenza di prestazioni quando si invoca la libreria jq per questo sforzo.


2
if (!$("#element").attr('my_attr')){
  //return false
  //attribute doesn't exists
}

1
questo probabilmente non funzionerà, poiché puoi aggiungere un attributo senza valore. in tal caso, questa condizione passerà, sebbene il comportamento desiderato potrebbe essere quello di restituire true, l'attributo è impostato. simile ai PHP isset()o ad esempio in js $("#element").attr('my_attr') === false,
ulkas

2

come in questo post , usando .ise il selettore di attributi [], puoi facilmente aggiungere una funzione (o prototipo):

function hasAttr($sel,attr) {
    return $sel.is('['+attr+']');
}


1

semplicemente:

$('input[name*="value"]')

maggiori informazioni: documenti ufficiali


1
Virgolette doppie senza escape all'interno della stringa definita con virgolette doppie, non una stringa valida. Purtroppo non posso modificarlo per te perché una modifica deve cambiare almeno 6 caratteri, ma deve essere cambiata.
Jimbo Jonny,

0

Oltre a selezionare tutti gli elementi con un attributo $('[someAttribute]')o $('input[someAttribute]')puoi anche utilizzare una funzione per eseguire controlli booleani su un oggetto come in un gestore di clic:

if(! this.hasAttribute('myattr') ) { ...


0

Ho creato il pacchetto npm con il comportamento previsto come descritto sopra in questione.

Link a [npm] e [github]

L'utilizzo è molto semplice. Per esempio:

<p id="test" class="test">something</p>
$("#test").hasAttr("class")

ritorna vero.

Funziona anche con camelcase.


0

Per selezionare elementi con un determinato attributo, vedere le risposte sopra.

Per determinare se un determinato elemento jQuery ha un attributo specifico sto usando un piccolo plugin che restituisce truese il primo elemento nella raccolta ajQuery ha questo attributo:

/** hasAttr
 ** helper plugin returning boolean if the first element of the collection has a certain attribute
 **/
$.fn.hasAttr = function(attr) {
   return 0 < this.length
       && 'undefined' !== typeof attr
       && undefined !== attr
       && this[0].hasAttribute(attr)
}

-5

JQuery restituirà l'attributo come stringa. Pertanto è possibile controllare la lunghezza di quella stringa per determinare se è impostato:

if ($("input#A").attr("myattr").length == 0)
 return null;
else
 return $("input#A").attr("myattr");

So che è passato più di un anno e avrei dovuto affrontarlo molto tempo fa. Sono curioso di sapere quale parte non ha funzionato? Se avessi saputo che stavi solo provando a selezionarli non avrei dato il codice sopra. Pensavo volessi controllarli singolarmente. JQuery infatti restituisce l'attributo come stringa e puoi controllare la lunghezza di quella stringa proprio come qualsiasi altra stringa. Quindi, finché il selettore e l'attributo fossero corretti, avresti dovuto essere in grado di verificare se un determinato input avesse quell'attributo. Comunque, non volevo che le persone scontassero il principio perché funziona.
zach

6
fallirà nel caso in cui l'attributo non sia presente, nel qual caso $ ("input # A"). attr ("myattr") restituirà undefined piuttosto che una stringa e undefined.length fallirà
Rune FS

Rileva solo un attributo vuoto rispetto a uno con contenuto, non riesce su un attributo inesistente. La domanda originale riguardava il rilevamento dell'esistenza dell'attributo, rendendolo un fallimento come risposta alla domanda.
Jimbo Jonny,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.