Я работаю над проблемой интеграции, имея дело со старым сайтом, на котором есть много сценариев, основанных на прототипе. Я должен интегрировать его в внешний шаблон веб-сайта, который использует скрипт (позвольте ему вызывать его external-jquery-script.js
), на котором я не контролирую, который использует jQuery.
external-jquery-script.js
использует оператор $
, и, очевидно, скрипт конфликтует с прототипом. Проблема конкретно связана с функцией во external-jquery-script.js
(позвольте ей вызвать externalFunction()
), которая необходима для правильной работы шаблона.
Я не могу изменить внешний шаблон, но я могу просто заполнить доступные заполнители.
На странице, полученной в результате интеграции, у меня есть следующее:
<html>
<!-- external template stuff - begin -->
...
<script src="http://www.external-website.com/js/common/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="http://www.external-website.com/js/common/external-jquery-script.js"></script>
...
<!-- external template stuff - end -->
<!-- my page stuff - begin -->
...
<script type="text/javascript" src="http://www.my-website.com/js/prototype.min.js"></script>
<script type="text/javascript" src="http://www.my-website.com/js/script.js"></script>
...
<!-- my page stuff - end -->
... <!-- other contents... --> ...
</html>
Теперь, я попробовал redeclaring externalFunction()
в моем script.js
, но все равно это не работает.
Я обновил его следующим образом:
(function($){
window.externalFunction = function(){
... //copied as is from external-jquery-script.js
}
})(jQuery);
У меня есть два вопроса:
external-jquery-script.js
говорит сценарию использовать оператор $
как оператор jQuery?Я нашел решение своей проблемы, которую я поделюсь здесь.
Поскольку я не мог изменить шаблон, за исключением области "страницы моей страницы", я решил переопределить часть шаблона jQuery, автоматически загружая сценарий через cron и автоматически заменяя вызовы jQuery прототипом/безопасную версию, включая фиксированный скрипт на странице, после оригинальной версии.
Теперь, поскольку сценарий добавил слушателя $(document).ready
, мне также пришлось заменить его версией Prototype, отключив (в некотором смысле) прослушиватель jQuery.
Вот сценарий, который выполняет автоматическую замену ($1
представляет собой имя скрипта js, переданное как параметр):
#!/bin/bash
sed -i "s#\$(document)\.ready(#document\.observe(\'dom\:loaded\'\,#g" $1 ##THIS REPLACES $(document).ready with the prototype equivalent
sed -i 's#\$(#jQuery(#g' $1 ##THIS REPLACES $( with jQuery(
sed -i 's#\$\.#jQuery\.#g' $1 ##THIS REPLACES $. with jQuery.
sed -i 's#(\$)#(jQuery)#g' $1 ##THIS REPLACES ($) with (jQuery)
прежде чем включать этот новый скрипт, я также добавил следующий скрипт, чтобы избежать конфликтов и предотвратить $(document).ready
.:
<script>
<!--
jQuery = jQuery.noConflict(true); //After this jQuery is callable only throught the jQuery variable
jQuery.holdReady(true); //After this jQuery(document).ready stays pending, waiting for a jQuery.holdReady(false) that will never come, turning off the listener in the first jQuery script, that would cause problems otherwise
-->
</script>
Таким образом, теперь у меня есть следующая, отлично работающая, имеющая как jQuery, так и Prototype на той же странице, используя внешний шаблон, включая исправленную версию external-jquery-script.js
:
<html>
<!-- external template stuff - begin -->
...
<script src="http://www.external-website.com/js/common/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="http://www.external-website.com/js/common/external-jquery-script.js"></script>
...
<!-- external template stuff - end -->
<!-- my page stuff - begin -->
...
<script>
<!--
jQuery = jQuery.noConflict(true);
jQuery.holdReady(true);
-->
</script>
<script type="text/javascript" src="http://www.my-website.com/js/prototype.min.js"></script>
<script type="text/javascript" src="http://www.my-website.com/js/external-jquery-script-fixed.js"></script>
<script type="text/javascript" src="http://www.my-website.com/js/script.js"></script>
...
<!-- my page stuff - end -->
... <!-- other contents... --> ...
</html>