封装嵌入式小部件的javascript

时间:2012-12-14 00:28:18

标签: widget coffeescript asset-pipeline sprockets

我有一个用户可以在其网站上嵌入的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 个答案:

答案 0 :(得分:0)

本教程提供了一些线索:http://alexmarandon.com/articles/web_widget_jquery/

听起来我可能不得不在匿名函数中包含插件的缩小源代码(如jquery.cookie)。资产管道不允许你做这样的需要语句,除非它们位于文件的顶部(在第一个注释块中):https://github.com/sstephenson/sprockets/issues/398