jQuery自定义插件-为多个实例设置私有选项
jQuery custom plugin - setting private options for multiple instances
大家好
我目前正在开发一个客户端项目,我看到自己一遍又一遍地执行相同的javascript代码。因此,我认为将逻辑封装在自定义jQuery插件中会很有用。我已经为插件的单个实例实现了这一点,但对于多个实例,我认为我遇到了每个实例的属性相互覆盖的问题。
好吧,让我们开始密码吧!以下是我目前拥有的插件代码:
// RESPONSIVE MENU ===========================//
// wrapper for a responsive menu plugin, //
// made by Favolla Comunicação //
//============================================//
/* INSTRUCTIONS
Apply the plugin on the main wrapper of the responsive menu. For example:
$(#menu).responsiveMenu($(#trigger));
The plugin just toggles the classes, leaving the effects and layout for the css
CONFIG
- trigger: the selector of the button that will activate the menu (required)
- activeClass: class name to be injectet when the toggle is activated (default: active)
- submenuTrigger: the selector of the buttons that will activate the submenus, if the menu will have another levels (default: $('sub-toggle'))
- submenu: the selector of the submenus (default: $('.submenu'))
- submenuActiveClass: class name to be injected on the submenus when they are activated (default: open)
- breakpoint: max window whidth where the plugin will work (default: 720)
- timeOut: time in milissegundos to limite the onResize repeat. (default: 100)
- moveCanvas: option to activate the "off canvas" pattern or not (just puts a class on the main elements of the page). (default: false)
- canvas: class name of the elements that build the "canvas" (default: null)
*/
;(function ( $, window, document, undefined ) {
$.fn.responsiveMenu = function(settings){
var config = {
'trigger': '',
'activeClass': 'active',
'submenuTrigger': $('.sub-toggle'),
'submenu': false,
'submenuActiveClass': 'open',
'breakpoint': 720,
'timeOut': 100,
'moveCanvas': false,
'canvas': '',
};
if (settings){$.extend(config, settings);}
// plugin variables
var mTrigger,
menu = $(this),
active = config.activeClass,
button = config.trigger,
bpoint = config.breakpoint,
submTrigger = config.submenuTrigger,
submenu = config.submenu,
submenuActive = config.submenuActiveClass;
canvasOn = config.moveCanvas;
canvas = config.canvas;
time = config.timeOut;
return this.each(function () {
if($(window).width() > bpoint){
mTrigger = false;
} else {
mTrigger = true;
}
onChange = function(){
clearTimeout(resizeTimer);
var resizeTimer = setTimeout(function(){
if($(window).width() > bpoint){
mTrigger = false;
menu.removeClass(active);
button.removeClass(active);
if(canvasOn){
canvas.removeClass(active);
}
} else {
mTrigger = true;
}
}, time);
}
$(window).bind('resize',onChange);
$(document).ready(onChange);
button.click(function(){
if(mTrigger) {
menu.toggleClass(active);
button.toggleClass(active);
if(canvasOn){
canvas.toggleClass(active);
}
}
});
if(submenu){
var submenuClass = '.' + submenu.prop('class');
// toggle for the submenus
submTrigger.click(function(){
if(mTrigger) {
if($(this).hasClass(active)){
submTrigger.removeClass(active);
submenu.removeClass(submenuActive);
} else {
submTrigger.removeClass(active);
$(this).addClass(active);
submenu.removeClass(submenuActive);
$(this).next(submenuClass).addClass(submenuActive);
}
}
});
}
});
}
})( jQuery, window, document );
然后,当我想应用插件时,我会这样做:
$('#menu-wrapper').responsiveMenu({
trigger: $('#nav-toggle'),
submenu: $('.submenu'),
submenuTrigger: $('.submenu-toggle'),
moveCanvas: true,
canvas: $('.canvas'),
breakpoint: 862
});
$('#search').responsiveMenu({
trigger: $('#search-toggle'),
breakpoint: 862
});
这里的主要问题是,当我设置为responsiveMenu();
的实例时,似乎有些选项被覆盖了。例如,第一个实例将moveCanvas
设置为true,它可以工作,但当我为第二个实例保留它为空时(这使该元素的moveCanvas
选项设置为false
,则第一个实例的此选项不再工作。
我知道也许我没有遵循jQuery插件的最佳实践,我甚至读过一些关于jQuery Boilerplate的文章,它看起来很棒,但我不是一个高级的javascript开发人员,所以有很多事情我可以做得更好,但我现在不知道该怎么做。
无论如何,任何关于这个问题的帮助(以及关于插件的意见)都将非常受欢迎!
var mTrigger, menu = $(this), active = config.activeClass, button = config.trigger, bpoint = config.breakpoint, submTrigger = config.submenuTrigger, submenu = config.submenu,
在这里之前你做的是正确的。
submenuActive = config.submenuActiveClass; canvasOn = config.moveCanvas; canvas = config.canvas; time = config.timeOut;
然后,您引入了一个分号,这导致进一步的赋值(canvasOn
、canvas
和time
)不再是var
语句的一部分。它们不是变量声明,您可以在这里为全局变量赋值,这样您就覆盖了第一个插件实例的设置。
将除最后一个分号外的每一个分号都更改为commata。
您需要将设置封装在类或闭包中,并为插件调用的每个元素存储它们。
return this.each(function () {
...
$(this).data('some-key', settings);
...
});
如果你想了解jQuery插件创作,他们在这里有一篇文章http://learn.jquery.com/plugins/basic-plugin-creation/
- 显示模块模式在Knockout中设置模型的新实例
- 如何使用javascript独立地为聚合物自定义元素的每个实例的lightdom设置样式
- 设置三个express实例:admin、site和app
- ThreeJS:实例化对象会将其位置设置为零
- 对象引用未设置为行中的对象的实例,如果 (!string.IsNullOrEmpty(tdcd.文本)&&
- 为下一次实例化设置的主干视图属性
- 触发不同实例设置的 jQuery 自定义事件
- 如何为具有不同高度的多个实例设置CKEditor
- 通过构造函数属性和运算符实例设置继承
- ExtJs - 如何在使用多个实例时设置组件的 ID
- 对象引用未设置为 C# 中的对象实例
- 根据容器设置代码镜像实例的焦点
- 无法在 javascript 中使用 prototype = 设置实例原型
- 在 ES6 中自动将参数设置为实例属性
- 对象引用未设置为Internet Explorer上的AngularJS中的对象的实例
- 根据 jQuery 中多个实例上的另一个元素高度设置高度
- System.NullReferenceException:对象引用未设置为对象的实例.Dotnetnuke模块创建
- Paper.js:can't设置符号实例的fillColor
- 从事件发射器设置实例变量
- javascript OOP中使用回调函数后如何设置实例变量