【问题标题】:firing css :hover using jquery触发css:使用jquery悬停
【发布时间】:2013-03-23 14:51:37
【问题描述】:

我在这样的标签上应用了一个 css 规则

a { background-color: #000; }
a:hover {background-color: #ff0000; }

我想使用 jquery 触发它的悬停行为,可以吗?此代码运行良好,但未将背景颜色更改为红色。

$('.me a').mouseenter();

为什么我需要这个? 我必须为我的 Web 应用程序的菜单编写自动化测试,这就是我需要的。

这里的重点是我可以使用 jquery 执行附加到 a:hover 的浏览器行为吗?

【问题讨论】:

  • 为什么要自己做一些默认已经提供的事情
  • @Mr.Alien:我认为我们可以假设效果是在没有实际鼠标悬停的情况下进行模拟的。
  • @DavidHedlund 讨厌的想法..
  • @DavidHedlund 是的,我需要编写自动化测试

标签: jquery css


【解决方案1】:

,您不能以编程方式设置hover 状态。

正如其他人指出的那样,您可以通过编程设置一个类,并在悬停或分类时为元素使用相同的样式:

a.hover, a:hover { ... }

您可以使用:focus 执行类似的操作,它也可以通过编程方式设置 (demo)。

但是,您似乎只能在应用程序中触发 javascript,而不能更改其源代码的任何部分。在这种情况下,您需要做的是使用 java 脚本更改 css 规则本身。

在测试设置中,您可以将所有 :hover 样式更改为另外接受类名的样式:

function allowMockHover() {

    // iterate over all styleSheets
    for(var i = 0, l = document.styleSheets.length; i < l; i++) {
        var s = document.styleSheets[i];
        if(s.cssRules == null) continue;

        // iterate over all rules in styleSheet
        for(var x = 0, rl = s.cssRules.length; x < rl; x++) {
            var r = s.cssRules[x];
            if(r.selectorText && r.selectorText.indexOf(':hover') >= 0) {
               fixRule(r);
            }
        }
    }

}

function fixRule(rule) {

    // if the current rule has several selectors, treat them separately:
    var parts = rule.selectorText.split(',');
    for(var i = 0, l = parts.length; i < l; i++) {
        if(parts[i].indexOf(':hover') >= 0) {
           // update selector to be same + selector with class
           parts[i] = [ parts[i], parts[i].replace(/:hover/gi, '.mock-hover') ].join(',');
        }
    }

    // update rule
    rule.selectorText = parts.join(',');
}

Demo

【讨论】:

    【解决方案2】:

    与直接操作 CSS 相比,此代码背后的原因是 CSS 属于样式表而不是单个页面。现在想象一下,你想改变应用程序的背景颜色,并且直接在 jQuery 中改变 CSS,玩得开心。通过下面的示例,您可以更改 CSS 表中的 .hoverClass 并完成。

    a { background-color: #000; }
    .hoverClass {background-color: #ff0000; }
    
    
    
    $('.me a').mouseenter(function(){
         $(this).toggleClass('hoverClass');
    }).mouseout(function(){
         $(this).toggleClass('hoverClass');
    });
    

    尽管如上所述,这似乎完全没有意义,因为悬停类的概念是您想要实现的。

    .me>a:hover {background-color: #ff0000; }
    

    【讨论】:

    • 完全忘记 jQuery 是一个大胆的评论,除非你非常熟悉 OP 可能想要模拟悬停效果的场景。
    • 当然有时情况可能需要它,对于我的生活,老实说,我无法想到将鼠标悬停在 a 元素上的情况,你会注意到我确实提供了请求 jQuery 代码以及我的个人意见;)
    • javascript 仅在您为示例选择的特定场景中是多余的。如果所有 OP 想要在 mouseenter/mouseleave 处显示该效果,那么是的,CSS 就足够了(除了一些我认为可能不支持伪类的非常旧版本的 IE)。仅基于这个问题,完全可以想象 OP 想要使用来自 :hover 的样式,只要 something else 发生,例如点击 another 链接。
    • 这正是我回答他的问题的原因。我看不到这里的问题。虽然我无法阅读 OP 的想法,但我确实认为在回答原始问题的同时指出其他选项是我们的责任。当我写下我的答案时,OP 还没有编辑问题来指出他为什么需要这个。
    • 我的问题是,当仅在您建模的特定场景中出现这种情况时,您将脚本方法称为多余。不过,这只是一个评论,我从没想过要多于此。反对票不是我的,我可以补充一下。
    【解决方案3】:

    据我所知,这里并不是触发浏览器默认的悬停行为(这不是你想要的吗?)。但即使有,正如你正在做的那样($('a').mouseenter();),你只需模拟几分之一秒的悬停,就在它默认为正常行为之后。一种更简单的方法可能是添加一个类,如下所示:

    $('a').addClass('is-hover'); 
    

    使用以下 css:

    a:hover,
    a.is-hover {
        background: red;
    }
    

    真的不需要小提琴,但无论如何:http://jsfiddle.net/5fqXs/

    【讨论】:

      【解决方案4】:

      我使用的一种方法是:

      开始模拟悬停: $('.me a').trigger("mouseover")

      结束模拟悬停: $('.me a').trigger("mouseleave)

      【讨论】:

        【解决方案5】:

        如果你想重用 CSS 规则,请执行以下操作

        1) 将 CSS 规则更改为

        a:hover, .hovered {background-color: #ff0000; }
        

        2) 添加这个javascript代码

        $('.me a').hover(function(){
          $(this).addClass('hovered');
        },function(){
          $(this).removeClass('hovered');
        });
        

        【讨论】:

          【解决方案6】:
          $('.me a').hover(function (){ $(this).css("background-color,"red")}, 
          function(){$(this).css("background-color,"black")});
          

          应该可以帮助你:)

          在这里你可以了解更多关于 Jquery 中的 hover() http://api.jquery.com/hover/

          【讨论】:

          • 他已经在 CSS 中有一个悬停类。我认为他只是想将样式重用于一些 javascript 事件。
          【解决方案7】:

          更改您的 CSS 规则,使样式也有一个类名:

          a:hover,
          a.mouseenter
          {
             background-color: #ff0000;
          }
          

          然后,您可以在希望提供悬停效果时简单地添加/删除类:

          $('.me a').addClass("mouseenter");
          

          现场演示: http://jsfiddle.net/X3Hm9/

          【讨论】:

            【解决方案8】:

            试试这个

            <a href="#">Move the mouse pointer over this paragraph.</a>
            
            $(document).ready(function(){
              $("a").mouseover(function(){
                $("a").css("background-color","yellow");
              });
              $("a").mouseout(function(){
                $("a").css("background-color","lightgray");
              });
            });
            

            Jsfiddle 示例http://jsfiddle.net/X5r8r/1110/

            【讨论】:

              【解决方案9】:

              试试这个:

              $('.me a').mouseenter(function(){
                  $(this).css('background', 'red')
              });
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-12-04
                • 1970-01-01
                • 1970-01-01
                • 2011-05-19
                • 2011-01-03
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多