2012-05-19 27 views
1

我的函數觸發第二mouseleave()事件,而不是第一個,導致nth-child(1) & nth-child(2)擁有的bottom:99px一個的CSS屬性時,我希望他們使用的第一個mouseleave()事件該屬性設置爲bottom:94pxJquery事件引發錯誤。需要關閉?

我我相當肯定經過一些研究後,我需要關閉我的(這個)聲明,以便當我在第二輪參數中調用它時,它在新範圍內起作用。

$(document).ready(function(){ 

    $('#rows').on('mouseenter', "div.row div:nth-child(1), div.row div:nth-child(2)",this , function() { 
     $('img',this).stop().animate({"bottom":"0px"}, "fast"); 
    }); 

    $('div',this).off("mouseleave").on("mouseleave", function() { 
     $('img',this).stop().animate({"bottom":"94px"}, "fast");  
    }); 

// need closure here? 

    $('#rows').on('mouseenter', "div.row div:nth-child(3), div.row div:nth-child(4)",this , function() { 
     $('img',this).stop().animate({"bottom":"0px"}, "fast"); 
    }); 

    $('div',this).off("mouseleave").on("mouseleave", function() { 
     $('img',this).stop().animate({"bottom":"99px"}, "fast");  
    }); 
}); 

回答

1

我要去猜測,你想這樣的:

$('#rows').on('mouseenter', "div.row div:nth-child(1), div.row div:nth-child(2)", this , function() { 
    $('img', this).stop().animate({"bottom":"0px"}, "fast"); 

    // when placed inside, the value of this makes more sense? 
    $('div', this).off("mouseleave").on("mouseleave", function() { 
     $('img',this).stop().animate({"bottom":"94px"}, "fast");  
    }); 
}); 

在這份聲明中,你寫的this值大概是window,所以$('div', this)將針對網頁上的所有股利。

$('div', this).off("mouseleave").on("mouseleave", function() { 
    $('img',this).stop().animate({"bottom":"94px"}, "fast");  
}); 
+0

謝謝傑克!這是有道理的,謝謝你看看我的問題,祝福! –

+0

而不是('div',this)我只是使用(this),它現在可以在函數的confins中工作:) –

+0

這是非常低效的,因爲它每次都會刪除並重新附加'mouseleave'偵聽器'mouseenter'事件。 – JMM

0

我想也許下面是你需要的。此代碼是未經測試,但它會至少給你要點:

$(document).ready(function() { 

    var rows, selector, listeners = {}; 

    rows = $('#rows'); 

    listeners.mouseenter = function() { 

    $('img', this).stop().animate({ "bottom" : "0px" }, "fast"); 

    }; 


    listeners.mouseleave = function (event) { 

    $('img', this).stop().animate(

     { "bottom" : event.data.bottom + "px" }, "fast" 

    ); 

    }; 


    selector = "div.row div:nth-child(1), div.row div:nth-child(2)"; 

    rows.on('mouseenter', selector, listeners.mouseenter); 

    rows.off('mouseleave', selector); 

    rows.on('mouseleave', selector, { bottom : 94 }, listeners.mouseleave); 


    selector = "div.row div:nth-child(3), div.row div:nth-child(4)"; 

    rows.on('mouseenter', selector, listeners.mouseenter); 

    rows.off('mouseleave', selector); 

    rows.on('mouseleave', selector, { bottom : 99 }, listeners.mouseleave); 

}); 

在這種情況下,處理程序this內將匹配選擇器(第n個孩子的div.rowdiv)的元素。