如果点击事件在Jquery中处于活动状态,如何关闭悬停?

How to turn off hover if on click event is active in Jquery?

提问人:SDP 提问时间:6/17/2023 最后编辑:SDP 更新时间:6/17/2023 访问量:48

问:

我有一个图标名称,我有 onclick 和悬停事件。tag-icon-arrow

但是由于我将鼠标悬停在图标上,悬停处于活动状态,单击时两者都处于活动状态,这是我不想要的,我知道在单击它会悬停在这里,但是如果我单击图标,它应该关闭。

 bindViewEvents: function () {
            let me = this
                , window = this.$window
                , $tagArrow = window.find(".tag-icon-arrow");

            $tagArrow.off().on('click', function (e) {
                me.highlight(e, true, true);
            });

            $tagArrow.hover(
                function (e) {me.highlight(e, true);},
                function (e) {me.highlight(e, false);}
            );
            $tagArrow.on('click', function (e) {
                me.selectRole(e);
            });

        },
selectRole: function (e) {
            let me = this;
            let $target = $(e.currentTarget);
            let hasRole = $target.is("[data-role]");
            let tagid = hasRole ? $target.attr("data-tagid") : null;
            me.api.xyz(tagid);
        },
        highlight: function (e, canHighlight, clicked) {
            let me = this
                , $target = $(e.currentTarget)
                , _id = $target.attr('data-id')
                , tagid = $target.attr("data-tagid")
                , tbId = me.isZone ? $target.attr("data-M") : "";

            if (canHighlight) {
                clicked ? $target.addClass("active") : 
                $target.removeClass("active");
                if (tbId === undefined) tbId = "";
                let objData = [{"_id": _id, "tagid": tagid,}];
                Common.Gateway.onEventsToXYZ({
                    "event": "xyz",
                    "fids": me.isZone ? [] : objData,
                    "rids": me.isZone ? objData : []
                });
                me.api.xyz(tagid);
            } else {
                if ($target.is(".active"))
                    return;
                Common.Gateway.onEventsToXYZ({
                    "event": "xyz"
                });
                me.api.xyz(null);
                $target.removeClass("active");
            }
        },

selectRole 和 highLight 函数是根据触发的事件调用的自定义函数。 如何改进这一点,以便两者正常工作?正如他们所期望的那样。

JavaScript jQuery 事件 主干 .js

评论

0赞 zer00ne 6/17/2023
究竟做了什么,做了什么,为什么在“悬停”事件中被调用两次?此外,该方法要求您至少传递要删除的事件,但您没有传递任何内容。highlight()selectRole()highlight().off()
0赞 Alexander Nenashev 6/17/2023
@zer00ne您描述的所有内容都是有效的 jQuery 代码。请参阅 QJuery 文档
0赞 zer00ne 6/17/2023
@AlexanderNenashev好的,我做到了,但我找不到这些方法selectRole()highlight()
0赞 Alexander Nenashev 6/17/2023
@zer00ne是关于“为什么在”悬停“事件中被调用两次 highlight()?此外,.off() 方法要求您至少传递要删除的事件”
0赞 SDP 6/17/2023
@zer00ne highlight 和 selectRole 是两个自定义函数,我们在某些事件上执行,我应该添加我的坏。

答:

0赞 Luca 6/17/2023 #1

执行此操作的最简单方法是使用一个标志来指示图标是否已被单击,然后使用该标志有条件地打开/关闭悬停效果。

代码如下:

    bindViewEvents: function () {
      let me = this
        , window = this.$window
        , $tagArrow = window.find(".tag-icon-arrow")
        , clicked = false;
    
      $tagArrow.off().on('click', function (e) {
        me.highlight(e, true, true);
        clicked = true;
      });
    
      $tagArrow.hover(
        function (e) {
          if (!clicked) {
            me.highlight(e, true);
          }
        },
        function (e) {
          if (!clicked) {
            me.highlight(e, false);
          }
        }
      );
    
      $tagArrow.on('click', function (e) {
        me.selectRole(e);
        clicked = true;
      });
    },

1赞 Alexander Nenashev 6/17/2023 #2

只是不要在选择角色时关闭突出显示:

const view = new function() { // I guess this is an angularjs controller
  
  const self = Object.assign(this /* $scope */, {highlight, bindViewEvents, selectRole});
  
  self.bindViewEvents();
  
  function highlight(e, val = true){
    $(e.target).toggleClass('highlighted', val);
  }

  function selectRole(e){
    $(e.target).toggleClass('selected');
  }

  function bindViewEvents() {
    
    const $tagArrow = $('.tag-icon-arrow');

    $tagArrow
      .hover(
        e => self.highlight(e), 
        e => $tagArrow.is('.selected') || self.highlight(e, false)
      )
      .on('click', e => self.selectRole(e));

  }
}
body{
  margin:50px;
}
.tag-icon-arrow{
  padding:20px 30px;
  border-radius:10px;
  background:#bbb;
  cursor:pointer;
  border: 1px solid transparent;
}
.tag-icon-arrow.highlighted{
  background:#ffddee;
}
.tag-icon-arrow.selected{
  border: 1px solid red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a class="tag-icon-arrow">Hover & click me</a>

但最好使用 CSS:

const view = new function() { // I guess this is an angularjs controller
  
  const self = Object.assign(this /* $scope */, {bindViewEvents, selectRole});
  
  self.bindViewEvents();
  
  function selectRole(e){
    $(e.target).toggleClass('selected');
  }

  function bindViewEvents() {
    
    const $tagArrow = $('.tag-icon-arrow');

    $tagArrow
      .on('click', e => self.selectRole(e));

  }
}
body{
  margin:50px;
}
.tag-icon-arrow{
  padding:20px 30px;
  border-radius:10px;
  background:#bbb;
  cursor:pointer;
  border: 1px solid transparent;
}
.tag-icon-arrow:hover,.tag-icon-arrow.selected{
  background:#ffddee;
}
.tag-icon-arrow.selected{
  border: 1px solid red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a class="tag-icon-arrow">Hover & click me</a>

评论

1赞 SDP 6/17/2023
谢谢你的回答,我的错误不是角度控制器,而是 BackboneJS 控制器(如果它们相同,则为 idk),但您的逻辑在这里非常正确。
1赞 Alexander Nenashev 6/17/2023
@SDP欢迎您:)如果你觉得我的答案有用,你可以接受它(复选框)并投票(向上箭头)。这样我就会得到积分奖励,并有动力在未来帮助你,谢谢
1赞 Alexander Nenashev 6/17/2023
@SDP应该可以工作,只需将 的正文复制到 your 并更改为 .并确保将类切换为bindViewEventsbindViewEventsselfthisselectedselectRole()
0赞 SDP 6/17/2023
谢谢,它实际上以一种奇怪的方式工作,因为我从来不知道我可以做 $any.hover().on()。像魅力一样工作。