jQuery:调用后更改插件选项
当我使用jquery-ui的对话框时,我有一个由我自己创建的插件来设置一些东西。 而不是打电话:
$("#popup").dialog(options);
我用这个:
$("#popup").dialogPlugin(options);
而dialogPlugin将调用.dialog(options)
(做完一些事后)。
在我的插件中,我可以修改对话框事件的一些函数,如下所示:
var originalCloseFn = options.close; options.close = function() { //my own stuff. originalCloseFn(); };
该插件工作得很好,但经过一段时间使用它我意识到我无法从插件外部更改对话框function,如下所示:
$("#popup").dialog("option", "close", newFunctionOnClose);
如果我这样做,插件添加到close函数的代码将丢失。
所以我在插件的开头添加了这段代码:
if (options == "option") { if (val == undefined) return _this.dialog("option", name); else return _this.dialog("option", name, val); }
现在我需要更改此代码的第五行以实际更改我的插件的选项,而不是jquery-ui。 ( .dialogPlugin
函数的选项,而不是.dialog
的选项)。 我真的不知道我该怎么做。 有什么想法吗?
编辑
我知道问题不是很清楚,我的英语不好让我不再解释自己,所以我做了一个小小的例子 。
我想要的是在第七行( return $(this).dialog("option", name, val);
)而不是修改(等同于optionsForJQuery.close
)修改options.close
。 这样我就会避免扼杀插件的行为。
试试这个:
HTML:
I'm a popup
JS:
(function ($) { $.fn.dialogPlugin = function (options, name, val) { var // setter function close fnClose = null, // function when close fnMyClose = function() { alert("This is plugin's close behavior"); if (fnClose) fnClose(); }; if (options == "option") { if (name == "close" && $.isFunction(val)) { fnClose = val; val = fnMyClose; } } else { if (options.close) fnClose = options.close; options.close = fnMyClose; } return (name) ? $(this).dialog(options, name, val) //if var == 'undefined'is equal to not send parameters : $(this).dialog(options); }; })(jQuery); $("#popup").dialogPlugin({ close: function() { alert("This is user's first close behavior"); } }); $("#popup").dialogPlugin("option", "close", function() { alert("This is user's second close behavior"); });
编辑
或更简单优雅:
(function($){ var dialog_close = $.ui.dialog.prototype.close; $.ui.dialog.prototype.close = function() { var self = this; alert("This is plugin's close behavior"); dialog_close.apply(this, arguments); }; })(jQuery);