我生活和呼吸jQuery,但我也喜欢找到一个出色的插件来完成我想要的工作。
My Rails应用程序是用jQuery编写的,但是对于文件上传,我还没有找到比FancyUpload更好的东西(比Uploadify或SWFUpload更好的恕我直言)。尝试了所有三个库后,FancyUpload是最好的集成到我的应用程序中。
但是,FancyUpload基于MooTools,加载这两个库(更不用说使用它们)开始有点令人头疼。首先,我只在使用上传功能的页面上加载MooTools;所有其他页面都使用jQuery。其次,我不得不manually namespace many of my jQuery functions,这有点烦人。
但也许这个设置最麻烦的功能是我不知道MooTools。因为我已经能够使用jQuery完成其他所有工作,所以我从不费心去学习。既然我强迫自己使用这个FancyUpload库(我喜欢并希望继续使用),我就会面对MooTools中的无能。
具体来说,这是FancyUpload的onFileSuccess
函数:
onFileSuccess: function(file, response) {
var json = new Hash(JSON.decode(response, true) || {});
if (json.get('status') == '1') {
// success
file.element.addClass('file-success');
(function ($, elem, queue_item) {
$('#images').append($(elem).hide().fadeIn('slow'));
$(queue_item).fadeOut('slow', function () { $(this).remove(); });
})(jQuery, json.get('data'), file.element);
} else {
// failure
file.element.addClass('file-failed');
}
}
正如您将注意到的,我在MooTools函数中间有一个jQuery函数。
我的问题是:这是一件非常糟糕的事吗?我的功能正如我所希望的那样工作,但我不知道我是否会通过这样做来为未来的灾难滚雪球。
如果这真的是一个坏主意,有人可以给我一个关于MooTools等效代码的指针吗?
我很感激任何见解或帮助。
答案 0 :(得分:4)
我认为对jq和mootools使用保留的'$'字符绝不是一件好事,因为可以通过正确使用命名空间轻松避免它。我假设你使用类似的东西命名空间:
jQuery.noConflict();
当一个更好的方法是将它分配给变量时:
var jQ = jQuery.noConflict();
现在你可以为jq和$ for mootools调用jQ('here here')。帮助我保持代码的正确性,并使其更具可读性。您也可以只更改包含的顺序,这也可以修复命名空间问题。
答案 1 :(得分:0)
这通常不是问题,但我建议不要在任何功能中混合特定于框架的代码,除非您使用的框架不提供您需要的功能。通过这种方式,您可以保持可移植性并且只需要一个要求,而不需要2个不同库的2个特定版本。
你的代码应该是这样的:
onFileSuccess: function(file, response) {
var json = new Hash(JSON.decode(response, true) || {});
if (json.get('status') == '1') {
// success
file.element.addClass('file-success');
document.id('images').adopt(document.id(json.get('data')).fade('hide').fade('in'));
document.id(file.element).set('tween', {
onComplete: function() { this.element.dispose();}
}).fade('out');
} else {
// failure
file.element.addClass('file-failed');
}
}
编辑:刚刚注意到Dimitar做了一个类似的回复。我的解决方案工作原理完全相同,但正确地避免使用混合框架时特别需要的$函数。