我想在一些额外的代码中包装现有的click事件。
基本上我在手风琴中有一个多部分形式,我想触发手风琴标题点击的验证。手风琴代码在别处使用,我不想改变它。
这是我尝试过的:
//Take the click events off the accordion elements and wrap them to trigger validation
$('.accordion h1').each(function (index, value) {
var currentAccordion = $(value);
//Get reference to original click
var originalClick = currentAccordion.click;
//unbind original click
currentAccordion.unbind('click');
//bind new event
currentAccordion.click(function () {
//Trigger validation
if ($('#aspnetForm').valid()) {
current = parseInt($(this).next().find('.calculate-step').attr('data-step'));
//Call original click.
originalClick();
}
});
});
jQuery抛出一个错误,因为它试图在this.trigger
函数中执行originalClick
,我认为this
不是jQuery所期望的。
编辑:更新了代码。这有效,但有点难看!
//Take the click events off the accordion elements and wrap them to trigger validation
$('.accordion h1').each(function (index, value) {
var currentAccordion = $(value);
var originalClick = currentAccordion.data("events")['click'][0].handler;
currentAccordion.unbind('click');
currentAccordion.click(function (e) {
if ($('#aspnetForm').valid()) {
current = parseInt($(this).next().find('.calculate-step').attr('data-step'));
$.proxy(originalClick, currentAccordion)(e);
}
});
});
答案 0 :(得分:4)
我想这个:
var originalClick = currentAccordion.click;
实际上并没有按照你的想法进行操作 - 你正在捕获对jQuery点击功能的引用,而不是你添加的事件处理程序,所以当你调用originalClick()它相当于:$(value).click ()
答案 1 :(得分:3)
我终于想出了一些可靠的东西:
$(".remove").each(function(){
// get all our click events and store them
var x = $._data($(this)[0], "events");
var y = {}
for(i in x.click)
{
if(x.click[i].handler)
{
y[i] = x.click[i].handler;
}
}
// stop our click event from running
$(this).off("click")
// re-add our click event with a confirmation
$(this).click(function(){
if(confirm("Are you sure?"))
{
// if they click yes, run click events!
for(i in y)
{
y[i]()
}
return true;
}
// if they click cancel, return false
return false;
})
})
这看起来有点奇怪(为什么我们将点击事件存储在变量“y”中?)
最初我试图在x.click中运行处理程序,但是当我们调用.off(“click”)时它们似乎被破坏了。在单独的变量“y”中创建处理程序的副本。抱歉,我没有深入解释,但我相信.off(“click”)方法会从我们的文档中删除click事件以及处理程序。
答案 2 :(得分:1)
currentAccordion.click是一个jQuery函数,而不是实际的事件。
从蛮力方法开始,您需要做的是:
这看起来像是一个事件过滤插件的工作,但我找不到。如果您的应用程序中不需要最后一点,那么它会更简单一些。
修改:经过一些研究,显示的bindIf
函数here看起来就像你需要的那样(或至少给出了一个大方向)
答案 3 :(得分:1)
我不是jQuery用户,但在Javascript中,您可以设置 this 关键字的上下文。
在jQuery中,您使用$.proxy()方法执行此操作。
$.proxy(originalClick, value);
originalClick();
就个人而言,我会考虑在你的Accordion中创建回调钩子,或者利用在打开或关闭手风琴窗格时触发的现有回调(如果存在)。
希望有所帮助:)