在一个按钮上绑定两个具有不同属性的单击事件不起作用
Binding two click events on one button with different attributes not working
无论如何,我得到了这个应该打开我的导航的按钮。
HAML:
%button#nav-toggle{ :navigate => 'false' } Menu
HTML:
<button id='nav-toggle' navigate='false'>Menu</button>
然后我像这样绑定两次点击:
jQuery
$(document).ready(function(){
$("#nav-toggle[navigate='false']").click(function(){
console.log("opening nav");
$("#nav-toggle").attr('navigate','true');
$( "#masthead" ).animate({
height:'100vh',
}, {
duration: 1000,
queue: false,
done: function() {
console.log("first done");
}
}
);
});
$("#nav-toggle[navigate='true']").click(function(){
console.log("closing nav");
$("#nav-toggle").attr('navigate','false');
$( "#masthead" ).animate({
height:'10vh',
}, {
duration: 1000,
queue: false,
done: function() {
console.log("second done");
}
}
);
});
});
出于某种原因,当我第二次点击按钮时(当它的 navigate-attribute 设置为 true 时,它仍然会启动这两个事件中的第一个事件。
我在这里错过了什么?
完整代码在这里:Codepen
您需要委托活动。
看看这个
http://codepen.io/anon/pen/jAjkpA?editors=1010
在本例中,您需要将事件绑定到父级 .hamb-container
。
这里有一个 link 来了解委托和事件冒泡的工作原理 https://learn.jquery.com/events/event-delegation/。
基本上总结一下:
当事件被触发时,它会将事件一直冒泡到您的根 HTML 标记。
当您想添加动态内容或在您的情况下选择一个动态变化的属性时,这很有用。
那么我们如何绑定到动态内容呢?简单的。我们用静态容器包围它们并绑定到它。此外,我们让 JQuery 知道动态内容是什么。因此 Jquery 将侦听静态元素上的事件并检查它是否真的源自您要查找的元素。
类似这样
$( "#staticAncestor" ).on( "click", "#DynamicContent", function( event ) {
});
希望这对您有所帮助。编码愉快!
For some reason, when I click the button for the second time (When its navigate-attribute is set to true, it still launches the first event of those two.
What am I missing here guys and girls?
你什么都没漏掉。
事件绑定到元素而不是 property/attribute。
因为.click .on( "click",处理程序):
.on( events [, selector ] [, data ], handler ): Attach an event handler function for one or more events to the selected elements
因此,您可以像这样更改代码:
$(function () {
$("#nav-toggle[navigate='false']").click(function(){
console.log("opening nav");
var attr= ($("#nav-toggle").attr('navigate') == 'false' ? false : true);
$("#nav-toggle").attr('navigate',!attr);
if (!attr) {
$( "#masthead" ).animate({
height:'100vh',
}, {
duration: 1000,
queue: false,
done: function() {
console.log("first done");
}
}
);
} else {
$( "#masthead" ).animate({
height:'10vh',
}, {
duration: 1000,
queue: false,
done: function() {
console.log("second done");
}
}
);
}
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<button id='nav-toggle' navigate='false'>Menu</button>
无论如何,我得到了这个应该打开我的导航的按钮。
HAML:
%button#nav-toggle{ :navigate => 'false' } Menu
HTML:
<button id='nav-toggle' navigate='false'>Menu</button>
然后我像这样绑定两次点击:
jQuery
$(document).ready(function(){
$("#nav-toggle[navigate='false']").click(function(){
console.log("opening nav");
$("#nav-toggle").attr('navigate','true');
$( "#masthead" ).animate({
height:'100vh',
}, {
duration: 1000,
queue: false,
done: function() {
console.log("first done");
}
}
);
});
$("#nav-toggle[navigate='true']").click(function(){
console.log("closing nav");
$("#nav-toggle").attr('navigate','false');
$( "#masthead" ).animate({
height:'10vh',
}, {
duration: 1000,
queue: false,
done: function() {
console.log("second done");
}
}
);
});
});
出于某种原因,当我第二次点击按钮时(当它的 navigate-attribute 设置为 true 时,它仍然会启动这两个事件中的第一个事件。
我在这里错过了什么?
完整代码在这里:Codepen
您需要委托活动。
看看这个 http://codepen.io/anon/pen/jAjkpA?editors=1010
在本例中,您需要将事件绑定到父级 .hamb-container
。
这里有一个 link 来了解委托和事件冒泡的工作原理 https://learn.jquery.com/events/event-delegation/。
基本上总结一下:
当事件被触发时,它会将事件一直冒泡到您的根 HTML 标记。
当您想添加动态内容或在您的情况下选择一个动态变化的属性时,这很有用。
那么我们如何绑定到动态内容呢?简单的。我们用静态容器包围它们并绑定到它。此外,我们让 JQuery 知道动态内容是什么。因此 Jquery 将侦听静态元素上的事件并检查它是否真的源自您要查找的元素。
类似这样
$( "#staticAncestor" ).on( "click", "#DynamicContent", function( event ) {
});
希望这对您有所帮助。编码愉快!
For some reason, when I click the button for the second time (When its navigate-attribute is set to true, it still launches the first event of those two.
What am I missing here guys and girls?
你什么都没漏掉。
事件绑定到元素而不是 property/attribute。
因为.click .on( "click",处理程序):
.on( events [, selector ] [, data ], handler ): Attach an event handler function for one or more events to the selected elements
因此,您可以像这样更改代码:
$(function () {
$("#nav-toggle[navigate='false']").click(function(){
console.log("opening nav");
var attr= ($("#nav-toggle").attr('navigate') == 'false' ? false : true);
$("#nav-toggle").attr('navigate',!attr);
if (!attr) {
$( "#masthead" ).animate({
height:'100vh',
}, {
duration: 1000,
queue: false,
done: function() {
console.log("first done");
}
}
);
} else {
$( "#masthead" ).animate({
height:'10vh',
}, {
duration: 1000,
queue: false,
done: function() {
console.log("second done");
}
}
);
}
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<button id='nav-toggle' navigate='false'>Menu</button>