如何将函数作为 jQuery 插件的参数传递
我正在尝试编写一个简单的 jQuery 插件来显示警报框(自定义 html + css),并将 yes 和 no 按钮绑定到作为插件调用的参数传递的函数。
到目前为止,这是我的代码:
(function($) {
$.fn.triggerAlert = function (msg,yes,no) {
$('#alert_mask').find("span:first").html(msg);
$('#alert_mask').toggle();
$('#alert_mask #alert_yes').click(function (yes) {
if (typeof yes == 'function') {
yes($(this));
}
$('#alert_mask').hide();
return false;
});
$('#alert_mask #alert_no').click(function (no) {
if (typeof no == 'function') {
no($(this));
}
$('#alert_mask').hide();
return false;
});
}
})(jQuery);
这是正确的轨道还是完全错误的?
谢谢
更新:在 Logan F. Smyth 回答之后,我必须做出调整,因为 yes 的点击事件并且这里没有按钮被定义多次。为了将来的参考或为了其他人的利益,这里是完整的插件。
(function($) {
$.fn.triggerAlert = function (trigger,msg,yes,no) {
var mask = $('#alert_mask');
$(trigger).click(function (e) {
mask.find("span:first").html(msg);
mask.toggle();
e.preventDefault();
});
$('#alert_yes').click(function (e) {
if (yes) yes($(this));
mask.hide();
e.preventDefault();
});
$('#alert_no').click(function (e) {
if (no) no($(this));
mask.hide();
e.preventDefault();
});
}
})(jQuery);
以及如何调用它的示例
$().triggerAlert(
$('#some_element'),
'hello world',
function() { alert('yes') },
function() { alert('no') }
);
I'm trying to write a simple jQuery plugin to show an alert box (custom html + css) and bind the yes an no buttons to functions passed as an argument of the plugins call.
Here's my code so far:
(function($) {
$.fn.triggerAlert = function (msg,yes,no) {
$('#alert_mask').find("span:first").html(msg);
$('#alert_mask').toggle();
$('#alert_mask #alert_yes').click(function (yes) {
if (typeof yes == 'function') {
yes($(this));
}
$('#alert_mask').hide();
return false;
});
$('#alert_mask #alert_no').click(function (no) {
if (typeof no == 'function') {
no($(this));
}
$('#alert_mask').hide();
return false;
});
}
})(jQuery);
Is this in the right track or is it just plain wrong?
Thanks
UPDATE: after Logan F. Smyth answer I had to make an ajustment because the click events of the yes and no buttons here being defined several times. For future reference or for someone else benefit here is the complete plugin.
(function($) {
$.fn.triggerAlert = function (trigger,msg,yes,no) {
var mask = $('#alert_mask');
$(trigger).click(function (e) {
mask.find("span:first").html(msg);
mask.toggle();
e.preventDefault();
});
$('#alert_yes').click(function (e) {
if (yes) yes($(this));
mask.hide();
e.preventDefault();
});
$('#alert_no').click(function (e) {
if (no) no($(this));
mask.hide();
e.preventDefault();
});
}
})(jQuery);
And an example of how to call it
$().triggerAlert(
$('#some_element'),
'hello world',
function() { alert('yes') },
function() { alert('no') }
);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我看到的主要问题是您的点击处理程序采用“no”和“yes”参数,这意味着在这些函数内部,yes 和 no 不会是您传递给整个插件的内容。
让您的选择使用两个 id 也是不必要的,因为 id 无论如何都是唯一的。最后返回 false 是一个坏主意,请使用 PreventDefault 代替。
要触发此操作,您可以调用该函数并传递两个函数,如下所示:
The main issue I see is that your click handlers take 'no' and 'yes' arguments, which means that inside of those functions, yes and no won't be what you passed to the overall plugin.
It's also unneccesary to have your selects use two ids, since ids are unique anyway. Finally return false is a bad idea, use preventDefault instead.
To trigger this, you would call the function and pass two functions like this:
参数在函数作用域内,你可以这样尝试
parameters are in the function scope, you can try like this