首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新绑定使用.off()方法jQuery解除绑定的事件处理程序

重新绑定使用.off()方法jQuery解除绑定的事件处理程序
EN

Stack Overflow用户
提问于 2020-01-06 14:44:51
回答 3查看 69关注 0票数 0

我有一个元素,我们称它为div1,我将事件“单击”绑定到它,这样它就可以在单击时运行一些代码。然后,我得到了另一个元素,当它被单击时,我们称它为div2,它运行下面这行代码:div1.off('click');,所以现在成功地解除了div1单击事件处理程序的绑定。

这工作得很好,但是我想稍后在第三个div1单击事件上“重新绑定”这个div单击事件。

我找不到如何重新绑定我调用了.off()的单击事件。有人知道我是怎么做到这一点的吗?

我尝试过的:

代码语言:javascript
复制
div1.one('click',function() {
    ...some code
});
div2.on('click',function() {
    ...some code
    div1.off('click');
});   
//all good so far
div3.on('click',function() {
    ...some code
    div1.on('click'); //this is the part which is obviously wrong i just put it to show my intentions - this line needs to "rebind" the div1 click event
});    
EN

回答 3

Stack Overflow用户

发布于 2020-01-06 15:04:25

你应该为你的一次点击创建一个函数,例如在你点击div3之后,你可以重新绑定div1

代码语言:javascript
复制
let div1 = $('#div1');
let div2 = $('#div2');
let div3 = $('#div3');

function myfunc() {
  alert('Haha!')
}

div1.one('click', myfunc);

div2.one('click', function() {
  console.log('off')
  div1.off('click', myfunc);
});
div3.one('click', function() {
  console.log('on')
  div1.on('click', myfunc);
});
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="div1">div1</div>
<div id="div2">div2</div>
<div id="div3">div3</div>

下面是在本例中使用bindunbind的示例:

代码语言:javascript
复制
let div1 = $('#div1');
let div2 = $('#div2');
let div3 = $('#div3');

function myfunc() {
  alert('Haha!')
}

div1.one('click', myfunc);

div2.bind('click', function() {
  console.log('off')
  div1.unbind('click');
});
div3.bind('click', function() {
  console.log('on')
  div1.bind('click', myfunc);
});
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="div1">div1</div>
<div id="div2">div2</div>
<div id="div3">div3</div>

票数 2
EN

Stack Overflow用户

发布于 2020-01-06 15:02:53

您可以将div1.on中定义的匿名函数提取为一个普通函数,然后可以重用该函数。如下图所示:

代码语言:javascript
复制
var div1 = $("#one")
var div2 = $("#two")
var div3 = $("#three")

div1.one('click',div1Click); //change anonymous function to normal function
div2.on('click',function() {
    console.log('2');
    div1.off('click');
});   
div3.on('click',function() {
    console.log('3');
    div1.on('click', div1Click); 
});    

function div1Click() {
   console.log('1');
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="one">  
one
</div>
<div id="two">  
two
</div>
<div id="three">  
three
</div>

票数 0
EN

Stack Overflow用户

发布于 2020-01-06 16:37:30

打开和关闭点击事件的另一种方法是始终保留点击捕获,但使操作依赖于额外的data标志(此处:off):

代码语言:javascript
复制
$('div[id]').on('click',function() {
 let sw={two:true, three:""}[this.id];
 if (sw===undefined) { // div #one was clicked: do the action:
   if (!this.dataset.off) console.log(this.id); // do the action 
 }
 else $('div#one')[0].dataset.off=sw; // button #two or #three was clicked
});   
代码语言:javascript
复制
div {cursor:pointer}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="one">one</div>
<div id="two">two</div>
<div id="three">three</div>

我尝试了一个使用{two:true, three:false}的版本,但不幸的是,变量sw在另存为dataset.off时被转换为字符串,因此false变为"false"并变为tried。空格总是假的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59607770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档