2010-10-04 3 views
1

Каков наилучший способ создать библиотечную агностическую оболочку для селекторов библиотеки JS? У меня есть пользовательская JS-инфраструктура, которая стремится быть как можно более доступной для библиотеки. Проблема заключается в том, что, например, Mootools улучшает возвращаемый элемент DOM с помощью собственных специальных методов (ввод, принятие и т. Д.), И я не хочу, чтобы они были видимыми для модулей, расположенных поверх фреймворка (как Николас Закас однажды описал), чтобы предотвратить злоупотребления/несчастные случаи.Как сделать аглографическую селекторную упаковку JS-библиотеки?

В качестве простой первой помощи я создал пользовательский селектор, который использует Mootools, затем создает пользовательский Element -объект/обертку, а руки выбрали (и улучшили) Mootools DOM-элемент, поэтому усовершенствованные методы Mootools не видны напрямую к модулям выше. Проблема с этим подходом заключается в том, что я теряю всю встроенную функциональность элемента DOM (значение, стиль и т. Д.), Если он специально не закодирован для обертки (Element).

Есть ли другой и/или лучший способ сделать это? Что-то, что расширит собственный элемент DOM, тем самым автоматически предоставив собственные свойства/методы и предложив расширенную функциональность через оболочку (через Mootools, jQuery, whatnot ...).

Некоторые примеры кода, как это делается в настоящее время:

/* 
* Wrap the native library element 
*/ 
Element = function(_libElement) { 
    // Store native object 
    var libElement = _libElement; 

    return { 
     addClass: function(_class) { libElement.addClass(_class); return this; }, 
     removeClass: function(_class) { libElement.removeClass(_class); return this; }, 
     hasClass: function(_class) { return libElement.hasClass(_class); } 
    }; 
}; 

/* 
* Custom selector 
*/ 
getElement = function(_query) { 
    var elements = $$(_query); 

    // Wrap each element to Element wrapper 
    var num = elements.length; 
    while(num--) { 
     elements[num] = new Element(elements[num]); 
    } 

    return elements; 
}; 
+0

Можете ли вы предоставить код? У меня возникли проблемы с визуализацией именно того, что вам нужно ... –

+0

Добавлен код примера – crappish

ответ

1

Мой подход был бы не беспокоиться об этом, просто передать обратно родной элемент DOM. Если кто-то хочет полагаться на усовершенствования MooTools (или Prototype) для этого элемента DOM, это их собственный взгляд. На самом деле, если вы попытаетесь предотвратить показ этих улучшений, я бы сказал, что вы больше не являетесь библиотечно-агностиком   —, вы активно подвергаетесь дискриминации (из-за отсутствия лучшего слова!) В отношении библиотек, которые являются родными элемент. :-) Кто-то, кто использует эти библиотеки, предположительно хочет эти улучшения.

Если кто-то строит модули поверх вашей библиотеки, они должны знать об окружающей среде, на которой они строят (что не гарантирует, что эти улучшения существуют).

Немного не по теме, но, вероятно, стоит отметить, что, по-видимому, расширение элементов DOM выходит из моды. Я знаю, что ребята Prototype активно планируют использовать обертки (a'la jQuery) вместо этого в полноту времени.

+0

Это было бы идеей точно, чтобы предотвратить использование расширения библиотеки. Я считаю, что такой подход (просто передача элемента собственной библиотеки) будет довольно неряшливой реализацией и в конечном итоге вызовет проблемы на линии (линии, которые случайно попадают напрямую с использованием библиотеки) при переходе из одной библиотеки в другую. В настоящее время структура является строго внутренней, поэтому весь код будет написан как агностик библиотеки с момента выхода. – crappish

+0

@crappish: Но вы не * являетесь библиотекой-агностиком, если вы запрещаете использование libs, которые расширяют элементы DOM; вы пристрастны к некоторым библиотекам в пользу других. Но если вы действительно хотите пойти по этой дороге, у вас нет другого выбора, кроме как использовать оболочку и запретить клиентам использовать необработанный элемент DOM. Это будет дорого, потому что если вы скрываете элемент, то * все * должно быть через вашу обертку, каждое свойство и функцию. Это будет хлопот по обслуживанию, если не сказать больше. (Продолжение) –

+2

(продолжение) Я предпочитаю подход jQuery: вы получаете обертку, в 99% случаев это все, что вам нужно, но вы можете получить необработанный элемент, если вам это нужно. –

Смежные вопросы