带有内部 <span> 的 <a> 未触发:IE 8 中的活动状态

Posted

技术标签:

【中文标题】带有内部 <span> 的 <a> 未触发:IE 8 中的活动状态【英文标题】:<a> with an inner <span> not triggering :active state in IE 8 【发布时间】:2011-02-15 16:45:07 【问题描述】:

我想设置由&lt;a&gt; 标记表示的按钮的:active 状态。 &lt;a&gt; 标签有一个内部&lt;span&gt;(因为我想给这个按钮添加一个图标)。

我注意到:active 状态在除 Internet Explorer 8 之外的所有设备中都被正确触发。在 IE 8 中,&lt;span&gt; 周围的区域(&lt;a&gt; 的填充)似乎触发了:active 状态,但是直接点击&lt;span&gt;内的文字时,不会触发:active状态。

有没有办法在不使用 javascript 的情况下解决这个问题?

html

<a class="button" href="#">
 <span>Add a link</span>
</a>

CSS

a.button  some styles 
a.button:active  some other styles 

【问题讨论】:

【参考方案1】:

你可以用这个来修复它:

$('.yourspan').mousedown(function()
    $(this).parents('.youranchor:first').css("background-position","bottom");   
); 
$('.yourspan').mouseup(function()
    $(this).parents('.youranchor:first').css("background-position","top");  
);

【讨论】:

【参考方案2】:

我遇到了同样的问题,终于解决了: 您需要在&lt;a&gt; 标签中添加一个目标,即在&lt;a&gt; 标签中添加“href”属性:

<a id="logonButton" class="button submit" href="@Url.Action("Index", "Home")"><span>Log On</span></a>

在所有 IE 版本中都像魅力一样工作。 :)

【讨论】:

【参考方案3】:

我想出了一个使用 jquery 修复 ie8 错误的解决方案。对于这样一个小错误,它对资源的使用不合理,但是我当时正在开发的应用程序已经使用了很多 jQuery,所以没关系。

HTML

<a href="#" class="btn"><span>Button</span></a>

CSS

a.btn:active,
a.btn.ie8:hover  /* <-ie8 hack */
    /* mouse down state a.btn style */


a.btn:active span,
a.btn.ie8:hover span  /* <-ie8 hack */
    /* mouse down state a.btn span style */

jQuery

​​>
$(document).ready(function() 

    var isIE8 = ($.browser.msie == true && $.browser.version == "8.0") ? true : false;

    if (isIE8 === true) 
        $("a.btn").bind(
            mousedown: function() 
                $(this).addClass('ie8');
            ,
            mouseleave: function() 
                $(this).removeClass('ie8');
            
        );
    
);

【讨论】:

【参考方案4】:

今天遇到了完全相同的问题。

尝试设置

z-index: -1; position: relative;

在跨度上。

这是我读完这篇文章后想到的。

我实际上写了一个很长的答案,带有示例代码等等等。但是在缩进 css 代码时,IE 遇到了阻塞并崩溃了..

【讨论】:

是的,它可以工作,但是 z-index -1 隐藏了锚点后面的跨度,所以如果你将背景应用于 A,你得到的只是一个具有漂亮背景的 ampy 锚点:)【参考方案5】:

正确,非常复杂的解决方案(并且仍然不完美),但是:如果您不将链接文本包装在 &lt;span&gt; 中,而只是使用 &lt;span&gt; 作为放置背景图像和将其绝对定位在&lt;a&gt; 内,然后&lt;span&gt;(大部分)停止阻塞:active 状态。

测试页面:http://www.pauldwaite.co.uk/test-pages/2769392/3/

HTML

<a class="button" href="#">
<span></span>Link
</a>

CSS

<style type="text/css">
a.button 
    position: relative;
    padding: 10px;
    color: #c00;


a.button:active 
    color: #009;
    font-weight: bold;


a.button span 
    position: absolute;
    top: 50%;
    left: 3px;
    margin-top: -2px;
    border: solid 2px #000;

</style>

当然,&lt;span&gt; 覆盖的区域仍然会捕获点击事件,所以当用户点击那里时,他们不会看到:active 状态。比之前的情况略有改善。

【讨论】:

感谢您的所有努力,保罗。 IE 从未停止让我感到惊讶。 这个错误让我很伤心。感谢您的修复。 +1 @Liam:很高兴你找到了它,没有什么比一个不起眼且未记录的 IE 错误更糟糕的了。【参考方案6】:

或者,您可以将&lt;span&gt; 放在&lt;a&gt; 之外。这似乎行得通。

HTML

<span><a class="button" href="#">
 Add a link
</a></span>

测试页面:http://www.pauldwaite.co.uk/test-pages/2769392/2/

【讨论】:

确实可以,但是需要更改的背景是图标后面的背景,需要应用于最里面的标签。在这种情况下,我需要 具有 :active 状态来更改背景,而 将具有图标背景图像。 【参考方案7】:

棘手:当单击&lt;span&gt; 时,IE 8 似乎没有将&lt;a&gt; 标记注册为活动状态。 (IE 6 和 7 都很好。你发现了回归!)

但是,它确实将&lt;span&gt; 标记注册为活动的。如果您可以将您想要为:active 状态更改的所有样式应用到&lt;span&gt;,那么 IE 8 将继续播放,例如

a.button:active,
a.button span:active/* This selector is for IE 8 only */ 
    color: #009;
    font-weight: bold;

测试页面:http://www.pauldwaite.co.uk/test-pages/2769392/

任何仅适用于链接的样式在 IE 8 中都不会改变。在上面的示例中,文本在单击时会改变颜色,但下划线不会,因为下划线样式仅附加到链接(通过浏览器的默认样式),而不是 &lt;span&gt;

【讨论】:

谢谢!其实我只是在IE8下试过,点击时链接的样式没有变化。 如果你点击链接的右上角,你可以获得:active状态触发,但是如果你点击链接本身,:active状态不会触发。 啊哈! IE 8,明白了。我们发现了一个回归,6 和 7 都很好。我将相应地编辑我的答案。 是的,这将适用于您的示例。不幸的是,我首先需要这样做的原因是为了操纵背景属性,所以你的解决方法对我不起作用。我想 JavaScript 可能是要走的路。【参考方案8】:

也许:

a.button span  ...
a.button span:hover  ...

行得通吗?

【讨论】:

可以,但我需要更改外部标签(a 标签)的背景图像样式。内部标签(span)需要有不同的背景图像,不会根据悬停状态而改变。 @Adam:那你为什么不直接不使用a.button span:hover 我没有对内部跨度应用任何 :hover 样式。 a 具有 背景(渐变),而 具有背景(图标)。当有人点击 时,我希望背景发生变化,但图标需要保持不变。

以上是关于带有内部 <span> 的 <a> 未触发:IE 8 中的活动状态的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript仅选择外部元素的内部html,不包括内部元素

使用XPath获取带有span的段落的完整文本

下划线 <a> 和 <span> 就像一个完整的链接

用正则表达式刮掉带有可选 <spans> 的 <p>

<span/> 带有 HTML enter 的字段与没有 HTML enter 的字段给出不同的宽度/边距

带有 CSS 类名的 <span> 内复选框的 jQuery 选择器