【问题标题】:IE8 v8 not changing class for a DOM element despite JS function changing the element attribute尽管 JS 函数更改了元素属性,但 IE8 v8 并未更改 DOM 元素的类
【发布时间】:2011-02-01 09:41:11
【问题描述】:

我有一个屏幕键盘,以便更安全地输入密码。

键盘本身是这样放置的:

<div class="teclado_grafico" id="teclado_grafico">
    <a class="tecla_teclado"  onmousedown="teclaAction( this, 'caja_selector'); return false" style="top: 0px; left: 0px;">Q</a>
    <a class="tecla_teclado"  onmousedown="teclaAction( this, 'caja_selector'); return false" style="top: 0px; left: 28px;">W</a>
.
.
.
</div>

它有一个“Shift 按钮”,可以触发一个 JS 函数(我确实已经尝试过所有这些):

if (obj.innerHTML == "Mayus.") {
    try {
        MAYUSCULA_ACTIVADO = !MAYUSCULA_ACTIVADO;
        var tgrafico = document.getElementById("teclado_grafico");
        if(MAYUSCULA_ACTIVADO) {
//            tgrafico.className = "teclado_grafico mayuscula";
//            $("#teclado_grafico").removeClass('minuscula').addClass('mayuscula');
//            $("#teclado_grafico").attr('class', 'teclado_grafico mayuscula');
//            $("#teclado_grafico").attr('className', 'teclado_grafico mayuscula');
            tgrafico.setAttribute('className', "teclado_grafico mayuscula") ||
            tgrafico.setAttribute('class', "teclado_grafico mayuscula");
        } else {
//            tgrafico.className = "teclado_grafico minuscula";
//            $("#teclado_grafico").removeClass('mayuscula').addClass('minuscula');
//            $("#teclado_grafico").attr('class', 'teclado_grafico minuscula');
//            $("#teclado_grafico").attr('className', 'teclado_grafico minuscula');
            tgrafico.setAttribute('className', "teclado_grafico minuscula") ||
            tgrafico.setAttribute('class', "teclado_grafico minuscula");
        }
    } catch (_E) {
        //void
    }
    return;
}

关联的 CSS 是这样的:

.mayuscula a.tecla_teclado{
    text-transform: uppercase;
}
.minuscula a.tecla_teclado{
    text-transform: lowercase;
}

它适用于我尝试过的每一个浏览器。即 6、7;歌剧 10; G铬; FF 3、3.5 和 3.6; Safari 4,...但在 IE8 v8(严格模式)中,类没有改变!我的意思是,使用 IE8 工具进行调试可以让人们看到属性 className 存在并且它发生了变化……但用户看不到字母从大写变为小写,再变为大写。

我只是不知道如何处理这个...我曾抱怨客户端使用 IE6...现在他们更新了他们的东西并且这出现了。任何帮助都会非常有帮助!

EDIT已经尝试过的建议

tgrafico.className = MAYUSCULA_ACTIVADO ? "teclado_grafico mayuscula" : "teclado_grafico minuscula";

但还没有快乐。打开 IE8 开发工具可以在 HTML 选项卡中看到类在预期值之间正确更改,但浏览器只是不正常!

【问题讨论】:

  • Internet Explorer 8 不支持 className 属性,因此如果您只需要在 IE8 中工作,您应该使用正确的 'class' 属性。
  • 不,伙计。正如我所写的,我在许多浏览器中测试了这些东西。还是谢谢

标签: javascript css internet-explorer-8 dhtml


【解决方案1】:

不要为此靠近属性,因为 IE 的属性行为与其他浏览器和跨模式不一致,您不需要处理它们。相反,只需使用元素的 className 属性:

tgrafico.className = MAYUSCULA_ACTIVADO ?
                     "teclado_grafico mayuscula" : "teclado_grafico minuscula";

更新

这似乎是 IE 8 中的一个错误。该方法绝对正确,并且类正在切换:您可以通过更改适当的 CSS 并在单击 shift 按钮时观察文本颜色的正确变化来证明这一点:

.mayuscula a.tecla_teclado{
    text-transform: uppercase;
    color: green;
}
.minuscula a.tecla_teclado{
    text-transform: lowercase;
    color: blue;
}

此外,每个&lt;a&gt; 元素的currentStyle.textTransform 属性设置正确,您可以使用以下内容证明:

<a class="tecla_teclado" onclick="alert(this.currentStyle.textTransform);">Q</a>

所以我们断定这是 IE 8 中的渲染错误。我找到了一种解决方法,即不在默认状态下应用 text-transform,即大写。所以使用我的类切换代码并将你的 CSS 更改为

.mayuscula a.tecla_teclado{
}
.minuscula a.tecla_teclado{
    text-transform: lowercase;
}

...会修复它。

【讨论】:

  • 对不起,伙计。错误的行为拒绝去。它确实第一次从大写变为小写,但是,它不再起作用了......
  • 我的方法是正确的,并且在 IE 8 中似乎存在一个错误。我在更新的答案中建议了一个解决方法。
【解决方案2】:

我会尝试使用 jquery,基本上所有的键都是小写的,并且有 css 类

.Upper {text-decoration:uppercase; }

下面的代码应该可以工作

$('.shift').click(function(){ 
    $('.key').toggleClass('Upper');
});

实际上我有几乎相同的东西,但没有文本装饰属性,并且 IE8 do 更新了 toggleClass 上 DOM 元素的外观 否则你应该看看 jQuery 在 toggleClass 上做了什么,以使其跨浏览器

【讨论】:

  • 使用问题中显示的内容,我使用过:$('#teclado_grafico').toggleClass('minuscula');。 JQuery 方式的正确方法。非常感谢。 PS。所以还不允许设置赏金。说可以在21小时内完成。在那之前,我会留下 +1 :)
  • 我们一开始尝试使用纯 javascript,但在遇到一些问题后,例如您决定编写原型或 jquery 的人会花更多时间在这上面,最好不要扔给其他人的经验 =)
  • 实际上这里的修复是从默认状态的 CSS 类中删除 text-transform: lowercase;,与 jQuery 无关。
  • 我想这件事是小写和大写都适用的。但仍然 jquery 代码看起来更整洁
  • 两个答案都指向同一个,即从两类方法到一类切换方法。正如我在问题更新中所述,它确实更改了类名(是的,我也看到了),但渲染无法正常工作。正如我所说的那样,我将赏金给第一个给出有效答案的人。谢谢你们的帮助,很高兴找到周到的反馈,也发现我对 IE8 不渲染东西并不疯狂! :)
【解决方案3】:

我在 IE8 上遇到过这种情况。我的解决方案是:

tgrafico.className ="teclado_grafico mayuscula";

不通过 setAttribute('className'...

我不知道为什么会这样。

附:对不起我的英语... :)

【讨论】:

  • 正如我在问题中包含的代码中所示,这是我尝试的第一件事,据我所知,它不适用于 IE8 严格模式。感谢您的帮助...我将设置在线测试,以便我们检查每个案例。 PS。别担心,没关系:)
猜你喜欢
  • 1970-01-01
  • 2015-10-29
  • 2017-07-11
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多