2009-08-23 18 views
576

Eventuali duplicati:
Check existence of an attribute with JQueryjQuery hasattr controllo per vedere se c'è un attributo su un elemento

Come si fa a controllare se c'è un attributo su un elemento in jQuery? Simile a hasClass, ma con attr?

Per esempio,

if ($(this).hasAttr("name")) { 
    // ... 
} 
+0

qui è un plugin jQuery che sembra fare esattamente quello che stai cercando -> http://plugins.jquery.com/project/hasAttr – bmarti44

+3

bmarti44 Sembra che il link marcito alcuni. – MrBoJangles

+0

http://stackoverflow.com/questions/1318076/jquery-hasattr-checking-to-see-if-the-is-an-attribute-on-an-element qui è la risposta migliore. – Imad

risposta

898
var attr = $(this).attr('name'); 

// For some browsers, `attr` is undefined; for others, 
// `attr` is false. Check for both. 
if (typeof attr !== typeof undefined && attr !== false) { 
    // ... 
} 
+0

Ahah, grazie. Questa è la risposta giusta per me, perché tornare indefinito non è ciò che voglio. Grazie ancora. – Mark

+12

Probabilmente sarebbe meglio fare qualcosa di simile: if (! Typeof ($ (this) .attr ('name')) = 'undefined') {// ... } dal indefinito può effettivamente essere ridefinito utilizzando un semplice: undefined = 1 –

+0

@Shane Tomlinson, Yup; Sono consapevole * ora *. Questo post è stato realizzato più di un anno fa quando non conoscevo la maggior parte delle stranezze di JavaScript. Tuttavia, ho aggiornato la mia risposta; Grazie. – strager

75

Sei così vicino è pazzesco.

Non c'è hasAttr ma il colpire un attributo in base al nome restituirà undefined se non esiste.

Ecco perché funziona di seguito. Se rimuovi l'attributo nome da #heading, il secondo avviso verrà attivato.

Aggiornamento: Come per i commenti, il seguito sarà SOLO lavoro se l'attributo è presente E è impostato su qualcosa che non se l'attributo è lì, ma vuota

<script type="text/javascript"> 
$(document).ready(function() 
{ 
    if ($("#heading").attr("name")) 
     alert('Look, this is showing because it\'s not undefined'); 
    else 
     alert('This would be called if it were undefined or is there but empty'); 
}); 
</script> 
<h1 id="heading" name="bob">Welcome!</h1> 
+1

Il comportamento è lo stesso in entrambi i casi però. Puoi scambiare una valutazione di falso con indefinito nell'istanza che sto mostrando lì. .attr ("nome") non sta restituendo falso, ma sta valutando come falso. Quindi puoi usarlo esattamente come sopra. –

+15

se il nome attr è presente ma stringa vuota, l'attributo esiste ma il test fallirà. – lambacck

+4

La domanda chiedeva se l'attributo era lì, non cosa fare se era vuoto. –

130

Se verificherete frequentemente l'esistenza di attributi, suggerirei di creare una funzione hasAttr da utilizzare come avete ipotizzato nella vostra domanda:

$.fn.hasAttr = function(name) { 
    return this.attr(name) !== undefined; 
}; 

$(document).ready(function() { 
    if($('.edit').hasAttr('id')) { 
     alert('true'); 
    } else { 
     alert('false'); 
    } 
}); 

<div class="edit" id="div_1">Test field</div> 
+3

@TreeUK - non è un refuso,! == è quello che intendevo. – karim79

+2

Cool, non l'avevo visto prima :) [! == non è esattamente uguale a (valore e tipo)] –

+1

"indefinito" non è una parola chiave in javascript (vedi http://constc.blogspot.com/ 2008/07/non dichiarato-undefined-null-in-javascript.html). Mettendo "var undefined;" la prima riga della tua funzione hasAttr() è la soluzione più semplice per questo. – mhenry1384

14

Il modo migliore per farlo sarebbe stato con filter():

$("nav>ul>li>a").filter("[data-page-id]"); 

sarebbe comunque bello avere .hasAttr(), ma come non esiste c'è in questo modo.

+1

E puoi filtrarlo per valore come '$ (" nav> ul> li> a "). Filter (" [data-page-id = 123] ");' –

+0

come trovare il tag con l'attributo src. ad es .: caricamento di alcune immagini in modo dinamico. come come trovare questo secondo e aggiungere qualche classe a quello. pls help – Anoops

+0

@Anoops Potete trovare elementi senza un attributo specifico sfruttando il selettore ': not()' psuedo. '$ ('. img-circle'). filter (': not ([src])')' –

5

È possibile anche utilizzarlo con attributi quali disabled = "disabilitato" sui campi del modulo, ecc in questo modo:

$("#change_password").click(function() { 
    var target = $(this).attr("rel"); 
    if($("#" + target).attr("disabled")) { 
     $("#" + target).attr("disabled", false); 
    } else { 
     $("#" + target).attr("disabled", true); 
    } 
}); 

L'attributo "rel" memorizza l'id del campo di input di destinazione.

540

Che ne dici di solo $(this).is("[name]")?

Il [attr] sintassi è il selettore CSS per un elemento con un attributo attr e .is() controlla se l'elemento è chiamato corrisponde dato selettore CSS.

+7

e se si voleva semplicemente selezionare tutti gli elementi con un attributo name in primo luogo, basta fare '$ ('[ nome] ') ' –

+0

Per coloro che sono interessati a controllare le classi in SVG DOM utilizzando JQuery, questa potrebbe essere un'alternativa. –

+3

nota: con questo selettore non funzionerà: '[CamelizedAttr]' –

5

Ho scritto un plugin hasAttr() per jquery che eseguirà tutto ciò in modo molto semplice, esattamente come richiesto dall'OP. Maggiori informazioni here

EDIT: mio plugin è stato eliminato nella grande banca dati plugins.jquery.com eliminazione disastro del 2010. Si può guardare here per alcune informazioni su come aggiungere voi stessi, e perché non è stato aggiunto .

+0

Divertente che quei link non funzionino in IE 8, ma fai in Chrome ... – vapcguy

6
Object.prototype.hasAttr = function(attr) { 
    if(this.attr) { 
     var _attr = this.attr(attr); 
    } else { 
     var _attr = this.getAttribute(attr); 
    } 
    return (typeof _attr !== "undefined" && _attr !== false && _attr !== null);  
}; 

Mi è venuta una croce mentre scrivevo la mia funzione per fare la stessa cosa ... Anche se condividerei il caso in cui qualcun altro inciampi qui. Ho aggiunto null perché getAttribute() restituirà null se l'attributo non esiste.

Questo metodo consente di controllare oggetti jQuery e oggetti javascript regolari.

67

In ritardo alla festa, ma ... perché non solo this.hasAttribute("name")?

consultare This

+0

Buona risposta se non hai bisogno dell'oggetto jquery – Harry

+17

o se non ti interessa che non funzioni in molti vecchi browser e IE – baiano

+7

@baiano IE6 e 7 sono gli unici che non supportarlo, per non parlare del fatto che IE8 è praticamente tutto ciò che sta in piedi. – Halcyon991

Problemi correlati