在CSS的:hover中调用JavaScript

24

我能否通过css调用JavaScript函数?

例如,通过这个:hover样式:

.first-nav li a:hover,
.first-nav li.hover a {
    margin:-3px 0 -1px;
    height:30px;
    position:relative;
    background:url(../images/nav-hover.jpg) no-repeat;
}

我想调用的JavaScript函数位于一个锚点的:hover事件中。


@Qutbuddin Kamaal:你应该考虑使用像jQuery或Prototype这样的CSS库。它们允许您使用CSS选择器执行查询,并且您可以立即为多个元素设置单个事件处理程序(这似乎是您要做的事情)。 - Andy E
哦,我是指JS库(现在编辑已经太晚了哈哈) - Andy E
6个回答

28

不,你不能直接从CSS中触发JavaScript。

你可以使用CSS选择器来找到想要监视的元素,然后监听鼠标事件。标准事件是mouseovermouseout,但它们可能比较棘手,因为它们冒泡(例如,当鼠标离开任何后代元素时,你会得到mouseout)。但通过适当的逻辑处理,它们并不难处理,实际上,如果你有很多这样的元素,你可能想使用mouseovermouseout而不是下面的替代方法,因为你可以将它们设置在一个父容器上,然后确定涉及哪个后代元素,这在某些情况下可能更简单(在其他情况下可能更复杂)。

IE提供了mouseentermouseleave,它们更容易使用,因为它们不冒泡,但当然这是IE特有的。这些非常方便,以至于一些框架即使在不支持的浏览器中也开始支持它们;例如,PrototypejQuery提供了它们,我也不会感到惊讶如果其他一些框架也提供了。jQuery还提供了方便的hover函数,这非常接近你想要的:

// jQuery
$(".first-nav li a").hover(
    function(event) {
        // The mouse has entered the element, can reference the element via 'this'
    },
    function (event) {
        // The mouse has left the element, can reference the element via 'this'
    }
 );

这实际上只是一种设置 mouseentermouseleave 事件处理程序的快捷方式,但仍然非常简洁。

在 Prototype 中也很相似:

// Prototype
$$(".first-nav li a")
    .invoke("observe", "mouseenter", function(event) {
        // The mouse has entered the element, can reference the element via 'this'
    })
    .invoke("observe", "mouseleave", function(event) {
        // The mouse has left the element, can reference the element via 'this'
    });

(OT:在这两种情况下,我都使用了匿名内联函数表达式,只是为了避免给人留下必须使用命名函数的印象。然而,在生产代码中,我始终建议使用命名函数。)


5

编号。

(好吧,微软Expressions和Mozilla Bindings可能允许它,但两者都是专有的,应该避免使用)

从JavaScript中分配事件处理程序。像YUI和jQuery这样的库允许您使用CSS选择器选择要应用它们的元素。 事件委托 允许您在不必显式分配到每个元素上的情况下处理元素上的事件(如果您在文档加载之后添加元素,这很方便)。


1
+1. 表达式已被弃用,将无法在IE8中使用,主要是因为它们对性能的影响非常糟糕。DHTML行为仍然有效,但它们没有同样的性能问题。 - Andy E

3
您可以从JavaScript中调用它(它执行相同的操作)。以下是如何在JS上执行的代码:
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
    $("a").hover(function(){
        myFunctionInvoke();
    });
});
</script>

如果您有特定的锚点,请更改选择器。


1
我认为你的意思是使用.hover()而不是.click() - Mathias Bynens
@Mathias Bynens,确实是我的意图,我现在会纠正它。 - ant

0

这既是一种美学品质,因此应使用CSS进行处理;也是一种功能品质,因此应使用HTML和JavaScript进行处理。

而且有一种非常简单的方法可以在HTML中从页面加载时调用函数:

<body onload="myFunction()">

0

因为从CSS中进行操作更加合乎逻辑。

如果想要在鼠标悬停时使链接可点击,这是一种美学效果,应该使用CSS来处理。例如:

#header_menu li a:hover{
    color:white;
    js:click();
}

-3
其实,是可以的。只需要在background-url中像这样使用JavaScript:
<STYLE type="text/css">BODY{background:url("javascript:yourFunction();")}</STYLE>

虽然不完全确定这是否有效。

干杯!


1
“yes you can”并不等同于“我不确定这会起作用”。 - blackirishman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接