Trong trường hợp bạn không biết tại sao điều này không làm việc trong IE, đây là the MSDN documentation on that function:
Khi bạn sử dụng phương thức getElementsByName, tất cả các yếu tố trong văn bản có thuộc tính NAME quy định hoặc ID giá trị thuộc tính được trả về.
Các yếu tố hỗ trợ cả thuộc tính NAME và thuộc tính ID được bao gồm trong bộ sưu tập được trả về theo phương thức getElementsByName, nhưng các phần tử có expando NAME không được bao gồm trong bộ sưu tập; do đó, phương pháp này không thể được sử dụng để truy xuất thẻ tùy chỉnh theo tên.
Firefox cho phép getElementsByName()
truy xuất các phần tử sử dụng tên mở rộng NAME, đó là lý do tại sao nó hoạt động. Cho dù đó có phải là Good Thing ™ có thể là một cuộc tranh luận, nhưng đó là thực tế của nó. Vì vậy, một tùy chọn là sử dụng phương thức DOM getAttribute()
để yêu cầu thuộc tính NAME và sau đó kiểm tra giá trị để xem liệu đó có phải là những gì bạn muốn hay không, và nếu có, hãy thêm nó vào một mảng. Tuy nhiên, điều này đòi hỏi bạn phải lặp lại tất cả các nút trong trang hoặc ít nhất trong một phần con, điều này sẽ không hiệu quả nhất. Bạn có thể hạn chế danh sách đó trước bằng cách sử dụng một cái gì đó như getElementsByTagName()
có lẽ.
Một cách khác để thực hiện việc này, nếu bạn kiểm soát HTML của trang, là cung cấp cho tất cả các yếu tố cần quan tâm mà một Id chỉ thay đổi theo số, ví dụ::
<div id="Change0">...</div>
<div id="Change1">...</div>
<div id="Change2">...</div>
<div id="Change3">...</div>
Và sau đó có JavaScript như thế này:
// assumes consecutive numbering, starting at 0
function getElementsByModifiedId(baseIdentifier) {
var allWantedElements = [];
var idMod = 0;
while(document.getElementById(baseIdentifier + idMod)) { // will stop when it can't find any more
allWantedElements.push(document.getElementById(baseIdentifier + idMod++));
}
return allWantedElements;
}
// call it like so:
var changes = getElementsByModifiedId("Change");
Đó là một hack, tất nhiên, nhưng nó sẽ làm công việc bạn cần và không quá kém hiệu quả so sánh với một số hack khác.
Nếu bạn đang sử dụng một khung công cụ JavaScript, bạn có nhiều lựa chọn hơn, nhưng tôi không có thời gian để đi vào những chi tiết cụ thể trừ khi bạn cho biết bạn đang sử dụng. Cá nhân, tôi không biết làm thế nào mọi người sống mà không có một, họ tiết kiệm rất nhiều thời gian, công sức và thất vọng mà bạn không thể đủ khả năng không để sử dụng một.
Lấy tài liệu MSDN như là "thực hiện chính xác" có vẻ như một lập trường kỳ lạ. Tên không phải là ID. MSFT đã sai, sai cách. Người ta có thể tranh luận yếu tố nào nên có tên, nhưng trả về một yếu tố không có tên chỉ đơn giản là ngớ ngẩn. (tin đồn có nó là cố định trong chế độ IE8 std) – scunliffe
tài liệu MSDN * là * thực hiện đúng cho IE 7 - poster ban đầu cho biết IE7 đã phá vỡ mã của mình, trong trường hợp bạn không đọc bài viết của mình. OP đã áp dụng thuộc tính name như là một thuộc tính expando trên một thẻ mà tên đó không được cho phép, vì vậy IE không trả về nó, theo tài liệu. –
Tôi xin lỗi, nhưng ** trong đó ** trong câu hỏi OP là có * bất kỳ đề cập * của * thiết lập * tên? Tôi chỉ thấy mã nói rằng OP đã cố gắng lặp qua các mục được truy xuất bằng cách sử dụng 'document.getElementsByName (name)'. Tôi vẫn đứng theo tuyên bố của tôi, rằng việc thực hiện '.getElementsByName (name)' là không chính xác trong IE (trong tất cả các phiên bản cũ). – scunliffe