Добавить свой метод к элементу
Я наверное туплю, но сейчас не могу сообразить, каким же образом можно создать свой метод элементу?
К примеру, есть такой метод как getElementByTagName, как можно создать метод который будет вызываться таким же образом? Понятное дело, что можно создать функцию и передать элемент для обработки в неё как аргумент этой функции, т.е. так func(node, arg1, arg2 ..... argN). Но каким образом можно реализовать такой вызов node.func(arg1, arg2 ..... argN)? Через protype? Но к какому объекту его нужно зацепить, что бы метод существовал для всех элементов DOM дерева? |
В ИЕ никак, поэтому если нужна кроссбраузерность, то можно не париться. Иначе HTMLElement.
|
В IE6,7 у встроенного объекта Element нет prototype, поэтому такая запись:
Element.prototype.method = function() { ... }; работать в нем не будет и никаких других вариантов так добавить пользовательский метод для всех DOM-элементов нет. |
есть идея не до конца оформленная:
можно сделать набор методов, прилепить их к document, и сделать, чтоб все объекты возвращаемые нашими методами также имели их у себя //функции применимые к нодам function _getElemetById(id)//перегрузка стандартного метода { var dom_obj=this.getElemetById(id); set_new_methods.call(dom_obj);//вызываем, чтоб возвращался объект с нашими новыми методами return dom_obj; } function _getElemetsByClass(searchClass,tag)//уникальный метод { node=this; var classElements = new Array(); if ( node == null ) node = document; if ( tag == null ) tag = '*'; var els = node.getElementsByTagName(tag); var elsLen = els.length; var pattern = new RegExp('(^|\\\\s)'+searchClass+'(\\\\s|$)'); for (i = 0, j = 0; i < elsLen; i++) { if ( pattern.test(els[i].className) ) { classElements[j] = els[i]; set_new_methods.call(classElements[j]);//вызываем, чтоб возвращался объект с нашими новыми методами j++; } } return classElements; } //установка методов для ноды function set_new_methods() { this._getElemetById=_getElemetById; this._getElemetsByClass=_getElemetsByClass; } set_new_methods.call(document); document._getElemetById(id)._getElemetsByClass(searchClass,tag);//допустимый вызов PS код на ошибки не выверялся.полет мысли так сказать |
Gvozd,
еще немного и Prototype получится :) |
возможно.
я особо его искодники не копал писал примерно как чукчи поют.что думаю, то и пишу))) а вообще, если пишеш сам и для себя, то менее громоздким будет формировать ф-ции как Эта то есть, чтобы один из параметров был нодой. тогда весь излишний код не надо писать, и пишеш только по сути. минус:нельзя юзать конструкции последовательного вызова, как в последней строчке кода выше. но это скорее дело привычки. в принципе излишнего кода не настолько много формируется. в конечном итоге надо знать для себя:что надо, как удобней, и чем можно пожертововать ражи удобства. |
В Prototype, как раз, функции описаны, как принимающие нод в качестве параметра, а потом биндятся к элементам.
Вообще, в плане изучения кода хороший фреймворк. |
Часовой пояс GMT +3, время: 05:49. |