我正在编写一个jQuery插件,应该处理链接上的额外信息以指定开放行为.
>< a href =“某处”data-openmode =“NewWindow”class =“openmode”/>
>< a href =“某处”data-openmode =“Modal”class =“openmode”/>
>< a href =“某处”class =“openmode”/> <! - 未指定 - >
第一个应该在新窗口中打开,第二个在一个模态对话框中打开,第三个应该使用本机行为打开(无论目标在标签上设置).
我想为这个行为创建一个插件,尽可能的通用.我现在写的:
- (function ($) {
- $.fn.myOpenMode = function () {
- return this.mousedown(function () {
- var $this = $(this);
- var mode = $this.data("openmode");
- var href = this.href;
- var handled = true;
- if (mode) {
- switch (mode) {
- case "NewWindow":
- case "1":
- window.open(href,"_blank");
- break;
- case "Dialog":
- case "2":
- openAsDialog(href);
- break;
- // Actually,there are other options,but I removed them for clarity
- default:
- handled = false;
- }
- }
- else {
- handled = false;
- }
- return !handled;
- });
- };
- })(jQuery);
- $(function(){
- $(".openmode").myOpenMode();
- });
这适用于静态生成的标签.但是,我的应用程序可能动态生成标记(大部分时间使用jsRender,但这并不重要).
但是,因为这个行为是在javascript文件被加载时设置一次,所以不会采取动态生成的对象.
我应该怎么处理我的要求?
>我试图使用on方法监视加载事件,但这不起作用:
- $(function(){
- $(document).on("load",".openmode",function() { $(this).myOpenMode(); });
- });
我明白这不行,因为“加载”事件不起泡
>我正在考虑修改我的插件,将“on”放在插件中,但是我不喜欢这个想法,因为它在插件中引入了一些超出范围的行为
>我也可以在创建动态节点时调用该插件,但也会将依赖关系引入其他部分.我的插件不会像我想要的一样自主.
有没有人有建议来处理我的要求,保持我的插件尽可能隔离?
这应该适用于IE8和更高版本(最好与其他浏览器)
解决方法
添加到$.fn的插件应仅适用于列出的元素,而不适用于任何未来的元素.
您应该专注于让您的插件提供机制,例如:
- (function($) {
- $.fn.openmode = function(cmd) {
- cmd = cmd || 'on';
- switch (cmd) {
- case 'click':
- // read props,open windows,etc
- break;
- case 'on':
- this.addClass('openmode');
- break;
- case 'off':
- this.removeClass('openmode');
- break;
- }
- });
- })(jQuery);
然后允许插件用户注册触发该机制的事件处理程序,必要时使用事件委派:
- $(document).on('click','a.openmode',function() {
- $(this).openmode('click');
- });
后一个代码也可以放在jQuery命名空间中,作为一个效用函数:
- (function($) {
- $.openmode = function(cmd) {
- cmd = cmd || 'on';
- switch (cmd) {
- case 'on':
- $(document).on('click.openmode',function() {
- $(this).openmode('click');
- });
- break;
- case 'off':
- $(document).off('click.openmode','a.openmode');
- break;
- }
- };
- })(jQuery);
这样只要打电话:
- $.openmode();
将为每个当前(和将来).openmode元素启用插件所需的所有工作.