问题 .is(“:hover”)从jQuery 1.9开始被破坏如何修复


做的时候 $(...your selector here...).is(":hover"),1.9.1之前的jQuery给出了正确的答案,而jQuery 1.9.1告诉你:

错误:语法错误,无法识别的表达式:unsupported pseudo: hover

这是一个解决方法(回答不必要。)

http://jsfiddle.net/mathheadinclouds/V342R/

简短的回答,检查是否

.parent().find(":hover")

长度为1,包含有问题的元素。

这不是关于在悬停上执行操作 - 为此,只需使用.hover() 这是在任意时间点,找出是否有一些元素在盘旋


9885
2018-05-11 13:11


起源

你想回答自己的问题吗?如果是这样的话:写下答案。 - Denys Séguret
你让事情变得复杂。只是 .hover() 会做: jsfiddle.net/BxL4w/5 - Antony
@Anthony:错了。我想要一个布尔值,它是否徘徊。我不想在悬停时执行操作。 - mathheadinclouds
你不应该把答案放在这个问题上。如果您愿意,您可以回答您自己的问题。 - kapa


答案:


假设您的选择器是 #myid, 使用 $('#myid:hover') 而不是使用 .is()

如果你正在使用 $(this) 或变量,使用 myVar.filter(':hover')


15
2018-05-11 13:14



你是对的,这更简单。我也把它放到了小提琴里 - mathheadinclouds
使用时怎么样 $(this) 还是变量对象? - t q
然后,使用var temp = $(yourElement).parent()。find(“:hover”); return temp.length == 1 && temp [0] == yourElement; - mathheadinclouds
@tq添加到我的回答。 - Mooseman
在jQuery 3.1.1中不起作用......我试试 $('#myid:hover').length > 0 在事件处理程序中。 - Legends


但是,当您使用jQuery.fn.is()将元素与预先未知的组合选择器进行比较时,上述解决方法是不合适的,并且可以匹配父容器中的多个元素。

例如,相同的异常时selectorText在style_get()下面是等于抛出: “.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:悬停.mCSB_dragger .mCSB_dragger_bar”

..因为悬停未在Sizzle.selectors.pseudos或Sizzle.selectors.setFilters(jquery-2.1.4,第1764行)中定义。

function style_get(elem) {

  var sheets=document.styleSheets;
  var css_properties={};
  elem=$(elem);

  for (var s in sheets) {
    var rules=sheets[s].rules || sheets[s].cssRules;

    for (var r in rules) {
      if (elem.is(rules[r].selectorText)) {

        css_properties=$.extend(
          css_properties,
          css.parse(rules[r].style),
          css.parse(elem.attr('style'))
        );

      }
    }

  }

  return css_properties;

}

0
2018-06-01 14:40



您指的是哪种“解决方法”是“不合适”?你在评论另一篇文章吗?如果是这样,您应该在该帖子上发表评论。你的答案似乎不完整。 - Kmeixner
@Kmeixner,OP写道“这是一个解决方法......”它可能是你所要求的答案。我很容易找到它使用ctrl + f并输入“workaround” - Zectbumo


尝试将匿名函数放入.filter()

我想,我的解决方案可以帮到你:

//
// jQuery 3 pseudo ':hover' doesn't support
//

// Working on jQuery 1.7.1
$("*").on('click', $.proxy(function() {
    if ( this.$('.tooltip:hover').length > 0 ) { // jQuery 3.2.1 -> Uncaught Error: Syntax error, unrecognized expression: unsupported pseudo: hover
      console.log('Hovered!');
    } else { 
      console.log('Where is my element!?'); 
    }
}, this));


// Updated solution for jQuery 1.7.1 - 3.2.1
$("*").on('click', $.proxy(function() {
    var isHovered = $('.tooltip').filter(function() {
        return $(this).is(":hover");
    });

    if ( isHovered.length > 0 ) {
      console.log('Hovered!');
    } else { 
      console.log('Where is my element!?'); 
    }
}, this));

另外,你可以看到我的GitHub要点:https://gist.github.com/antydemant/74b00e27790e65f4555a29b73eea7bb2


0
2018-01-04 21:29