2010-11-18 22 views
5

Tôi có một số mã JavaScript mà định nghĩa một hàm getElementsByAttribute như sau:Object.prototype trong JavaScript

Object.prototype.getElementsByAttribute = function(attr) { 
    var children = this.all || this.getElementsByTagName('*'), 
     ret = [], i, c; 
     for(i=0; i<children.length; i++) { 
      c = children[i].getAttribute(attr); 
      if(typeof c == "string" && c != "") 
       ret.push(children[i]); 
     } 
    return ret; 
} 

này hoạt động trong tất cả các trình duyệt tôi đã thử nghiệm trong, ngoại trừ Internet Explorer 7 (và có lẽ thấp hơn) - những browers ném "Đối tượng không hỗ trợ thuộc tính hoặc phương thức này".
Điều duy nhất tôi có thể nghĩ rằng nó không giống như là các đối tượng đã được tạo ra khi tôi xác định các chức năng nguyên mẫu ...
Shrot xác định chức năng như là ... tốt, một "bình thường" và chuyển qua phần tử như một đối số, có cách nào để thực hiện công việc này trong IE7 và dưới đây không?

Trả lời

6

Phần tử IE DOM không phải là đối tượng Javascript bình thường và không kế thừa các nguyên mẫu như bạn mong đợi.

http://perfectionkills.com/whats-wrong-with-extending-the-dom/

+0

Cảm ơn - điều tốt là tôi không sử dụng công cụ này thường xuyên và đã có những hạn chế! –

+0

Nhưng anh ta không cố gắng thêm vào nguyên mẫu của các phần tử DOM, anh ta thêm vào nguyên mẫu của Object, hoàn toàn khác. –

+0

@torazaburo: Có, nhưng anh ta mong đợi các phần tử DOM kế thừa 'Object.prototype'. Họ không. – SLaks

1

Thêm điều cần Object.prototype là một thực sự ý tưởng tồi . Nó sẽ được thêm vào mỗi đối tượng và điều đó sẽ gây ra hành vi ngoài ý muốn, tôi đảm bảo điều đó.

Chỉ cần xác định chức năng của bạn và trang trí nó trên bất kỳ đối tượng nào bạn cần động.

+0

Được rồi, đã xác định lại nó là một chức năng bình thường. Cảm ơn :) –

+0

@Kolink, đề xuất là * không * để xác định lại nó như là một chức năng bình thường, mặc dù đó là một điều hợp lý để làm, nhưng thay vì thêm nó một cách rõ ràng cho các đối tượng bạn sẽ được gọi nó trên. –