jquery mouseenter不断发射

时间:2011-08-03 13:47:02

标签: javascript jquery

我有一个mousenter / mouseleave函数,可以在元素悬停时交换内容。然而,它不是仅仅在鼠标中心发射,而是继续射击。我创建了一个jsfiddle here,所以希望它更容易理解。

1 个答案:

答案 0 :(得分:3)

在您的rotate_start()rotate_reset()功能中,您将通过此行触发悬停事件:

jq('.product-image-container',super_prod).attr('hover','true');

根据JQuery文档,hover()方法会为mouseentermouseleave事件绑定处理程序。你基本上是在无意中应用递归,因为当鼠标移动时会触发hover

对此的一个简单修复是将.attr('hover','true');替换为.data('hover',true);

这是一个可扩展的解决方案,可以实现您的目标:

HTML:

<div class="item">
    <ul>
        <li>
            Main product photo
        </li>
        <li>
            Alternate product photo 1
        </li>
        <li>
            Alternate product photo 2
        </li>
        <li>
            Alternate product photo 3
        </li>
    </ul>
</div>

<强> CSS:

.item {
    width:200px;
    height:200px;
    background-color:#F0F0F0;
    border:1px solid #666;
}
.item ul li {
    display:none;
}

JQuery:

var jq = jQuery.noConflict();
var timers = [];
var interval_seconds = 2;

jq('.item').mouseenter(function() {

    // Scope this
    var _this = jq(this);

    // Self-executing function
    (function cycle() {

        // Recursive setTimeout accommodates for animation time - setInterval wont
        timers['item'] = setTimeout(function() {

            // Grab the currently visible photo, and the next photo
            var _this_li = _this.find('li:visible');
            var _next_li = _this_li.next();

            // If there is no next photo, cycle back to first photo
            if (_next_li.length == 0) {
                _next_li = _this.find('li:first-child');
            }

            // Animate the rotation
            _this_li.fadeOut('slow', function() {
                _next_li.fadeIn('slow', function() {

                    // Recursion
                    cycle();
                });
            });
        }, interval_seconds * 1000);
    })();
});

jq('.item').mouseleave(function() {

    // Stop the recursive setTimeout
    clearTimeout(timers['item']);

    // Scope this
    var _this = jq(this);

    // Grab the first photo in the list
    var _first_li = _this.find('li:first-child');

    // If the first photo in the list is not the currently visible photo, make it so.
    if (_first_li.not(':visible')) {
        _this.find('li:visible').fadeOut('slow', function() {
            _first_li.fadeIn('slow');
        });
    }
});

jq(function() {

    // Show the first photo on load
    jq('.item').find('li:first-child').fadeIn('slow');
});

演示:http://jsfiddle.net/AlienWebguy/EY8mM/1/