2011-06-28 25 views
6

Nếu bạn có nhiều phần tử biểu mẫu có cùng một hình thức, mục nhập trong bộ sưu tập elements trên biểu mẫu sẽ kết thúc là một tập hợp các trường đó (tiện dụng). Đặc tả HTML DOM2 covers the elements collection nhưng dường như không xác định ngay hành vi này khi có nhiều trường có cùng tên. Hành vi có được bao gồm bởi một tiêu chuẩn (một nơi khác trong đặc tả HTML DOM2 hay trong một đặc tả khác) không?Các phần tử biểu mẫu có cùng tên được phản ánh trong DOM

Để rõ ràng, tôi không hỏi cách tốt nhất để truy cập các trường này là gì. Tôi hỏi liệu thực tế họ kết thúc trong một bộ sưu tập (của các loại khác nhau) trên bộ sưu tập elements được bao phủ bởi một tiêu chuẩn, và nếu như vậy mà một.

Ví dụ (live copy):

HTML:

<form id="theForm"> 
<input type="text" name="foo" value="one"> 
<input type="text" name="foo" value="two"> 
</form> 

JavaScript:

var form = document.getElementById("theForm"), 
    foo = form.elements.foo, 
    index; 
console.log("typeof foo = " + typeof foo); 
if (typeof foo !== "undefined") { 
    console.log("Object#toString says: " + Object.prototype.toString.call(foo)); 
} 
if ('length' in foo && 'item' in foo) { 
    console.log("Looks like a collection of some kind:"); 
    for (index = 0; index < foo.length; ++index) { 
    console.log(index + ": " + foo[index].value); 
    } 
} 

Mẫu đầu ra (đối với Chrome):

typeof foo = object 
Object#toString says: [object NodeList] 
Looks like a collection of some kind: 
0: one 
1: two

Tôi đã kiểm tra IE6 , 7, 8, một d 9, Firefox 4.0, Firefox 3.6, Chrome 12, Opera 11 và Safari 5. Tất cả đều tạo mục nhập trong elements một bộ sưu tập của một số loại (Chrome, Firefox và Safari làm cho nó là NodeList [mặc dù kỳ lạ trên Safari là typeof là "function" not "object"] và IE và Opera biến nó thành HTMLCollection, nhưng tất cả đều có số length, item và truy cập []). Tôi chỉ cố gắng tìm tiêu chuẩn, nếu có, chỉ định hành vi.

+0

Tại sao không sử dụng document.getElementsByName ("fieldNAME") trả về mảng trong tất cả các trình duyệt – mplungjan

+1

@mplungjan: @ T.J. chỉ muốn biết liệu hành vi này có được định nghĩa ở đâu đó không. –

+0

@mplungjan: Trích dẫn: * "Tôi không hỏi cách tốt nhất để truy cập các trường này là gì. Tôi hỏi liệu thực tế chúng kết thúc trong một bộ sưu tập (các loại khác nhau) trên bộ sưu tập' elements' có được bao hàm hay không một tiêu chuẩn, và nếu như vậy mà một. "* Tôi biết tôi có thể sử dụng' getElementsByName' (mặc dù nó sẽ cho tôi ** tất cả ** của các yếu tố với tên đó, không chỉ là những người trong các hình thức). Điểm của câu hỏi là tiêu chuẩn. –

Trả lời

2

Nó được đề cập trong dự thảo đặc tả HTML5 (và WH AT-WG phiên bản), mà trong trường hợp này có vẻ thêm về tài liệu như thế nào nó luôn luôn làm việc, trong phần trên HTMLFormControlsCollection (W3C ref, WHAT-WG ref):

Nếu có nhiều mặt hàng phù hợp, sau đó một [HTMLFormControlsCollection (W3C ref, WHAT-WG ref) đối tượng chứa tất cả các phần tử đó được trả về.

+0

Cảm ơn! Tôi đã cập nhật câu trả lời để liên kết với thông số HTML5 tại W3C, bởi vì đó chắc chắn là một đặc điểm kỹ thuật (không khiến tôi bắt đầu chính trị xung quanh mối quan hệ WHAT-WG/W3C). Tên lẻ cho nó (đây có thể không phải là nút radio), nhưng hey. Điều đó đặc biệt liên quan đến hàm 'namedItem', nhưng nhờ vào phần ánh xạ ECMAScript của [DOM2 HTML spec] (http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/DOM2 -HTML.html # ecma-script-binding) chúng tôi biết rằng [] sử dụng nó. –

+0

Truy cập '[]' trong thông số HTML thực tế là từ [đặc tả WebIDL] (http://dev.w3.org/2006/webapi/WebIDL/). Hàm 'namedItem' là một [hoạt động đặc biệt] (http://dev.w3.org/2006/webapi/WebIDL/#dfn-special-operation) được gọi là _tered getter_. – Carey

+0

Tôi * biết * phải có thứ gì đó lấy từ thông số HTML DOM2, trên danh sách ref của tôi đó là "hmmm, phiên bản mới hơn của cái này ở đâu?" một. Tuyệt vời, cảm ơn - WebIDL hiện nằm trong danh sách ref của tôi. –

0

Có vẻ có sự khác biệt giữa truy cập dạng và truy cập DOM trong Firefox 4.0.1 và 5

http://jsfiddle.net/mplungjan/jMnWP/

form.foo:

typeof formFoo = object 
Object#toString says: [object NodeList] 
Looks like a collection of some kind: 
0: one 
1: two 

document.getElementsByName ("foo") :

typeof docFoo = object 
Object#toString says: [object HTMLCollection] 
Looks like a collection of some kind: 
0: one 
1: two 
+0

Không có trong Chrome .. –

+0

Thú vị! (Firefox 3.6 cũng vậy) Opera cũng làm như vậy, nhưng cách khác xung quanh ('formFoo' là một' HTMLCollection', nhưng 'docFoo' là một' NodeList'). (BTW, đây là nhiều hơn một * bình luận * hơn một câu trả lời * *.) –

+0

Tôi được đăng dưới dạng câu trả lời vì tôi có thể định dạng câu trả lời. Tôi có thể xóa nó nếu bạn cảm thấy nó không có giá trị nào – mplungjan

Các vấn đề liên quan