2009-09-09 16 views
7

Nel mio CSS ho una regola che deve essere applicato a tutti i campi di testo (utilizzando il selettore CSS3 input[type=text].Utilizzando jQuery, come scoprire se il selettore CSS "input [type = text]" è supportato nativamente dal browser?

uso anche jQuery. Alcuni browser come Internet Explorer 6 non supporta quella forma di selettore CSS. Così la mia soluzione è quella di aggiungere un nome di classe in più in CSS:

input[type=text], .workaround_classname{ 
    /* css styling goes here */ 
} 

E tramite jQuery quindi aggiungere la classe CSS:

$('input[type=text]').addClass('workaround_classname'); 

la domanda è: come faccio a essere sicuro questa regola è solo inv oked quando i selettori CSS3 non sono supportati nativamente?

+2

ho pensato di farti sapere che '[attr = val]' non è un selettore CSS3, è 2.1 e supportato da tutti i browser moderni. Le novità in CSS3 sono '[attr^= val]' e selettori simili a RegEx simili. – peirix

+1

tutti tranne ie6! si – vvo

+0

@Vincent: ho detto moderno, non è vero: p – peirix

risposta

0

Ho finito per utilizzare i commenti condizionali nel mio file javascript. In questo modo ho potuto affrontare IE6 e applicare la classe CSS

$(function(){ 
    //add css class to input[type=text] fields if the selector is not natively supported 
    // IE6 hack: Since some CSS selectors are not working, we simulate with class names. 
    /*@[email protected] (@_jscript_version <= 5.6) 
    $('input[type=text],input[type=password],input[type=radio],input[type=checkbox]'). 
     each(function() { $(this).addClass('type_' + this.type); }); 
    @[email protected]*/ 

}); 

In questo modo, ho finire con nomi di classe aggiunto per tutti i campi del modulo:

.type_text{} 
.type_radio{} 
.type_checkbox{} 
.type_password{} 
+0

davvero, fare questo è in realtà peggio di aggiungere classi agli elementi per tutti i browser quando non è possibile utilizzare alcuni selettori CSS. Inoltre, più javascript in ie6 significa meno prestazioni ... :) – vvo

+0

Vincent, ti manca un punto importante: non voglio nessun lavoro extra e nessun passo aggiuntivo non necessario eseguito dagli sviluppatori che implementano i miei stili. Gli sviluppatori dovrebbero semplicemente concentrarsi sul pensare: "Voglio un campo di testo qui ..." e NON dover ricordare di aggiungere un ulteriore 'class =" type_text "' o simile. Ho visto che sta andando male così tante volte. –

+0

Un'altra cosa che mi ha fatto preferire questa idea è che non c'è assolutamente alcuna modifica ai campi esistenti. E assolutamente nessun modo di dimenticare di impostare il nome della classe. –

3

Perché non impostare uno stile css inutile e controllare se lo stile è stato applicato. Aggiungi la classe di soluzione alternativa solo agli elementi a cui non è applicato questo stile.

L'unico problema è che non posso venire con uno stile "inutile" è possibile utilizzare :-)

+0

Penso che i commenti @ condizionali per IE6 possano fare il trucco. (vedi la mia risposta qui sotto). In questo modo, gli stili possono essere applicati solo a tutti i campi di testo e solo se il browser non lo supporta in modo nativo. In 8-10 anni in cui IE6 è in fase di eliminazione, è possibile rimuovere il commento condizionale @. –

0

Non c'è un modo semplice per sapere "questo browser supporta i selettori CSS3". Tutto quello che puoi fare è rilevare la versione del browser e del browser.

Modernizr non ti aiuterà poiché non è possibile rilevare se un determinato selettore CSS funziona in un file .css. (O devi controllare se una particolare proprietà CSS dal tuo selettore CSS è applicata e QUESTO è davvero brutto!)

MA! Qui il modo più semplice sarebbe quello di dimenticare i selettori di CSS 2.1 come [attr =] nei file .css perché non è ampiamente supportato. E se devi scrivere per i browser che non li supportano (come Internet Explorer 6), non puoi semplicemente usarli.

Quindi, aggiungi un corso per tutti. Il tuo codice sarà più facile da capire, altrimenti aggiungerai sempre codice JavaScript non necessario.

Capisco che non ti sto rispondendo, ma questo è b-a-d!

1

Perché non basta avere

input.workaround_classname{ 
    /* css styling goes here */ 
} 

quindi aggiungi workaround_classname a tutti gli input di testo nel tuo markup.

I selettori si potrebbe usare sono (credo che il secondo è probabilmente quello che sarebbe stato più facile da capire che cosa stava selezionando per qualcun altro la lettura del codice)

$('input:text') 
// or 
$('input:text.workaround_classname') 
// or 
$('input.workaround_classname') 

allora non è necessario il rilevamento e si non si baserà su JavaScript per aggiungere il nome della classe.

Problemi correlati