【问题标题】:How to switch betwen click and mouseenter methods?如何在 onclick 和 mouseover 方法之间切换?
【发布时间】:2013-06-19 15:02:49
【问题描述】:

我有两个按钮:

<button id="Ck">Click</button>
<button id="Me">Mouseenter</button>

我想让用户有机会通过单击这两个按钮之一来选择如何打开我的 jQuery 动画菜单(单击或鼠标输入)。

有没有办法在这些方法之间切换?即使刷新页面,我必须做些什么才能保留这些选择?

【问题讨论】:

    标签: jquery button click switch-statement mouseenter


    【解决方案1】:

    很容易。

    首先,给按钮一个类:

    <button id="Ck" class="ClickMouseenter">Click</button>
    <button id="Me" class="ClickMouseenter">Click</button>
    

    然后在点击按钮时检查id,并适当分配:

    $('.ClickMouseenter').on('click',function(){
        var id = this.id,
            $menu = $('#MenuExample');
    
        $menu.off();
        if(id==='Ck'){
            $menu.on('click',function(){
                 // click magic;
            });
        } else {
            $menu.on('mouseenter',function(){
                // mouseenter magic;
            });
        }
    });
    

    或者如果他们使用不同的处理程序执行相同的功能:

    // yay for faster code processing!
    $('.ClickMouseenter').on('click',function(){
        var id = this.id,
            action = (id==='Ck' ? 'click' : 'mouseenter');
    
        $('#MenuExample').off().on(action,function(){
            // action magic;
        });
    });
    

    .off() 删除现有的分配(clickmouseenter),然后根据您单击的buttonid 应用新的.on() 处理程序。

    关于在页面刷新时保留这些设置...我的第一个倾向是使用sessionStorage(注意:这仅适用于 IE8 及更高版本;如果您正在为 IE6 或 IE7 编写代码,那么您将无法使用运气)。从包含sessionStorage 赋值的事件中创建一个函数:

    function setMenu(action){
        $('#MenuExample').off().on(action,function(){
            // action magic;
        });
        sessionStorage.menuType = action;
    }
    
    $('.ClickMouseenter').on('click',function(){
        var id = this.id,
            action = (id==='Ck' ? 'click' : 'mouseenter');
    
        setMenu(action);
    });
    

    现在您可以在页面加载时调用它以在必要时重新分配选择,并使用默认后备:

    if(sessionStorage.length > 0){
        setMenu(sessionStorage.menuType);
    } else {
        setMenu('mouseenter');
    }
    

    这显然是一个过于简化的版本,但应该给出一个开始的想法。

    【讨论】:

    • 你能看看我的回答吗?在这里!我需要一些帮助!
    • 你试过我的答案了吗?还是您只尝试了其他答案?因为您所说的关键是.off(),我的答案中包含。
    • 更新了你的 jsFiddle,尽可能多的解释性 cmets => jsfiddle.net/VMDBN/6。此外,还包括使 localStorage 工作的东西,并通过使用缓存和$(this) 使现有功能更加高效。
    • 一个更加改进的版本,将您运行的动画合并到一个函数中(因为它完全相同,只是速度不同)=> jsfiddle.net/VMDBN/8
    • 老实说,我真的希望你能从我的 jsFiddle 中收集到更多信息,而不是 localStorage 的工作。您拥有的代码有效,但效率极低,我付出了很多努力使其尽可能高效,并解释了原因。我知道您是初学者,但您应该学习最佳实践,而不仅仅是“足以工作”的实践。
    【解决方案2】:

    您只需根据点击的内容设置菜单:

    function SetupClick() {
      // Setup click functionality here
    }
    
    function SetupMouseover() {
      // Setup mouseover functionality here
    }
    
    $('#Ck').click(function() {
      SetupClick();
      // Optionally, save choice
      localStorage['userchoice'] = 'click';
    });
    $('#Me').click(function() {
      SetupMouseover();
      // Optionally, save choice
      localStorage['userchoice'] = 'mouseover';
    });
    

    您可以将选项保存在服务器端,也可以使用HTML5 Local Storage,但旧版浏览器不支持它。如果您保存了选择,则必须在文档加载时设置该功能:

    $(document).load(function() {
      if (localStorage && localStorage["userchoice") {
        if (localStorage["userchoice"] == 'click') {
          SetupClick();
        }
        else if (localStorage["userChoice"] == 'mouseover') {
          SetupMouseover();
        }
      }
    });
    

    这是您更新后的jsFiddle 的链接。我稍微清理了代码并添加了对$('#Wp').off(); 的调用以重置事件,这样两者都不会发生。

    【讨论】:

    • 它可以工作,但是如果我单击“单击”按钮和“鼠标悬停”第二个,动画会在 mouseenter 上运行,但也会在单击时运行。如何禁用其他选项?
    • 我更新了jsfiddle。您可以通过调用 $('#Wp').off(); 禁用其他选项
    猜你喜欢
    • 2013-12-09
    • 2017-01-02
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多