2012-03-30 33 views
11

Tôi nhận thấy rằng nếu bạn có một vài radio cùng nhau, bạn được yêu cầu đặt tên thuộc tính giống nhau trên tất cả chúng để radio hoạt động như mong đợi:Các thuộc tính đầu vào có thể có cùng tên "

<label for="a1"><input type="radio" name="a" id="a1" value="1">1</label> 
    <label for="a2"><input type="radio" name="a" id="a2" value="2">2</label> 
    <label for="a3"><input type="radio" name="a" id="a3" value="3">3</label> 
    <label for="a4"><input type="radio" name="a" id="a4" value="4">4</label> 

Đầu vào radio có phải là kiểu đầu vào duy nhất nơi bạn có thể có thuộc tính tên trùng lặp (và bắt buộc phải làm như vậy) không? Nếu tôi làm điều này trên bất kỳ đầu vào nào khác, trình duyệt sẽ bị coi là không hợp lệ, đúng không?

Tôi hỏi điều này vì tôi cần xử lý tình huống này trong tập lệnh và muốn biết có các loại đầu vào nào khác mà tôi nên xem xét khi xử lý nhiều tên giống nhau hay không.

Trả lời

12

Từ góc độ tương tác người dùng, input:radio yếu tố sử dụng cùng một [name] để trình duyệt biết chỉ cho phép một lần là :checked cùng một lúc.

Từ góc độ hình thức-trình, bất kỳ yếu tố có thể có cùng tên, tất cả họ sẽ được tuần tự vào chuỗi truy vấn theo quy định tại HTML Spec

Dưới đây là một vài ví dụ:

<form action="/foo/bar"> 
    <input type="hidden" name="fizz" value="buzz" /> 
    <input type="radio" name="foo" value="bar" /> 
    <input type="radio" name="foo" value="baz" /> 
    <input type="submit" value="Go" /> 
</form> 

Gửi biểu mẫu này (với nút radio bar được chọn) sẽ dẫn đến một chuỗi truy vấn là:

?fizz=buzz&foo=bar 

Ho wever, nếu bạn thay đổi tên của phần tử input:hidden để foo:

<form action="/foo/bar"> 
    <input type="hidden" name="foo" value="buzz" /> 
    <input type="radio" name="foo" value="bar" /> 
    <input type="radio" name="foo" value="baz" /> 
    <input type="submit" value="Go" /> 
</form> 

Các chuỗi truy vấn sẽ là:

?foo=buzz&foo=bar 

Máy chủ nên phân tích một cách chính xác này để bạn có thể có được cả hai buzzbar giá trị, tuy nhiên tôi đã tìm thấy rằng một số ngôn ngữ phía máy chủ có quirks khi nói đến phân tích chuỗi truy vấn.

PHP nói riêng sẽ biến phím vào mảng nếu phím được với hậu tố []:

?foo[]=buzz&foo[]=bar sẽ có $_GET['foo'] = array('buzz', 'bar');

9

là đầu vào đài phát thanh các loại đầu vào duy nhất mà bạn có thể có tên trùng lặp thuộc tính

số Bất kỳ hình thức kiểm soát có thể chia sẻ một tên với bất kỳ điều khiển biểu mẫu khác.

Điều này đặc biệt hữu ích cho các hộp kiểm (nó cho phép bạn nói "Chọn bất kỳ số nào trong số này" và sau đó lặp qua kết quả trên máy chủ mà không cần phải viết mã tên khác cho từng mục.) Và gửi nút cho phép bạn biết cái nào đã được nhấp mà không lặp lại tất cả các tên có thể).

(và bắt buộc phải làm như vậy)?

Có. Chỉ các nút radio mới có được hành vi đặc biệt dựa trên tên được chia sẻ.

+0

Server side có thể có hành vi "đặc biệt" cho các yếu tố khác mà chia sẻ cùng tên, về cách thức chúng được phân tích cú pháp/ràng buộc. Tất nhiên đó không phải là một phần của HTML spec và thay đổi từ framework đến framework. – AaronLS

1

Vâng, về mặt kỹ thuật, tất cả những vấn đề đó là chuỗi URL được tạo. Vì vậy, bạn về mặt lý thuyết có thể có hai đệ trình các nút có cùng tên ...

1

không, một số điều khiển khác là tồn tại với tên dup;)

2

Nó là hoàn toàn hợp lệ để có cùng giá trị cho tên thuộc tính trên các trang.

Một dự phòng chung cho hộp kiểm là có đầu vào bị ẩn cùng tên với giá trị được đặt thành false. Khi sử dụng cùng giá trị tên tho, hãy chắc chắn kiểm tra lại kết quả mong đợi, thông thường giá trị mới nhất được phân tích cú pháp sẽ ghi đè lên bất kỳ thông số nào trước đó có cùng tên.

Nếu bạn cần nhóm các lĩnh vực khác nhau dưới cái tên tương tự như bạn thực sự có thể tạo ra một mảng với nhiều yếu tố, ví dụ:

<input name="list[]" /> 
<input name="list[]" /> 
<input name="list[]" /> 
+0

cũng phải cẩn thận về nguy cơ bảo mật trường ẩn! –

+2

Giả sử giá trị cuối cùng sẽ thắng và có '[]' ở cuối tên là một khung nhìn * rất * PHP của vũ trụ. – Quentin

+1

@AshokRaj những loại nguy cơ bảo mật nào làm các trường ẩn giới thiệu rằng bất kỳ loại đầu vào nào khác không? – Dunhamzzz

0

một số yếu tố tên hoặc các thuộc tính khi sử dụng nhiều lần chỉ là bỏ qua bởi các phân tích cú pháp HTML
Ví dụ: nếu bạn sử dụng nhiều hơn một id thì chỉ số đầu tiên được xem xét.

+0

Lưu ý rằng bạn đang nói về 'id', mà bạn không nên sao chép vì lý do bạn đã đề cập. Tuy nhiên, 'tên' bạn có thể có nhiều. – AaronLS

1

Bạn cũng có thể có nhiều đầu vào ẩn cùng tên. Như đã chỉ ra đó là vấn đề làm thế nào khung bên máy chủ sẽ phân tích chúng. Trong .NET MVC, trình mô hình hóa sẽ tìm kiếm một bộ sưu tập cùng tên trong tham số của phương thức post action hoặc một thuộc tính trên tham số model view của hành động post. Chẳng hạn như List<int>, List<Guid>, hoặc List<string>

Xem như một ví dụ: https://stackoverflow.com/a/2013915/84206

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