Инкапсулируйте JavaScript для встроенного виджета
У меня есть файл javascript, который пользователи могут вставлять на свой сайт. Он использует coffeescript и конвейер ресурсов Rails для компиляции группы файлов в один.
# The following dependencies will be compiled into test.js (rails asset pipeline manifest file)
#
#= require jquery
#= require jquery.cookie
jQuery ->
$.cookie('foo', 'bar')
console.log $.cookie('foo')
Это работает, как и ожидалось, с примером страницы:
<!DOCTYPE html>
<head></head>
<body>
<script src="http://localhost:3000/assets/test.js" type="text/javascript"></script>
</body>
</html>
Но этот скрипт является виджетом, поэтому его нужно встраивать на любом сайте. Если пользователь добавляет свой собственный jquery под ним, то все ломается:
<!DOCTYPE html>
<head></head>
<body>
<script src="http://localhost:3000/assets/test.js" type="text/javascript"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
</body>
</html>
Это дает ошибку Uncaught TypeError: Object function (a,b){return new e.fn.init(a,b,h)} has no method 'cookie'
Каков наилучший способ обернуть все в test.js, так что самодостаточен? Я думал, что coffeescript, упаковывающий все в анонимную функцию, может помочь здесь, но я думаю, что нет.
Спасибо!
1 ответ
В этом руководстве приведены некоторые подсказки: http://alexmarandon.com/articles/web_widget_jquery/
Похоже, мне, возможно, придется включить минимизированный исходный код для плагинов (например, jquery.cookie) в анонимную функцию. Конвейер ресурсов не позволяет вам требовать подобные операторы, если они не находятся вверху файла (в первом блоке комментариев): https://github.com/sstephenson/sprockets/issues/398