Динамическое обновление / замена библиотеки прототипов - PullRequest
1 голос
/ 11 июня 2009

Я разрабатываю приглашение на опрос, которое можно встраивать во многие сайты. Чтобы представить приглашение, я использую Modalbox , библиотеку JavaScript, которая показывает анимированное модальное окно поверх полупрозрачного наложения.

Эта библиотека Modalbox зависит от библиотек Prototype и script.aculo.us/effects. Приглашение будет динамически встраиваться в сайты, которыми я не владею, и не может статически изменять их разметку.

Во время загрузки я проверяю (в JS), загружен ли Prototype как:

if (typeof Prototype == "undefined") {
    document.write('<script type="text/javascript" src="http://mysite.com/lib/prototype.js"><\/script>');
}

if (typeof Effect == "undefined") {
    document.write('<script type="text/javascript" src="http://mysite.com/lib/scriptaculous.js?load=effects"><\/script>');
}

Все работает хорошо с большинством сайтов, так как они обычно не загружают ни Prototype.js, ни script.aculo.us. Есть сайт, который их загружает, и мне не нужно их загружать, и снова это работает.

ОДНАКО ... есть сайты, которые уже загружают их, но имеют более старые версии (для Modalbox требуется Prototype 1.6.0 и script.aculo.us 1.8.0), например 1.4.0 / 1.5.1

Как я могу динамически выгрузить / заменить прототип и / или script.aculo.us в Javascript? Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 11 июня 2009

В ответ на tvanfosson, если вы можете выяснить, как динамически обновить требуемый прототип, вы также сможете использовать что-то вроде WTFFramework для определения исходной версии. Затем, прежде чем показывать всплывающее окно, загрузите свой прототип, а когда оно закроется, перезагрузите исходный прототип.

2 голосов
/ 11 июня 2009

Вы можете сделать это технически, но готовы ли вы рискнуть взломать остальную часть страницы только для того, чтобы ваш плагин работал? Могут быть веские причины, по которым эти сайты не обновлялись - например, совместимость с другими плагинами, которые не работают с более новыми версиями. Я бы посоветовал вам либо требовать, чтобы сайты, использующие ваш код, имели минимальную версию Prototype (путем изучения Prototype.Version), либо включали ее, как вы, когда она не найдена. Сделайте то же самое со Scriptaculous.

Это позволит пользователю вашего кода принимать решения о том, как лучше действовать. Либо они могут обновить свою страницу (скорее всего, так как более старая версия, вероятно, используется из-за инерции), либо удалить ваш плагин.

1 голос
/ 11 июня 2009

Ну, некоторые из моих коллег предложили «пространство имен» функций в моем прототипе (1.6.0), например, добавив к ним префикс «__mySite». Однако это будет означать большую работу по рефакторингу, поскольку я также должен обновить вызовы переименованных функций.

...