2010-02-10 17 views
6

posso controllare se un elemento ha un attributo specifico con:controllo jQuery se elemento contiene qualsiasi attributo

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

Come posso controllare se un elemento ha un attributo?

Grazie

+0

Mi chiedo se jQuery offre qualcosa come '$ (" # a [*] ")'? –

+0

@Naeem: Penso che potrebbe essere una funzionalità così bella, ma dal momento che ci sono modi semplici per risolvere questo problema, non penso che potrebbero aggiungerlo. – Tarik

risposta

6

Ecco una funzione che t determina se uno qualsiasi degli elementi che corrispondono a un selettore di avere almeno un attributo:

function hasOneOrMoreAttributes(selector) { 
    var hasAttribute = false; 
    $(selector).each(function(index, element) { 
     if (element.attributes.length > 0) { 
      hasAttribute = true; 
      return false; // breaks out of the each once we find an attribute 
     } 
    }); 
    return hasAttribute; 
} 

Usage:

if (hasOneOrMoreAttributes('.someClass')) { 
    // Do something 
} 

Se si vuole operare su elementi selezionati che hanno almeno un attributo, è ancora più facile - si crea un filtro personalizzato:

// Works on the latest versions of Firefox, IE, Safari, and Chrome 
// But not IE 6 (for reasons I don't understand) 
jQuery.expr[':'].hasAttributes = function(elem) { 
    return elem.attributes.length; 
}; 

che è possibile utilizzare in questo modo:

$(document).ready(function(){ 
    $('li:hasAttributes').addClass('superImportant'); 
} 
+0

Non è un po 'troppo: '$ (" alcuni "). Ottenere (0) .attributi> 0' sarebbe sufficiente Credo. – Tarik

+0

@Tarik - che controlla solo il primo elemento abbinato, quando potrebbero esserci più corrispondenze. –

+0

@Jeff - C'è un modo per aggiungere una classe agli elementi che hanno attributi con questa funzione? Grazie ancora – Mircea

9

Se volete vedere se l'elemento ha un particolare attributo, solo fare questo:

if ($('#something').is('[attribute]')) { 
    // ... 
} 
+1

Sono interessato a vedere se un elemento ha un attributo non specifico. – Mircea

+0

OK, ma il punto è che ciò che hai digitato nel tuo esempio sopra non funzionerà. – Pointy

+0

Oh, Ok, capisco il tuo punto ... Grazie – Mircea

2

Non un intero codice jQuery ma funzionerà

$("a").click(
function() { 
    if($("a").get(0).attributes > 0) 
     alert("it has attributes"); 
}) 
+0

Grazie Tarik, sto cercando in questo – Mircea

0

Ecco una soluzione che ho trovato per essere più affidabile di sapere se un elemento è definito attributi che funziona in IE, Chrome e Firefox:

$(selector).each(function(index, element) { 
    if (element.hasAttributes) { // Some browser supports this method 
     if (element.hasAttributes()) { 
      return true; 
     } 
    } else { 
      // IE counts many attributes - even if not set explicitly 
      var attrs = element.attributes; 
      for (var i = 0; i < attrs.length; i++) { 
       if (attrs[i].specified) { 
        return true; 
       } 
      } 
    } 
    return false; 
}); 

Il problema è che IE ritorna elevato numero di attributi anche quando nessuno è impostato in modo esplicito. Ad esempio, per un semplice tag <, IE mi diceva che aveva 111 attributi. Con questa soluzione, sono stato in grado di filtrare gli attributi che non ero interessato a

Questa soluzione stato portato qui:. (! Appena copiato nel caso in cui la pagina viene rimossa) http://help.dottoro.com/ljevmnkf.php

1

Sono non è sicuro se hai intenzione di tornare solo gli elementi che contengono l'attributo, ma se siete, ho trovato il metodo più semplice per essere:

$('selector[attribute]') 

che restituirà l'oggetto jQuery per includere tutti gli elementi che contenere l'attributo indipendentemente dal suo valore. Per esempio.

$(':text[maxlength]').addClass('has_max_length'); 

Ciò darebbe tutti gli ingressi di testo con l'attributo maxlength una classe di 'has_max_length'.

4
$("selector").get(0).hasAttributes("attributes"); 
+0

Ottima risposta! Grazie –

Problemi correlati