2009-04-23 37 views
22

Trong javascript, bạn có thể mở rộng các lớp học hiện tại bằng cách sử dụng đối tượng nguyên mẫu của nó:Trong Javascript, bạn có thể mở rộng DOM không?

String.prototype.getFirstLetter = function() { 
    return this[0]; 
}; 

Có thể sử dụng phương pháp này để mở rộng phần tử DOM?

+6

Bạn có thể. Nhưng có lẽ không nên :) http://perfectionkills.com/whats-wrong-with-extending-the-dom/ – kangax

+1

Thực ra, mọi thứ đã thay đổi trong ba năm qua: https://github.com/nbubna/mind -hack/blob/gh-pages/extending-the-dom.md –

Trả lời

20

bạn có thể mở rộng DOM bằng cách sử dụng nguyên mẫu của Phần tử. Tuy nhiên, điều này không làm việc trong IE7 và trước đó. Bạn sẽ cần mở rộng từng phần tử cụ thể. Thư viện Prototype thực hiện điều này. Tôi khuyên bạn nên xem qua số source để xem chính xác cách thực hiện.

+0

Lưu ý rằng điều này chỉ nên được yêu cầu cho IE6 và IE7, vì IE8 hỗ trợ điều này. Xem http://msdn.microsoft.com/en-us/library/dd282900 (VS.85).aspx. –

+0

ah - tự nhiên tôi chỉ được thử nghiệm trên FFx nhờ mẹo. – nickf

+0

vâng, IE8 đã có những bước tiến lớn với thao tác DOM, nhưng hoàn toàn hỗ trợ nó không phải là danh sách ưu tiên của tôi ngay bây giờ – geowa4

18

Tôi tìm thấy câu trả lời ngay khi tôi đang viết câu hỏi, nhưng tôi nghĩ rằng tôi sẽ đăng bài để chia sẻ thông tin.

Đối tượng bạn cần gia hạn là Element.prototype.

Element.prototype.getMyId = function() { 
    return this.id; 
}; 
1

Có bạn có thể, nhưng không nên làm như vậy.

Nếu bạn ghi đè lên thư viện khác, thư viện khác hoặc thư viện khác sẽ ghi đè thứ bạn đang mong đợi .. hỗn loạn!

Cách tốt nhất là giữ mã của bạn trong không gian tên/phạm vi của riêng bạn.

7

Bạn không nên trực tiếp mở rộng bất cứ điều gì (bởi "bất cứ điều gì" tôi có nghĩa là các đối tượng DOM gốc) - điều đó sẽ chỉ dẫn đến những điều xấu. Cộng với việc mở rộng lại mọi phần tử mới (một cái gì đó bạn phải làm để hỗ trợ IE) bổ sung thêm chi phí.

Tại sao không có những phương pháp jQuery và tạo một wrapper/constructor và kéo dài mà thay vào đó:

var myDOM = (function(){ 
    var myDOM = function(elems){ 
      return new MyDOMConstruct(elems); 
     }, 
     MyDOMConstruct = function(elems) { 
      this.collection = elems[1] ? Array.prototype.slice.call(elems) : [elems]; 
      return this; 
     }; 
    myDOM.fn = MyDOMConstruct.prototype = { 
     forEach : function(fn) { 
      var elems = this.collection; 
      for (var i = 0, l = elems.length; i < l; i++) { 
       fn(elems[i], i); 
      } 
      return this; 
     }, 
     addStyles : function(styles) { 
      var elems = this.collection; 
      for (var i = 0, l = elems.length; i < l; i++) { 
       for (var prop in styles) { 
        elems[i].style[prop] = styles[prop]; 
       } 
      } 
      return this; 
     } 
    }; 
    return myDOM; 
})(); 

Sau đó, bạn có thể thêm các phương pháp của riêng bạn qua myDOM.fn ... Và bạn có thể sử dụng nó như thế này:

myDOM(document.getElementsByTagName('*')).forEach(function(elem){ 
    myDOM(elem).addStyles({ 
     color: 'red', 
     backgroundColor : 'blue' 
    }); 
}); 
+11

"Bạn không nên trực tiếp mở rộng bất cứ điều gì - điều đó sẽ chỉ dẫn đến những điều xấu". Nó sẽ dẫn đến những điều tốt đẹp nếu bạn có một lý do chính đáng để làm điều đó và viết mã của bạn đúng cách. Ngoài các vấn đề tương thích, không có lý do gì để không mở rộng Element.prototype; đối với các đối tượng mặc định khác, rất nhiều thứ có thể có (xem thêm các phương thức định dạng cho Date.prototype, hoặc thoát ra thành RegExp.prototype). Thật ngớ ngẩn khi từ bỏ thực tiễn OO hoàn toàn hữu ích khi chúng sẵn có và hữu ích. – eyelidlessness

+1

Chúng tôi không nói về ngôn ngữ JavaScript và các mẫu thiết kế hoặc bất kỳ thứ gì như thế. Đây là về DOM - mở rộng các đối tượng DOM nguyên gốc không phải là một ý tưởng hay; không phải đề cập đến thực tế là nó không hoạt động đúng trong tất cả các trình duyệt ... – James

+4

Ngoài khả năng tương tác, tại sao nó không phải là một ý tưởng tốt? – eyelidlessness

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