2012-01-08 68 views
6

我讀到一些關於布爾屬性here,它說,對於布爾屬性(在這個特殊的例子,loop<audio>屬性),你設置任何值,它會被認可如「真」。爲了真正設置爲虛假,您不能將其設置爲loop=false或javascript作爲['loop']=false,但必須刪除屬性,例如通過執行removeAttribute('loop')。這是真的?設置假值與移除屬性

我第一次相信它,但就用Chrome來檢查它,似乎設置爲['loop']=false實際上會使它被識別爲falsy。我不確定跨瀏覽器考慮時這個事實有多強大。瀏覽器之間有什麼區別嗎?

+0

我更喜歡[falsy]這個詞(http://en.wikipedia.org/wiki/JavaScript_syntax#Boolean) – mplungjan 2012-01-08 06:15:02

+2

根據這個,有價值的禮物被認爲是真實的,你會更安全的去那種方式,而不是設置爲false。 - http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.3.4.2 – JohnP 2012-01-08 06:16:33

回答

4

布爾屬性進行了說明:

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

一些屬性上的布爾變量的作用(例如,所選擇的 屬性的OPTION元素)。它們出現在元素的開始標記 中意味着該屬性的值是「真」。他們的 缺席意味着「虛假」的價值。

布爾屬性可以合法地採用單個值: 屬性本身的名稱(例如,selected =「selected」)。

因此,雖然有些瀏覽器可能會將字符串「false」解釋爲好像該值未設置,但其他人可能不會決定(哪個是正確的行爲)。實際上,據我所知(或認爲),任何非空字符串通常將值設置爲on/true(不管規範說的是合法值)。我相信這也是未定義的行爲,所以這可能會改變或不同,從瀏覽器到瀏覽器(不要依賴它)。

底線是,只是因爲瀏覽器或兩個可能偏離規範並不意味着應該。完全刪除屬性是要走的路。

附錄:看看你的意見和質疑,我想你可能會對一般屬性值感到困惑。在HTML中,attr=falseattr="false"完全相同。任何版本的HTML都不需要引號(除非在值包含空格時需要消除歧義)。例如:

<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 --> 

所有屬性值(在具有它們的元素上)都被視爲字符串。換句話說,HTML中沒有像真實布爾值(或NULL值)那樣的東西,就像在javascript中一樣。

+0

感謝您的附錄,但我知道,在HTML中,它們被解釋爲字符串。這就是爲什麼我提到JavaScript。在javascript中,我可以像'['loop'] = false'那樣執行''false',而不是'''loop'] ='false''。你的回答有幫助。 – sawa 2012-01-08 07:02:04

+0

@sawa:然後對附錄抱歉。我從來沒有在javascript中看到類似'['loop'] = false'的東西,也許'element.loop = false'。不知道你的語法在哪裏?我也看到你來自CT。所以,我對不起,以及:) – 2012-01-08 07:38:35

+0

我看到,你也在CT。你的回答對我有幫助,而且我看不出有什麼問題。謝謝您的幫助。 – sawa 2012-01-08 08:03:08

1

只是讓任何人誰需要這樣的未來:

loop=false仍然true除非整個loop屬性被刪除。基本上,只有loop的存在纔是標籤需要做別的事情。你需要使用類似jQuery的東西來刪除entier loop屬性(或者至少這是我會做的)。現在,如果您將其他未定義的屬性設置爲false,那麼您可以將其識別爲false

0

你在混淆字符串和真正的布爾類型。 Javascript有一個布爾數據類型,包含兩個可能的值true和false(不含引號)。字符串可以包含任何文本,所以它們可以包含帶引號的「true」和「false」。設置屬性,以非空和非假產生true,所以下面將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 

注意與C

+0

他實際上是指它的HTML部分而不是JS。問題沒有正確標記 – JohnP 2012-01-08 06:22:28

+0

噢,是的,對不起。誤解了這個問題 – 2012-01-08 06:23:28

+0

嘿,不是我沒有仔細閱讀的情況...這是標記爲「javascript」的情況! – 2012-01-08 06:24:40

1

audio元素是一個HTML5元素的相似性,所以關於它的意義,你應該參考HTML5草案。在這種情況下,請參閱WHATWG草案開發者版本中的definition of boolean attributes。它實際上說,a)屬性的存在或不存在決定了DOM屬性值是否爲truefalse,以及b)作爲對文檔的要求,該值必須是空的或(不區分大小寫)屬性名稱,在這種情況下爲loop=''loop="loop"。在值的周圍使用引號在其他地方定義。

因此,瀏覽器需要識別loop=false意味着與loop=looploop=true相同,但作者不得使用此類結構,並且HTML5檢查器會發出關於它們的錯誤消息。

(基本上,你應該使用HTML5的HTML序列化,只looploop="loop"在XHTML序列化。)

因此,如果你在JavaScript中的變量xaudio元素對象作爲其值, x.loop的值爲truefalse,而x.attributes['loop'].value表示HTML標記中使用的值(通常不會像這樣感興趣)。

關於Firefox還有一個更復雜的問題:它似乎仍不支持loop屬性(請參閱問題HTML5 Audio Looping)。這意味着如果你設置了例如loop="loop",x.attributes['loop'].value將爲loop,但Firefox甚至不設置x.loop(即,它是undefined),但更少實現該功能。

+0

感謝您爲我的問題量身打造的詳細解答。 – sawa 2012-01-08 10:00:41