为什么我在单个事件上执行多个
why am I getting multiple executions on a single event?
我的脚本中显然有一个根本性的缺陷,尽管我看不出它是什么。
我正在尝试从"选择器"更改列表中的元素。
脚本在执行一次时运行良好,但每次新执行时,它都会增加在每个事件上运行的次数。
在这里更容易理解我在实践中的意思:http://jsfiddle.net/Zbdt3/1/
$$('.edit').each(function(el) {
el.addEvent('click',function() {
$$('#picker span').each(function(im) {
im.addEvent('dblclick',function() {
el.getParent().getElement('p').set('text',im.get('text'));
console.log(im.get('text'));
});
});
});
});
<ul>
<li><p>X</p><span class="edit">edit</span></li>
<li><p>Y</p><span class="edit">edit</span></li>
<li><p>Z</p><span class="edit">edit</span></li>
</ul>
<div id="picker">
<span>A</span>
<span>B</span>
<span>C</span>
</div>
因为每次点击 .edit
时都会在 #picked span
上添加新的事件侦听器。您应该单独添加它们。
var activeEl;
$$('.edit').each(function(el) {
el.addEvent('click',function() {
$('picker').setStyles({
'display':'block'
});
activeEl = el;
});
});
$$('#picker span').each(function(im) {
im.addEvent('dblclick',function() {
activeEl.getParent().getElement('p').set('text',im.get('text'));
console.log(im.get('text'));
$('picker').setStyle('display','none');
});
});
下面是更新的示例 http://jsfiddle.net/hQqh6/
首先循环访问所有.edit
元素并将事件附加到每个元素。
在每个元素的事件处理程序中,循环访问每个 #picker span
元素,并为每个元素附加另一个事件处理程序。
这样,每次触发.edit
元素的事件处理程序时,您都会为#picker span
元素附加其他事件处理程序,然后将它们堆叠起来。当#picker span
上的事件被触发时,所有的地狱都松动了......
因为您是按$$('.edit')
选择的,并且此选择器将返回集合(您有3
元素class="edit"
),通过这些集合,您正在执行.each(function(el) ...
并为每个元素分配el.addEvent('click',function() ...
(单击事件)。在此事件处理程序中.edit
每次触发事件时,您都会为 #picker span
分配新的事件处理程序。结果触发了多个事件,并且"某处"失败。
注意:如@Tadeck所述,通过.each()
(以逐个方式)按顺序分配事件不是很有效。这可以通过选择器完成。
相关文章:
- 使用react js在跨域上执行事件javascript
- 如何使用cURL或其他方式在点击时执行事件
- javascript执行事件顺序
- While Scrolling:如果scrollTop()等于或达到一个值,则执行事件
- 如何使用gulp-jslint-simple成功执行事件
- 如果初始事件返回 false,则停止执行事件侦听器
- 我怎么能等待在javascript中执行事件
- 使用 AJAX 在 jQuery 和 C# 之间传递变量和执行事件
- 执行 C# 事件处理程序,然后执行该 js 函数
- Vue.js 在组件渲染后执行事件触发器
- 在事件的自然行为之前执行事件
- javascript更改类没有't执行事件
- 如何按顺序执行事件函数
- 在worker上执行事件对象.Onmessage从不包含任何有趣的数据之外的东西
- 选项更改,执行事件javascript
- 使用node.js在进程终止时执行事件
- 从此特定父类查找兄弟类以执行事件
- 使用jquery创建弹出窗口并执行事件
- Javascript执行事件点击
- 单击除一个元素之外的所有内容时执行事件