2012-12-31 32 views
2

我正在尋找一種方法來管理事件的存儲和禁用事件。我有單元A的懸停功能,單元B的單擊功能。我想暫時禁用A的懸停功能,同時第二次單擊B.如何另一個元素臨時

我正在尋找一種不需要重寫孔的方法很乾脆就像B.東西的內部功能「存儲和禁用事件,調用存儲功能」

我發現像一些。數據技術(「事件」),並執行console.log。我累了但失敗了,或者我寫錯了。

請幫助和建議!

$(A).hover(); 

$(b).click( 

    if($.hasData($(A)[0])){ // if A has event, 
      //STORE all the event A has, and disable 
    }else{ 
      //ENABLE the stored event for A 
    } 
); 
+0

不幸的是,我擔心無法從JavaScript中迭代DOM節點的事件處理程序。也許如果你維護一個數組來跟蹤要添加到該節點的事件,那麼你可以完成這個任務。這是你想要的? – Josep

+0

感謝您的回覆,因此.data('events')與此存儲事件功能無關嗎? – Till

+0

考慮到這個問題的新要求,我添加了一個新的答案。 – Josep

回答

1

我認爲你想做的事是這樣的(example for JQuery 1.7.2):

$("#a").hover(function(){alert("test")}); 
$("#a")[0].active=true; 

$("#b").click(function(){ 
    if($("#a")[0].active){ 
     $("#a")[0].storedEvents = []; 
     var hoverEvents = $("#a").data("events").mouseover; 
     jQuery.each(hoverEvents , function(key,handlerObj) { 
      $("#a")[0].storedEvents.push(handlerObj.handler); 
     }); 
     $("#a").off('hover'); 
    }else{ 
     for(var i=0;i<$("#a")[0].storedEvents.length;i++){ 
      $("#a").hover($("#a")[0].storedEvents[i]); 
     } 
    } 
    $("#a")[0].active = ($("#a")[0].active)==false; 
});​ 

JSFiddle Example

但也有一對夫婦的事情,你必須考慮到:

  • 這如果添加與jQuery的事件,因爲jQuery保存已添加的事件處理程序的內部軌道纔會工作。
  • 不同版本的JQuery處理data("events"),這意味着此代碼可能無法與其他版本的JQuery一起使用。

我希望這有助於。

編輯:

data("events")在JQuery的1.6和jQuery 1.7,但it has been removed in JQuery 1.8使用的內部無證數據結構。所以在JQuery 1.8中,訪問事件數據的唯一方法是:$._data(element, "events")。但請記住JQuery文檔的建議:這不是受支持的公共接口;實際的數據結構可能會從版本到版本不兼容。

+0

非常感謝你!!!,我認爲這是我正在尋找的 – Till

+0

請幫助改善這一點。 http://stackoverflow.com/questions/14098673/store-and-restore-event-handler – Till

+0

完成後,檢查我剛發佈的答案。 ;) – Josep

1

你可以嘗試具有可變就是函數a和b的範圍之內,並使用該變量來觸發動作採取函數B的功能。

var state; 
var a = function() { 
    if(!state) { 
     state = true; 
     // Add hover action and other prep. I'd create a third function to handle this. 
    console.log(state); 
}; 
var b = function() { 
    if(state) { 
     state = false; 
     // Do unbinding of hover code with third function. 
    } else { 
     state = true; 
     // Do whatever else you needed to do 
    } 
} 

不知道更多關於你想要做什麼,我會嘗試類似這樣的事情。

+0

非常感謝!我已經更新了代碼,請幫助和檢查。由於A函數是完全分開的,我不想更改A中的代碼。我有另一種解決方案嗎? – Till

2

試試這個

var hoverme = function() { 
    alert('Hover Event Fired'); 
}; 

$('.A').hover(hoverme); 

var i = 0; 

$('.B').on('click', function(){ 
    if(i%2 === 0){ 
     // Unbind event 
     $('.A').off('hover'); 
    } 
    else{ 
     // Else bind the event 
     $('.A').hover(hoverme); 
    } 
    i++; 
}); 

Check Fiddle

+0

非常感謝,我更新了我的問題。我實際上想要一些不需要再次安裝該功能的東西。就像呼喚記憶一樣,這可能嗎? – Till

1

有可證明更好的方法來做到這一點,但是這工作得很好,在文件準備這樣做:

$("#a")[0].active=false; 

$("#b").click(function(){ 
    $("#a")[0].active = ($("#a")[0].active)==false; 
    if($("#a")[0].active){ 
     $("#a").hover(function(){alert("test")}); 
    }else{ 
     $("#a").off('hover'); 
    } 
}); 

JSFiddle example

+0

非常感謝,我更新了我的問題。我實際上想要一些不需要再次安裝該功能的東西。就像調用存儲的內存一樣,這可能嗎? – Till

+0

不幸的是,我擔心無法從JavaScript中迭代DOM節點的事件處理程序。也許如果你維護一個數組來跟蹤要添加到該節點的事件,那麼你可能能夠完成這個任務,這是你在找什麼? – Josep

+0

感謝您的回覆,因此.data('events')與此存儲事件功能無關嗎? – Till

1

這聽起來像你想要禁用單擊B的點擊懸停事件。

$("body").on("hover", "#a", function(){ 
    alert("hovering"); 
}); 

$("#b").click(function(){ 
    $("body").off("hover", "#a", function() { 
     alert("removed hovering"); 
    }); 
}); 

您可以使用jQuery off方法,看看這個小提琴。 http://jsfiddle.net/nKLwK/1/

+0

非常感謝,我更新了我的問題。我實際上想要一些不需要再次安裝該功能的東西。就像呼喚記憶一樣,這可能嗎? – Till

1

定義一個函數分配給懸停元件上,所以在B點擊,調用解除綁定(「懸停」),用於A元素和B元素的第二次點擊再次定義一個函數來懸停,像這樣:

function aHover(eventObject) { 
    // Todo when the mouse enter object. You can use $(this) here 
} 

function aHoverOut(eventObject) { 
    // Todo when the mouse leave the object. You can use $(this) here 
} 

$(A).hover(aHover, aHoverOut); 
// ... 
$(b).click(function(eventObject) { 
    if($.hasData($(A)[0])){ // if A has event, 
     $(A).unbind('mouseenter mouseleave'); // This is because not a event hover, jQuery convert the element.hover(hoverIn, hoverOut) in element.bind('mouseenter', hoverIn) and element.bind('mouseleave', hoverOut) 
    }else{ 
     $(A).hover(aHover, aHoverOut); 
    } 
}); 
+0

非常感謝,我更新了我的問題。我實際上想要一些不需要再次安裝該功能的東西。就像調用存儲的內存一樣,這可能嗎? – Till

1

你可以用.off功能從jQuery的解除綁定你的「a」元素上懸停。

function hoverA() { 
    alert('I\'m on hover'); 
} 

$('#a').hover(hoverA); 

var active = true; 

$('#b').on('click', function(){ 
    if(active){ 
     $('#a').off('hover'); 
     active = false; 
    } else{ 
     $('#a').hover(hoverA); 
     active = true; 
    } 
}); 

現場演示可以在這裏找到:http://codepen.io/joe/pen/wblpC

+0

非常感謝,我更新了我的問題。我實際上想要一些不需要再次安裝該功能的東西。就像調用存儲的內存一樣,這可能嗎? – Till