我创建了一个外部文件,以便能够使用Google Closure Compiler的ADVANCED_OPTIMIZATIONS编译jQuery星级评级插件fyneworks.com/jquery/star-rating/#tab-Testing。
但是,即使我引用标准的jQuery extern,' $'正在重命名,这会破坏插件。
也许相关:如果我使用未经修改的插件,'评级'也被重命名。我可以用以下方法解决这个问题:
$.fn['rating'] = function(opts) {
来自google closure compile jQuery Plugin的...但是这并没有解决问题' $' (如果可能的话,使用未经修改的插件会很好。)
从我对外部的尝试(这可能是错误的和/或不完整的):
// ??? for '$'
// this one does NOT prevent 'rating' from being renamed
function rating(arg1) {}
// the following seem to work: they prevent the functions from being renamed
rating.focus = function() {}
rating.blur = function() {}
rating.fill = function() {}
... etc.
命令行(以及下载中的rating.sh):
java -jar ../compiler-latest/compiler.jar --formatting pretty_print --compilation_level ADVANCED_OPTIMIZATIONS --externs externs/jquery-1.7.js --externs externs/jquery.rating-extern.js --js original/jquery.rating.js --js_output_file jquery.rating.gcc.js
错误消息:
Firefox:
$(".star1").rating is not a function
callback: function (value) {
jquery.ratingSampleCode.js (line 9)
Chrome:
Uncaught TypeError: Object [object Object] has no method 'rating'
jquery.ratingSampleCode.js:8
来自我的示例代码:
$('.star1').rating({
callback: function (value) {
测试:http://prefabsoftware.com/test/rating-july15/
下载:prefabsoftware.com/test/rating-july15.zip
一些有用的链接:(我不能指定为降价,因为我无法使用旧的声誉点登录...)
extern有一个简单的解决方法吗?还是更好的解决方案?
谢谢!
好的,这适用于externs文件:
$.prototype.rating = function(arg1) {}
jQuery.prototype.rating = function(arg1) {}
$.prototype.rating.focus = function() {}
... etc.
答案 0 :(得分:1)
根据您的说明,您似乎未正确使用extern文件。插件的extern文件允许其他用户编译引用您的插件的代码。它根本不应该用于编译您的实际插件代码。要编译代码,只需要jQuery extern文件。
jQuery代码样式与Closure编译器有已知问题。特别是,您需要避免以下情况:
$
别名。使用完整的jQuery
命名空间。编译器不能很好地处理别名命名空间。jQuery.fn
别名。而是使用jQuery.prototype
。jQuery.extend
方法添加函数原型或公共方法。而是将它们直接添加到原型中。 (示例:jQuery.fn.extend({a: 'foo'});
将成为jQuery.prototype.a = 'foo';
); 使用ADVANCED_OPTIMIZATIONS时,请记住,您仍然需要导出或引用任何公共方法和原型。这可能意味着SIMPLE_OPTIMIZATIONS最适合您的项目。
有关详细信息,请参阅http://blogs.missouristate.edu/web/2011/02/14/jquery-plugins-and-closure-compiler/
答案 1 :(得分:0)