0

Mootools 在停止工作后才Events开始工作。 希望有人对此有问题:http: //jsfiddle.net/3j3Ws/ CSSclick

ul li,li.selected div{
    width:22px;
    height:22px;
    display:block;
    background:#000;
    color:#fff;
    text-align:center;
    border-radius:3px;
}
ul#list{
    display:none;
    opacity:0;
    float:left;
}

HTML

<ul id="option">
    <li class="selected" id="a">a</li>
    <ul id="list">
        <li id="b">b</li>
        <li id="c">c</li>
        <li id="d">d</li>
    </ul>
</ul>​

Mootools JavaScript

window.addEvent('domready', function(){
    var x = '<div>v</div>';
    $$('ul#option li.selected').set('html',x);
    var opt = $$('ul#option li.selected div');
    var d = opt.getStyle('display');
    var l = document.id('list');
    var list = opt.set('morph').addEvents({
        click:function(){
            l.store('timerA',(function(){
                l.morph({
                    'display':'block',
                    'opacity':1
                });
             $$('ul#option li.selected').setStyle('background-color','#fff');
             $$('ul#option li.selected div').destroy();
            }).delay(10,this));//$clear(this.retrieve('timerA'));
        }
    }
    );
    l.set('morph').addEvents({
    mouseleave:function(el){
        this.store('timerB',(function(){
            this.morph({
                'display':d,
                'opacity':0
            });
            $$('ul#option li.selected').removeProperties('style');
            $$('ul#option li.selected').set('html',x);
        }).delay(500,this));//$clear(this.retrieve('timerB'));
    }
    });
});​
4

2 回答 2

1

你有奇怪的写作风格。

反正。这是毁灭。事件没有被委派。即,您的选择器是第一个 div,但这是一个物理元素,它得到一个UID和一个针对它的功能性 cllback。

通过这样做.destroy(),您将从 dom 中删除此 div,即使您在之后重新插入它,因为您不使用事件委托,该事件将不再起作用(事件是元素存储的一部分,因此 destroy 也会删除它们)。

查看http://jsfiddle.net/dimitar/3j3Ws/1/ -> 证明它可以正常工作(我添加了 mootools 更容易.show().hide()但你可以只使用.setStyle("display", "none").

或者,看看为document.id("option")asclick:relay(div.down)和 mod x html做一个事件class='down'- 然后你现在拥有的代码将保留。

于 2010-08-11T17:39:29.897 回答
0

很可能是这样的:

         $$('ul#option li.selected div').destroy();

此时,您将删除<div>v</div>之前插入并附加了 click 事件的 。

在稍后的 mouseleave 中,您执行以下操作:

        $$('ul#option li.selected').set('html',x);

它重新创建了 div,但还没有将点击处理程序重新附加到新副本。

评论跟进:

当您使用 时.set('html', x),您将用一个新节点替换原始节点,该节点也替换了事件处理程序。处理程序附加到实际节点,而不是节点在 DOM 树中的位置。

于 2010-08-11T16:54:04.983 回答