根据可见性绑定不同的事件

bind different event based on visibility

我有一些 jquery 代码,我想根据框是否可见来进行绑定。如果它是可见的,我想调用一个特定的函数。如果它不可见,我希望功能改变。我有下面的代码,我相信理论上应该可以工作。我错过了什么?

if ($(box).is(':visible')) {
    
     $("#prev2").bind('click', test);

} else{
    
      $("#prev2").bind('click', test1);
}


$("#b").click(function () {
$("#box").hide();
});

function test() {
    alert("clicked");

}

function test1() {
    alert("clicked again!");

}
#box {
    position:absolute;
    width:100px;
    height:100px;
    background-color:black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<button id="prev2">prev</button>
<button id="next2">next</button>
<br>
<br>
<button id="b">Button</button><br><br>
<div id="box"></div><br>

您应该首先取消绑定附加到该元素的任何事件。使用

if ($(box).is(':visible')) {
   $("#prev2").unbind('click');
   $("#prev2").bind('click', test);
} else{
   $("#prev2").unbind('click');
   $("#prev2").bind('click', test1);
}

以上将取消绑定任何事件并重新绑定新的处理程序。隐藏框后,您需要更改处理程序。

更新

以下 fiddle 显示事件如何在用户单击按钮时绑定。该函数应该是 运行 一次,以便将初始事件绑定到元素。然后当 div 被隐藏时它是 re运行.

Fiddle on the matter