我有一个悬停功能,如果它是触摸设备,我希望悬停事件不会发生.问题是当您点击带有触摸设备的链接时,它会在执行点击事件之前执行悬停事件,因此您必须点击它两次才能使用它.
这是悬停功能:
- $("#close").hover(
- function () {
- $("#close_2").css({
- display: "none"
- });
- $("#close_1").css({
- display: "block"
- });
- },function () {
- $("#close_1").css({
- display: "none"
- });
- $("#close_2").css({
- display: "block"
- });;
- }
- );
然后我将此设置为click功能:
- $('#close').click(function() {
- var id = $(this).attr('id');
- $('#full_image').animate({
- height: 0
- },300,function() {
- $('#full_image img').attr('src','#');
- });
- $("#close_1").css({
- display: "none"
- });
- $("#close_2").css({
- display: "none"
- });
- $("#close").css({
- display: "none"
- });
- });
解决方法
使.hover()方法更明确,并将其与.on()结合使用:
- var $close1 = $('#close_1'),$close2 = $('#close_2');
- $('#close').on({
- mouseenter: function(){
- $close2.css({display:'none'});
- $close1.css({display:'block'});
- },mouseleave: function(){
- $close1.css({display:'none'});
- $close2.css({display:'block'});
- }
- });
然后将其与.off()结合使用.
- $('#close').on('touchstart',function(){
- $(this).off('mouseenter,mouseleave');
- });
如果您希望在点击触摸设备时触发事件,但悬停在桌面设备上,则将这些功能分别作为您在这些操作中调用的单独功能.
编辑
我做了这个答案已经有一段时间了,这是一个更好的方法:
- $(function(){
- var isTouchDevice = ('ontouchstart' in window || 'onmsgesturechange' in window),$close = $('#close'),$close1 = $('#close_1'),$close2 = $('#close_2');
- if(!isTouchDevice){
- $close.on({
- mouseenter: function(){
- $close2.hide();
- $close1.show();
- },mouseleave: function(){
- $close1.hide();
- $close2.show();
- }
- });
- }
- $close.on('click',function(){
- $('#full_image').animate({height:0},function(){
- $(this).find('img').attr('src','#');
- });
- $close.hide();
- $close1.hide();
- $close2.hide();
- });
- });