2012-01-08 14 views
6

Stavo leggendo qualcosa su attributo booleano here, che dice che per un attributo booleano (in questo particolare esempio, loop attributo della <audio>), qualunque sia il valore impostato, che sta per essere riconosciuto come "vero". Per impostare realmente la falsificazione, non è possibile impostarlo come loop=false o con javascript come ['loop']=false, ma è necessario rimuovere l'attributo come ad esempio facendo removeAttribute('loop'). È vero?Impostazione valore falso contro la rimozione di un attributo

L'ho creduto per la prima volta, ma per quanto riguarda il controllo con Chrome, sembra che l'impostazione su ['loop']=false in realtà lo faccia riconoscere come falsa. Non sono sicuro di quanto sia robusto questo fatto se considerato cross-browser. C'è qualche differenza tra i browser?

+0

Preferisco la parola [falsy] (http://en.wikipedia.org/wiki/JavaScript_syntax#Boolean) – mplungjan

+2

In base a questo, avere il valore presente è considerato vero e si sarebbe più sicuro andare in quel modo piuttosto che impostazione falsa. - http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.3.4.2 – JohnP

risposta

4

attributi booleani sono spiegati qui:

http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.3.4.2

Alcuni attributi svolgono il ruolo di variabili booleane (ad esempio, la scelta attributo per l'elemento OPTION). Il loro aspetto nel tag iniziale di un elemento implica che il valore dell'attributo sia "true". La loro assenza implica un valore di "falso".

Gli attributi booleani possono assumere legalmente un singolo valore: il nome dell'attributo stesso (ad esempio, selezionato = "selezionato").

Quindi, mentre alcuni browser possono interpretare la stringa "falso" come se il valore non fosse stato impostato, altri potrebbero non decidere (quale è il comportamento corretto). In realtà, per quanto ne so (o pensato), qualsiasi stringa non vuota di solito imposta il valore su on/true (indipendentemente da ciò che dice la specifica è un valore legale). Credo che questo sia anche un comportamento indefinito, quindi potrebbe cambiare o essere diverso da browser a browser (non fare affidamento su di esso).

La linea di fondo è, solo perché un browser o due può deviare dalla specifica non significa che si dovrebbe. Rimuovere completamente l'attributo è la strada da percorrere.

Addendum: Osservando i commenti e le domande un po 'più da vicino, penso che si possa essere confusi sui valori degli attributi in generale. In HTML, attr=false e attr="false" sono esattamente gli stessi. Le quotazioni non sono richieste in nessuna versione di HTML (a meno che non siano necessarie per rimuovere l'ambiguità quando il valore contiene spazi). Ad esempio:

<input class=required> 
<!-- This is fine --> 

<input class=title required> 
<!-- this is fine too, but "required" will be parsed as an attribute --> 

<input class="title required"> 
<!-- To have two classes, we need the quotes --> 

Tutti i valori di attributo (sugli elementi che li hanno) sono trattati come stringhe. In altre parole, non esiste un valore booleano booleano (o NULL) in HTML come in javascript.

+0

Grazie per l'addendum, ma sono consapevole che in html, sono interpretati come stringhe. Ecco perché stavo citando javascript. In javascript, posso fare cose come '['loop'] = false' senza virgolette attorno a' false', e questo è diverso da '['loop'] = 'false''. La tua risposta ha aiutato. – sawa

+0

@sawa: mi dispiace per l'addendum allora. Non ho mai visto nulla di simile a '['loop'] = false' in javascript per questo, forse' element.loop = false'. Non sei sicuro di dove hai questa sintassi? Vedo anche che sei di CT. Lo sono anch'io. Scusami anche per questo :) –

+0

Vedo, sei anche a CT. La tua risposta mi ha aiutato e non riesco a vedere alcun problema. Grazie per l'aiuto. – sawa

1

Just so chi ha bisogno di questo in futuro:

loop=false rimane true meno che l'intero attributo loop viene rimosso. Fondamentalmente, la presenza di solo loop è ciò che un tag deve fare qualcos'altro. È necessario utilizzare qualcosa come jQuery per rimuovere l'attributo enteer loop (o almeno questo è quello che farei). Ora, se si imposta un attributo non definito diverso su false, sarà possibile riconoscerlo come false.

0

Stai confondendo stringhe e tipi booleani reali. Javascript ha un tipo di dati booleano con due possibili valori di vero e falso (senza virgolette). Le stringhe possono contenere qualsiasi testo, quindi possono contenere "true" e "false" con virgolette. L'impostazione di una proprietà per non nullo e non falsi rendimenti vero, così il seguente sarà accour:

var a = true; // true 
var b = false; // false 
var c = "true"; // true 
var d = "false" // true 
var e = null; // false; 
var f = 0; // false 
var g = 1; // true 

nota le somiglianze con C.

+0

In realtà si riferisce alla parte HTML di esso e non a JS. La domanda non è codificata correttamente – JohnP

+0

Oh sì, mi dispiace. Ho frainteso la domanda –

+0

Ehi, non è il caso che non stavo leggendo abbastanza attentamente ...è il caso che è taggato "javascript"! –

1

L'elemento audio è un elemento HTML5, in modo per quanto riguarda il suo significato, dovresti consultare le bozze HTML5. In questo caso, vedere definition of boolean attributes nella versione dello sviluppatore della bozza WHATWG. Dice, in effetti, a) che la presenza o l'assenza dell'attributo determina se il valore dell'attributo DOM è true o false e b) come requisito sui documenti, il valore deve essere vuoto o (senza distinzione tra maiuscole e minuscole) il nome dell'attributo , in questo caso loop='' o loop="loop". L'uso di virgolette attorno al valore è definito altrove.

Così, i browser sono tenuti a riconoscere loop=false allo stesso valore di loop=loop o loop=true, ma gli autori non devono utilizzare tali costrutti ei correttori HTML5 emettono messaggi di errore su di essi.

(In sostanza, si suppone di utilizzare solo loop in HTML serializzazione di HTML5 e loop="loop" in XHTML serializzazione.)

Quindi, se si dispone di una variabile x in JavaScript con un oggetto audio elemento come il suo valore, x.loop ha il valore true o false mentre x.attributes['loop'].value indica il valore utilizzato nel codice HTML (che di solito non è interessante come tale).

C'è un'ulteriore complicazione per quanto riguarda Firefox: non sembra ancora supportare l'attributo loop (vedere la domanda HTML5 Audio Looping). Ciò significa che se imposti es. loop="loop", x.attributes['loop'].value sarà loop ma Firefox non imposta nemmeno x.loop (vale a dire, è undefined), ancora meno implementare la funzionalità.

+0

Grazie per la risposta dettagliata su misura per la mia domanda. – sawa

Problemi correlati