2015-11-05 41 views
1

我已经设置的元素,这点我可以动态地添加的:jQuery:如何在事件发生之前执行代码并将结果作为事件参数?

<div id="some-id-1" data-id="1" class="some"> 
<canvas /> 
</div> 
<div id="some-id-2" data-id="2" class="some"> 
<canvas /> 
</div> 
<div id="some-id-3" data-id="3" class="some"> 
<canvas /> 
</div> 
... 

我要附加事件组特定的项目。为了实现它,我有这样的代码:

$('body') 
    .on('click', 'canvas', function (event) { 
     var idx = $(this).parents('.some').data('id'); 
     wrap[idx].action1(event); 
    }) 
    .on('mousemove mouseout', 'canvas', function() { 
     var idx = $(this).parents('.some').data('id'); 
     wrap[idx].action2(); 
    }) 
    .on('mousemove', 'canvas', function (event) { 
     var idx = $(this).parents('.some').data('id'); 
     wrap[idx].action3(event); 
    }); 

在每一个事件,我需要这个额外的行来获得元素的ID,我点击,这是在对象的数组索引。我想摆脱这条线。

有没有办法在事件发生前致电var idx = $(this).parents('.some').data('id');并将idx作为事件的参数?

或任何其他方式来组织代码,而不是写在任何地方var idx = $(this).parents('.some').data('id');

+0

那么究竟是什么问题,你没有得到'idx'价值?顺便说一句,你在HTML中的“canvas”开始标记? – deepakb

+0

不可能,代码将如何“知道”哪个canvas元素“即将”触发事件? –

+0

@DeepakBiswal重复问题。它是虚拟模板,没有'canvas'的问题 –

回答

0

尝试jquery custom events

$(document).on("myCustomEvent", { 
    foo: "bar" 
}, function(event, idx) { 
    console.log(event.data.foo); // "bar" 
    console.log(idx);   // idx 

}); 



var idx = $(this).parents('.some').data('id'); 

$(document).trigger("myCustomEvent", [ idx ]); 
0

我想你应该尝试下面的东西。它将处理每个画布点击。

$('body') 
    .on('click', 'canvas', function (event) { 
     var idx = $(this).parents('.some').data('id'); 
     console.log(idx); 
     wrap[idx].action1(event); 

    }); 
+0

我想你有点误解了。我可以处理“画布”点击。我附加了几个活动。我想跟踪每个画布的每个事件。这就是为什么在每个事件的开始时我需要找到对象idx。这会产生很多重复。 –

0

“复制” data-id画布

$('.some canvas').each(function() { 
    $(this).data('id', $(this).parents('.some').data('id')); 
}); 

然后代码可以像这样

$('body') 
    .on('click', 'canvas', function (event) { 
     wrap[$(this).data('id')].action1(event); 
    }) 
    .on('mousemove mouseout', 'canvas', function() { 
     wrap[$(this).data('id')].action2(); 
    }) 
    .on('mousemove', 'canvas', function (event) { 
     wrap[$(this).data('id')].action3(event); 
    }); 
相关问题