【问题标题】:Issue in Chrome, removing CSS with jQuery stays in chromeChrome 中的问题,使用 jQuery 删除 CSS 保留在 chrome 中
【发布时间】:2012-02-15 05:15:02
【问题描述】:

我目前正在开发一个使用 jQuery 用 javascript 大量编码的表格应用程序。

当您单击 td 单元格时,jQuery 会将 2px 纯黑色推送到边框属性。然后在模糊时,我使用 removeAttr 删除样式属性,使其恢复到样式表设置。在 IE9 中运行良好,但当我在 Chrome 中测试时,左边框调整大小,但保持黑色。

似乎唯一可以摆脱这种情况的是打开控制台。当我用控制台打开模糊时,样式标签会被删除,所以我不明白为什么它仍然在左侧呈现黑色边框。有什么想法吗?

编辑:我制作了一个视频来展示我遇到的问题。 http://www.youtube.com/watch?v=JCmYNOO5u4I

代码如下:

$("td.display").live('mouseenter', function () {
    $(this).addClass('selected');
}).live('mouseleave', function () {
    $(this).removeClass('selected');
});

CSS 是:

table TD.selected {
    border: 2px solid;
    border-color: Black;
}

【问题讨论】:

  • 您使用的是哪个版本的 chrome?另外,您是否介意尝试添加/删除类方法以达到相同的效果并查看是否重复
  • 你应该发布你的代码......没有它很难说。
  • 为什么不添加和删除类而不是添加和删除整个样式属性?
  • 你为什么不做.css('border','2px solid #000')并恢复到.css('border','')
  • 代码并没有那么复杂,就是这样:'$(this).css('border', '2px solid black'); $(this).removeAttr('style');'

标签: javascript jquery css


【解决方案1】:

不要使用$.removeAttr,而是使用$.css 来恢复CSS。 $.removeAttr 很可能由于 CSS 的持久性而无法正常工作。

您真正应该做的是add a class 聚焦,然后remove that class 模糊。也就是说,$.addClass$.removeClass,记录在各自的链接中。

【讨论】:

  • 没有这样的运气我试图给它一个类然后删除它但左边框仍然存在。我实际上在其他几个地方使用了 $.removeAttr 并且一切都很好。有趣的是它不适用于这种情况。
  • 我制作了一个视频来展示我的问题youtube.com/watch?v=JCmYNOO5u4I
【解决方案2】:

不要使用 JavaScript 来实现这种微不足道的效果,而是使用 CSS。 :hover 伪选择器在所有现代浏览器中都是 well-supported

td.display:hover {
    border: 2px solid black;
}

我已经调整了您的选择器,因为 <td> 元素始终包含在 <table> 元素中。

演示:http://jsfiddle.net/JKM7e/


更新

这是 Chrome 中许多与 table-css 相关的错误之一。一种解决方法是启动重新渲染。要解决此问题,请让 Chrome 再次呈现页面。此修复不应该在非 webkit 浏览器中激活,因此添加了一个额外的变量。

我还优化了您的代码,并将已弃用的 live 替换为 on。新版本可以在here找到。

// true if webkit, false otherwise
var isWebkit = !!$('<div style="-webkit-border-radius:1px">')[0].style.cssText.length;

$(document).on('blur', 'input.editCell', function () {
    var $thisParent = $(this).parent();      // <-- Optimizing by caching
    // Remove Highlight and bold around cell
    $thisParent.removeClass('selected');
    var colRow = $thisParent.attr('id').split('_');
    $('th:containsExactly(' + colRow[0] + ')').removeAttr('style');
    $('td.yAxis:containsExactly(' + colRow[1] + ')').removeAttr('style');
    // Change class back to display
    $thisParent.attr('class', 'display');
    // Take the entered value and put it in the cell
    $thisParent.html(this.value);
    // if(isFunction(this.value) === 'SUM')

    if (isWebkit) { // Fix for Webkit bug: render the table again
        // Without jQuery, for efficiency
        var style = document.getElementById('spreadsheetTable').style;
        style.color = '#111';                       //<--1. Change style 
        setTimeout(function(){style.color='';}, 4); //<--2. Fix
    }
});

【讨论】:

  • 它实际上不是悬停,而是单击,一旦单击另一个单元格,该单元格应该恢复正常状态。把它想象成excel。我将代码更改为 mouseover 和 mouseleave 以更好地展示我的问题。作为记录,我刚刚在 CSS 中添加了 :hover 并且问题实际上仍然存在。
  • @Dave 您更改的代码没有改进演示...编辑:编辑答案。
  • 感谢有关提高我的代码效率的建议,遗憾的是问题仍然存在。至于点击与鼠标悬停。如果您阅读我的问题,我会明确指出“当您单击 td 单元格时,jQuery 会将 2px 纯黑色推送到边框属性。”我也相信它确实对我的视频有所帮助,因为我必须点击两次,然后点击其他地方才能使我的原始代码正常工作。但就目前而言,这不是 javascript 问题,而是 CSS 问题。您添加 :hover 的原始建议证明了这一点。
  • @Dave 你能提供真实的代码吗?我可以猜出你的意图,但那是浪费时间..
  • 如果你打开excel,点击一个单元格,然后点击另一个单元格,这就是我的意图。我不知道我的代码如何使它更清晰。我想在选定的单元格上有一个黑色边框,就像 excel 一样。微软 Excel。
【解决方案3】:

两个选项: - 使用 .css() 重置样式,而不是 removeAttr - 改用一个类,并在焦点和我们的事件中使用 toggleClass()

第二个选项肯定更可取。

【讨论】:

  • 使用这两个选项时问题仍然存在。我相信这是一个 CSS 问题,而不是一个 javascript 问题。我已经将我的代码发送给了多个朋友和不同的计算机,它在他们所有的 FF 和 IE 上都可以运行,但是在 chrome 上这个怪癖。
猜你喜欢
  • 2012-02-13
  • 2017-03-20
  • 2012-01-17
  • 2011-02-09
  • 2013-04-15
  • 2013-08-10
  • 1970-01-01
  • 2023-03-26
  • 2010-12-17
相关资源
最近更新 更多