2011-09-20 25 views
6

Tôi đang chơi xung quanh với lấy thuộc tính của thẻ link, có vẻ là một số cách truy cập vào các thuộc tính:Phương pháp tốt nhất để lấy các thuộc tính từ getElementsByTagName()?

document.getElementsByTagName("link")[0]['media'] 
document.getElementsByTagName("link")[0].media 
document.getElementsByTagName("link")[0].getAttribute('media') 
document.getElementsByTagName("link")[0].attributes['media'] 

Nó giáp lố bịch có bao nhiêu con đường có số liệu tương tự. Một trong những phương pháp này có vượt trội hơn so với phần còn lại không?

+1

Chỉ cần lưu ý: hai bản dịch đầu tiên giống với cùng một thứ trong JavaScript ('.x = [" x "]' nói chung), đó không phải là đặc trưng cho thuộc tính phần tử. –

+3

Đó là 'getElementsByTagName', không phải' getElementByTag'. – Oded

+0

có thể trùng lặp của [Để sử dụng getAttribute(), hoặc không sử dụng getAttribute(): đó là câu hỏi] (http://stackoverflow.com/questions/7278922/to-use-getattribute-or-not-to-use -getattribute-that-is-the-question) –

Trả lời

10

Tôi sẽ sử dụng .media cho trường hợp này, vì media thực sự là thuộc tính trên phần tử liên kết. Mỗi có nó sử dụng:

  • ['media']: Lấy các "phương tiện truyền thông" giá trị tài sản sử dụng ký hiệu khung vuông. Sử dụng ký hiệu ngoặc vuông khi bạn không biết tên của thuộc tính tại thời điểm thiết kế. Ví dụ, khi lặp thuộc tính.
  • .media: Truy xuất giá trị thuộc tính "phương tiện". Tôi sẽ sử dụng điều này trong hầu hết các trường hợp. Nó cung cấp truy cập trực tiếp ngắn gọn tới giá trị tài sản.
  • .getAttribute('media'): Truy xuất giá trị thuộc tính "phương tiện". Sử dụng điều này khi bạn muốn giá trị của thuộc tính không nhất thiết là thuộc tính trên phần tử. Không phải tất cả thuộc tính đều là thuộc tính và không phải tất cả thuộc tính đều là thuộc tính.
  • .attributes['media']: Truy xuất nút thuộc tính "phương tiện". Sử dụng bộ sưu tập thuộc tính khi bạn cần thêm thông tin về một thuộc tính hơn là giá trị của nó. Ví dụ: tên thuộc tính. Bạn cũng có thể dễ dàng sử dụng điều này để lấy giá trị, vì .toString() trả về giá trị, nhưng điều đó có thể quá mức cần thiết nếu tất cả những gì bạn muốn là giá trị. Bộ sưu tập attributes cũng hữu ích cho iterating the attributes of an element.
0

Hai tùy chọn đầu tiên giống nhau. Bạn cũng có thể sử dụng. Cá nhân tôi thích phiên bản .media vì tôi nghĩ nó dễ đọc hơn.

Hai tùy chọn cuối cùng phụ thuộc vào getAttribute()setAttribute() không phải lúc nào cũng đáng tin cậy trong IE. Bạn có thể đọc nhiều hơn về điều đó trong reference that Matt posted. Như vậy, tôi thích phiên bản .media trong tất cả bốn lựa chọn của bạn là đáng tin cậy nhất và dễ đọc nhất.

1

Chức năng, chúng bằng nhau.

Hiệu suất-khôn ngoan, hai cái đầu tiên vượt trội bởi một yếu tố quan trọng - mặc dù chúng đều cực kỳ nhanh. Xem this JSPerf test.

Thực tế, hai chữ đầu tiên dễ đọc hơn và sở thích cá nhân của tôi là thứ hai. (Tóc cũng nhanh hơn.)

3

Phương pháp bạn đang tìm kiếm được gọi là getElementsByTagName. Nó trả về một danh sách các phần tử giống như mảng (không phải là một mảng).

Lưu ý rằng mẫu cuối cùng của bạn .attributes['media'] không trả lại chuỗi như các phương pháp khác. Nó trả về một nút thuộc tính để thay thế.

Về lý thuyết, cách truy cập nội dung phải tương đương nhưng lỗi trình duyệt dẫn đến hành vi khác trong thực tế. Nó có lẽ là tốt nhất để sử dụng một lớp trừu tượng (một thư viện như jQuery) để có được hành vi nhất quán.Nếu bạn có ý định lập trình mà không có thư viện, sự lựa chọn tùy thuộc vào khẩu vị của bạn, tuy nhiên tôi muốn nói rằng việc đi qua nút thuộc tính là an toàn nhất nói chung.

Để thêm chi tiết kỹ thuật một chút, mặc dù cách khác nhau trả về cùng một cách phần lớn thời gian, điều này không nhất thiết đúng cho các thuộc tính không tồn tại. Lấy HTML sau làm ví dụ: <a href='test'>. Bạn có thể tự mình thử trong một trình duyệt khác trên a test jsFiddle (kết quả dưới đây là từ Firefox).

// Get reference to element 
var a = document.getElementsByTagName('a')[0]; 

// Existent attributes 
console.log(a.href); // String: http://fiddle.jshell.net/_display/test 
console.log(a.getAttribute('href')); // String: test 
console.log(a.attributes['href']); // Attribute node: href 

Lưu ý rằng một lần một URI tuyệt đối được trả về, một lần khác giá trị ban đầu được trả về.

// Existent invalid attributes 
console.log(a.other); // undefined 
console.log(a.getAttribute('other')); // String: thing 
console.log(a.attributes['other']); // Attribute node: other 

Mọi thứ tồn tại khi tải trang được hợp nhất vào DOM nhưng không khả dụng dưới dạng thuộc tính nếu không hợp lệ.

// Inexistent but valid attributes 
console.log(a.title); // Empty string 
console.log(a.getAttribute('title')); // null 
console.log(a.attributes['title']); // undefined 

Cuộc gọi đầu tiên trả về giá trị mặc định của thuộc tính. Sau đó, chúng tôi đã thấy null làm điểm đánh dấu cho thuộc tính không tồn tại. Cuối cùng, chúng tôi đã có một cái gọi là NamedNodeMap mà là một cái gì đó giống như một hỗn hợp của một mảng và đối tượng. Truy cập nó như một đối tượng đã cho giá trị undefined.

// Creating attributes 
a.setAttribute('title', 'test title'); 
console.log(a.title); // String: test title 
console.log(a.getAttribute('title')); // String: test title 
console.log(a.attributes['title']); // Attribute node: title 

Thuộc tính cũng có sẵn dưới dạng thuộc tính.

// Creating "attributes" by using property 
a.rel = 'test rel'; 
console.log(a.rel); // String: test rel 
console.log(a.getAttribute('rel')); // String: test rel 
console.log(a.attributes['rel']); // Attribute node: rel 

Đặt thuộc tính cho thuộc tính hợp lệ cũng tạo một mục nhập trong attributes bản đồ.

// Inexistent invalid attributes 
console.log(a.dummyInvention); // undefined 
console.log(a.getAttribute('dummyInvention')); // null 
console.log(a.attributes['dummyInvention']); // undefined 

Truy cập thuộc tính trên a, giá trị trả lại đánh dấu và truy cập chỉ mục trên bản đồ nút.

// Creating invalid attributes via setAttribute 
a.setAttribute('title2', 'test title2'); 
console.log(a.title2); // undefined 
console.log(a.getAttribute('title2')); // String: test title2 
console.log(a.attributes['title2']); // Attribute node: title2 

Thuộc tính được tạo ngay cả khi thuộc tính tồn tại không hợp lệ nhưng không khả dụng dưới dạng thuộc tính.

// Creating invalid "attributes" via property 
a.title3 = 'test title3'; 
console.log(a.title3); // String: test title3 
console.log(a.getAttribute('title3')); // null 
console.log(a.attributes['title3']); // undefined 

Đối tượng a được gia hạn nhưng DOM không bị ảnh hưởng.

// NamedNodeMap of length 4 and indexes other, href, title, rel, title2 (valid attributes or result of setAttribute in order of creation except those from parsing) 
console.log(a.attributes); 

Bản đồ nút chỉ phản ánh trạng thái hiện tại của DOM. Nó không nhận thức được phần mở rộng đối tượng của chúng tôi a mà chúng tôi đã nhận được qua getElementsByTagName.

Điều quan trọng cần lưu ý là thao tác đối tượng JavaScript không nhất thiết ảnh hưởng đến DOM. DOM chỉ phản ánh những điều đã có sẵn trên phân tích cú pháp cộng với sửa đổi với các phương thức DOM hoặc sửa đổi thuộc tính (của các thuộc tính được xác định trước). Tôi hy vọng tôi không bỏ lỡ bất kỳ trường hợp quan trọng nào và rằng các bình luận đã đủ dài để xem điều gì xảy ra.

Tôi sẽ đánh giá cao nhận xét về NamedNodeMap cuối cùng bởi vì tôi muốn biết hành vi của Firefox có chính xác không để loại bỏ thứ tự các thuộc tính khỏi phân tích cú pháp.

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