我創建了一個響應模板,並且當屏幕正在調整大小或小於指定的寬度時,我想要移除元素上的偵聽器。
設想一個菜單,當您將鼠標懸停在項目上時,它會顯示正常顯示中的子菜單,但移動設備中的相同菜單僅通過點擊或點擊項目來顯示子菜單。jQuery Undelegate不起作用
我不能讓undelegate工作。在調整大小的屏幕上,我仍然有mouseover
和mouseout
事件偵聽器。我沒有得到在控制檯的任何錯誤,我都試過:
.off('mouseover', 'li')
.off('mouseover')
.undelegate('li', 'mouseover')
.undelegate('li')
和他們沒有工作。
var $window = $(window);
function handleSidenav() {
$(".nav-list").delegate('li', 'mouseover', function(e) {
$(this).find("a").addClass('active');
$(this).find("div.sub-items").toggle();
}).delegate('li', 'mouseout', function(e) {
$(this).find('a').removeClass('active');
$(this).find("div.sub-items").toggle();
});
}
function checkWidth() {
var windowsize = $window.width();
if (windowsize < 767) {
smallScreenDelegation();
} else {
SmallScreenUndelegation();
}
}
checkWidth();
handleSidenav();
$window.resize(checkWidth());
function smallScreenDelegation() {
$(".nav-list").undelegate('li'); //It's not working
$(".nav-list").undelegate('li'); //It's not working
$(".nav-list").delegate('li a:first', 'click', function(event) {
if ($(this).next().is(':hidden')) {
$(this).addClass('active');
$(this).next().slideDown('slow');
} else {
$(this).removeClass('active').next().slideUp('slow');
}
event.preventDefault();
});
}
你當然意識到你剛剛做出了一個主要的噓聲,因爲你重新調整每個瀏覽器調整大小的事件處理程序,可能在某些時候導致類似堆棧溢出的事情? – adeneo 2013-04-28 19:08:45
我以前遇到過這種情況,我認爲它與你在該類存在之前向代理鼠標懸停添加一個類有關。 – nick 2013-04-28 19:13:11
@MarcelGwerder'mouseover'和'mouseout'通常在觸摸時發生在觸摸設備上。 – 2013-04-28 19:14:23