我有一个用户可以在其网站上嵌入的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在匿名函数中包装所有内容可能对此有所帮助,但我猜不是。
谢谢!
答案 0 :(得分:0)
本教程提供了一些线索:http://alexmarandon.com/articles/web_widget_jquery/
听起来我可能不得不在匿名函数中包含插件的缩小源代码(如jquery.cookie)。资产管道不允许你做这样的需要语句,除非它们位于文件的顶部(在第一个注释块中):https://github.com/sstephenson/sprockets/issues/398