<button>標籤的定義及用法
w3school的解釋:
<button> 標籤定義一個按鈕。
在 button 元素內部,您可以放置內容,比如文本或圖像。這是該元素與使用 input 元素創建的按鈕之間的不同之處。
<button> 控件 與<input type=”button”> 相比,提供了更爲強大的功能和更豐富的內容。<button> 與 </button> 標籤之間的所有內容都是按鈕的內容,其中包括任何可接受的正文內容,比如文本或多媒體內容。例如,我們可以在按鈕中包括一個圖像和相關的文本,用它們在按鈕中創建一個吸引人的標記圖像。
唯一禁止使用的元素是圖像映射,因爲它對鼠標和鍵盤敏感的動作會干擾表單按鈕的行爲。
請始終爲按鈕規定 type 屬性。Internet Explorer 的默認類型是 “button”,而其他瀏覽器中(包括 W3C 規範)的默認值是 “submit”。
研究了一下最後一句話,嘗試了三種情況:
1.在表單以外的地方使用<button>標籤,表現爲正常的按鈕,可以用做事件觸發器。
2.在表單中使用<button>標籤,但未指定type屬性值,會像type值爲submit的input控件一樣完成表單提交動作。(IE8以下瀏覽器不會提交,正如上文,IE默認<button>標籤的類型是”button”)
3.在表單中使用<button>標籤並指定屬性爲”button”, 即<button type=”button”> 隨便寫點字 </button>。表現和情況1中一樣,不會提交表單。
註釋:如果在 HTML 表單中使用 button 元素,不同的瀏覽器會提交不同的按鈕值。請使用 input 元素在 HTML 表單中創建按鈕。
看到這句話很奇怪,按鈕的值怎麼會提交呢,這和我之前的認知不一樣,嘗試後發現button的值確實是不會提交的,大概是我語文不好,理解有歧義。其實這句話的意思是你用操作DOM的方法去獲取button元素的value值時不同的瀏覽器取到的情況不一樣。
比如以下代碼:
html代碼:
<button type="button" id="btn" value="btn">按鈕</button>
js代碼:
var btn = document.getElementById('btn');
console.log(btn.value);
console.log(btn.getAttribute("value"));
兩句console語句打印出的結果是一樣的:IE8以下都打印“按鈕”,其他瀏覽器以及更高版本的IE都打印“btn”。
另外button對應一個DOM對象名爲Button;在元素上調用toString()方法會返回[object HTMLButtonElement]。
w3school上介紹Button對象時有這麼一個表格。
Button 對象的屬性
屬性 | 描述 |
---|---|
accessKey | 設置或返回訪問某個按鈕的快捷鍵。 |
disabled | 設置或返回是否禁用按鈕。 |
form | 返回對包含按鈕的表單的引用。 |
id | 設置或返回按鈕的 id。 |
name | 設置或返回按鈕的名稱。 |
tabIndex | 設置或返回按鈕的 Tab 鍵控制次序。 |
type | 返回按鈕的表單類型。 |
value | 設置或返回顯示在按鈕上的文本。 |
如果按照這個表格裏對value的解釋,那上文的console.log(btn.value); 代碼應該返回文本值“按鈕”纔對,這個估計就是瀏覽器實現的問題了,標準和現實總是有差別的,記住有這麼個bug就行了。
另外H5中button還有一堆新屬性:
HTML 5 中的新屬性:autofocus, form, formaction, formenctype, formmethod, formnovalidate 以及 formtarget。
感興趣的可以自己瞭解,這不是本文的重點。
再說說<input type=”button”>
很顯然,相比<button>標籤<input type=”button”> 的可操作性就要低很多了。它本質上也只是input控件的其中一個類型,在元素上調用toString()方法會返回[object HTMLInputElement]。好像也沒有什麼特殊的地方可說的。
其實我一直在疑惑<button>標籤到底該不該算作表單控件,提交功能有submit也用不着它,w3c也建議表單中實現按鈕一般也使用type=”button”,好像<button>標籤用在表單以外的場景才比較多,然後搜了一下,發現了一篇博客,列舉了表單控件,其中也有button,傳送門
總結:在表單中使用<input type=”button”> 創建按鈕,如果需要樣式化可以採用CSS方法實現,避免使用<button>標籤時沒有指定type屬性誤提交了表單的尷尬情況;在表單以外的地方可以使用<button>標籤創建按鈕,當然如果要取value值的時候要注意兼容性的問題(雖然個人覺得現在應該很少再有要兼容到IE8以下的變態要求了)。
以上內容如有錯誤之處歡迎指正。