[英]HTML input - name vs. id
使用HTML <input>
標簽時,使用name
和id
屬性有什么區別,特別是我發現它們有時被命名為相同?
在HTML4.01中:
名稱屬性
<a>
, <form>
, <iframe>
, <img>
, <map>
, <input>
, <select>
, <textarea>
getElementsByName()
引用 id
屬性共享相同的命名空間 name
屬性的輸入標記提交給服務器 Id屬性
<base>
, <html>
, <head>
, <meta>
, <param>
, <script>
, <style>
, <title>
之外的任何元素都有效 #
符號在CSS或URL中引用 getElementById()
引用,jQuery用$(#<id>)
引用 _
),破折號( -
冒號( :
(),或句號.
) 在(X)HTML5中,除了以下內容之外,一切都是相同的:
名稱屬性
<form>
不再有效 Id屬性
這個問題是在HTML4.01成為常態時編寫的,許多瀏覽器和功能都與今天不同。
name屬性用於發布到例如web服務器。 id主要用於css(和javascript)。 假設你有這個設置:
<input id="message_id" name="message_name" type="text" />
為了在發布表單時使用PHP獲取值,它將使用name-attribute,如下所示:
$_POST["message_name"];
如前所述,id用於樣式,用於何時使用特定的css。
#message_id
{
background-color: #cccccc;
}
當然,您可以對id和name-attribute使用相同的面額。 這兩個不會相互干擾。
此外,名稱可用於更多項目,例如當您使用radiobuttons時。 然后使用名稱對您的單選按鈕進行分組,因此您只能選擇其中一個選項。
<input id="button_1" type="radio" name="option" />
<input id="button_2" type="radio" name="option" />
在這個非常具體的案例中,我可以進一步說明如何使用id,因為你可能想要一個帶有radiobutton的標簽。 Label有一個for-attribute,它使用輸入的id將此標簽鏈接到您的輸入(當您單擊標簽時,選中該按鈕)。 示例可以在下面找到
<input id="button_1" type="radio" name="option" /><label for="button_1">Text for button 1</label>
<input id="button_2" type="radio" name="option" /><label for="button_2">Text for button 2</label>
...在頁面DOM元素樹中,因此每個控件都可以通過其在客戶端(在瀏覽器頁面內)的id
來單獨訪問
在您的網頁上擁有非唯一ID仍會呈現您的網頁,但它肯定無效。 解析無效的HTML時,瀏覽器非常寬容。 但不要因為看起來它有效而不這樣做。
...在同一類型的幾個控件之間的頁面DOM內(想想單選按鈕),所以當數據被POST到服務器時,只發送一個特定的值。 因此,當您的頁面上有多個單選按鈕時,即使存在多個具有相同name
相關單選按鈕控件,也只會將所選的一個value
發回服務器。
向服務器發送數據的附錄 :當數據發送到服務器時(通常通過HTTP POST請求),所有數據都作為名稱 - 值對發送,其中name是輸入HTML控件的
name
, value是輸入/選擇的value
由用戶。 對於非Ajax請求,這始終是正確的。 在Ajax請求中,名稱 - 值對可以獨立於頁面上的HTML輸入控件,因為開發人員可以將任何他們想要的內容發送到服務器。 通常也會從輸入控件中讀取值,但我只想說這不一定是這種情況。
在任何表單輸入類型的控件之間共享名稱有時可能是有益的。 但當? 您沒有說明您的服務器平台可能是什么,但如果您使用像Asp.net MVC這樣的東西,您將獲得自動數據驗證(客戶端和服務器)以及將發送數據綁定到強類型的好處。 這意味着這些名稱必須匹配類型屬性名稱。
現在假設您有這種情況:
因此,您的視圖模型(因為它顯示列表)的類型為IEnumerable<SomeType>
但您的服務器端只接受一個SomeType
類型的SomeType
。
每個項目都包含在自己的FORM
元素中,並且其中的輸入元素具有相同的名稱,因此當數據到達服務器(來自任何元素)時,它將被正確綁定到控制器操作所期望的字符串類型。
這個特殊情況可以在我的Creative story迷你網站上看到。 您將無法理解該語言,但您可以查看這些多種表單和共享名稱。 不要緊, ID
也是重復的(違反規則),但可以解決。 在這種情況下,這無關緊要。
name
標識表單字段*; 因此,它們可以由代表這種字段的多個可能值的控件共享(單選按鈕,復選框)。 它們將作為表單值的鍵提交。 id
標識DOM元素; 所以他們可以成為CSS或Javascript的目標。 *名稱也用於標識本地錨點,但這已被棄用,“id”是目前這樣做的首選方式。
name
是傳遞值時使用的名稱(在url或發布的數據中)。 id
用於唯一標識CSS樣式和JavaScript的元素。
id
也可以用作錨。 在過去, <a name
用於此,但您也應該使用id
作為錨點。 name
僅用於發布表單數據。
name用於DOM (文檔對象模型)中的表單提交 。
ID用於DOM中html控件的唯一名稱 ,專門用於Javascript和CSS
一旦提交表單,名稱就會定義屬性的名稱。 因此,如果您想稍后閱讀此屬性,您將在POST或GET請求中的“名稱”下找到它。
而id用於在javascript或css中添加字段或元素。
id用於唯一標識JavaScript或CSS中的元素。
該名稱用於表單提交。 提交表單時,只會提交帶有名稱的字段。
我希望您能找到以下有用的簡短示例:
<!DOCTYPE html>
<html>
<head>
<script>
function checkGender(){
if(document.getElementById('male').checked) {
alert("Selected gender: "+document.getElementById('male').value)
}else if(document.getElementById('female').checked) {
alert("Selected gender: "+document.getElementById('female').value)
}
else{
alert("Please choose your gender")
}
}
</script>
</head>
<body>
<h1>Select your gender:</h1>
<form>
<input type="radio" id="male" name="gender" value="male">Male<br>
<input type="radio" id="female" name="gender" value="female">Female<br>
<button onclick="checkGender()">Check gender</button>
</form>
</body>
</html>
在代碼中,請注意兩個'name'屬性在定義'male'或'female'之間的可選性時是相同的,但'id'不等於區分它們。
添加對W3文檔的一些實際引用,這些文檔權威地解釋了'name'屬性在表單元素上的作用。 (為了它的價值,我來到這里,同時探究Stripe.js如何實現與支付網關Stripe的安全交互。特別是,什么原因導致表單輸入元素被提交回服務器,或阻止它被提交? )
以下W3文檔是相關的:
HTML 4: https : //www.w3.org/TR/html401/interact/forms.html#control-name第17.2節控件
HTML 5: https : //www.w3.org/TR/html5/forms.html#form-submission-0和https://www.w3.org/TR/html5/forms.html#constructing-the-form -data-set第4.10.22.4節構造表單數據集。
如其中所解釋的,當且僅當它具有有效的“名稱”屬性時,瀏覽器將提交輸入元素。
正如其他人所指出的,'id'屬性唯一地標識DOM元素,但不參與正常的表單提交。 (雖然'id'或其他屬性當然可以通過javascript使用來獲取表單值,然后javascript可以用於AJAX提交等等。)
關於先前的答案/評論者的一個奇怪的問題是關於id的值和名稱的值在同一名稱空間中。 到目前為止,我從規范中可以看出,這適用於某些已棄用的name屬性(不是表單元素)。 例如https://www.w3.org/TR/html5/obsolete.html :
“作者不應該在元素上指定name屬性。如果屬性存在,則其值不能是空字符串,並且不能等於元素的home子樹中除元素自己的ID之外的任何ID的值,如果有的話,也不等於元素主子樹中元素的任何其他名稱屬性的值。如果該屬性存在且元素有ID,則屬性的值必須等於元素的ID。在該語言的早期版本中,此屬性旨在指定URL中片段標識符的可能目標。應使用id屬性。“
很明顯,在這種特殊情況下,'a'標簽的id和name值之間存在一些重疊。 但這似乎是處理片段ID的一個特點,而不是由於id和名稱的命名空間的一般共享。
輸入的name
屬性由其父HTML <form>
用於將該元素包含為POST
請求中的HTTP表單的成員或GET
請求中的查詢字符串。
id
應該是唯一的,因為JavaScript應該使用它來選擇DOM中的元素進行操作並在CSS選擇器中使用。
使用相同名稱的一個有趣的例子:類型為checkbox
input
元素,如下所示:
<input id="fruit-1" type="checkbox" value="apple" name="myfruit[]">
<input id="fruit-2" type="checkbox" value="orange" name="myfruit[]">
至少如果PHP處理了響應,如果同時選中這兩個框,則POST數據將顯示:
$myfruit[0] == 'apple' && $myfruit[1] == 'orange'
我不知道這種數組結構是否會與其他服務器端語言一起發生,或者name
屬性的值只被視為一個字符串,而且這是一種基於0的數組的PHP語法僥幸根據POST響應中的數據順序構建,這只是:
myfruit[] apple
myfruit[] orange
不能用ids做那種伎倆。 HTML中id屬性的有效值是什么? 似乎引用了HTML 4的規范(雖然他們沒有給出引用):
ID和NAME令牌必須以字母([A-Za-z])開頭,后面可以跟任意數量的字母,數字([0-9]),連字符(“ - ”),下划線(“_”) ,冒號(“:”)和句號(“。”)。
因此,字符[
和]
在HTML4中的ID或名稱中都無效(在HTML5中它們可以正常使用)。 但是和html這么多東西一樣,只是因為它無效並不意味着它不起作用或者不是非常有用。
如果您使用的是JavaScript / CSS,則必須使用控件的“id”來應用任何CSS / JavaScript內容。
如果使用name,則CSS不適用於該控件。 例如,如果您使用附加到文本框的JavaScript日歷,則必須使用文本控件的id為其分配JavaScript日歷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.