【问题标题】:Why does styling TDs in jquery make the markup insane?为什么在 jquery 中设置 TD 样式会使标记变得疯狂?
【发布时间】:2011-09-26 03:33:39
【问题描述】:

我正在尝试为表格中的所有表格单元格添加一个简单的边框。

重要的是,我的标记要保持简单,以便我可以使用其他一些功能。

假设我的 tds 样式如下:

$('td').css('border', '1px solid #000');

这是我的结果:

<td style=​"border-top-width:​ 1px;​ border-right-width:​ 1px;​ border-bottom-width:​ 1px;​ border-left-width:​ 1px;​ border-top-style:​ solid;​ border-right-style:​ solid;​ border-bottom-style:​ solid;​ border-left-style:​ solid;​ border-top-color:​ rgb(0, 0, 0)​;​ border-right-color:​ rgb(0, 0, 0)​;​ border-bottom-color:​ rgb(0, 0, 0)​;​ border-left-color:​ rgb(0, 0, 0)​;​ ">​…​/td>

课程也不适合我正在尝试做的事情。为什么我的单元格以这种荒谬的方式格式化?

【问题讨论】:

  • 为什么不适合上课?
  • 这为 CSS 类尖叫?为什么不合适?如果您需要能够即时切换它们,那么我有一个简单的 CSS 解决方案,更干净
  • 类不合适,因为用户可以编辑样式
  • @ionfish 当您说“这是专门在 chrome 中发生的”时,您的意思是它不会在其他浏览器中这样做吗?如果这是真的,您应该将其添加到问题中,并指定它在其他浏览器中 的作用 做什么。我猜想它在所有浏览器中都是一样的,因为我看不出有什么不同的原因。
  • 不管 use-case 听起来是否是类的好案例,问题根本不在于这个。这就是为什么 jQuery 会做一些看起来很愚蠢的事情。

标签: jquery css html-table styling


【解决方案1】:

这就是浏览器处理速记 CSS 属性的方式;一些浏览器可能会以不同于内部表示的方式实现人类可读的表示,但实际上,

border: 1px solid #000

是简写

border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-top-style: solid;
border-right-style: solid;
border-bottom-style: solid;
border-left-style: solid;
border-top-color: #000;
border-right-color: #000;
border-bottom-color: #000;
border-left-color: #000;

#000 的多种可能表示形式。

我在 Chrome 和 Safari(都是 WebKit 浏览器)中进行了测试,并且直接在 DOM (element.style.border = '1px solid #000') 中设置该属性得到了完全一致的结果。这是 WebKit 的行为,不是 jQuery

此外,这是一个很好的例子来强调 DOM 与标记不同,应该区别对待。即使在designMode/contentEditable 场景中(这是唯一真正合理使用直接样式而不是 CSS 类),仅抢夺元素的 innerHTML 表示就是一大堆潜在风险。您会在旧版本的 IE 中看到其他表现形式,其 DOM 的“标记”表示完全是疯狂的。看到类似的东西并不少见:

<div class="foo">...</div>

变成:

<DIV CLASS="foo" _JQUERY12903579="qwertyuiop" HASLAYOUT=TRUE etc etc etc>...</DIV>

正如 DOM 和标记不是一回事,重要的是要意识到 attributeproperty 不是一回事。最终,jQuery.css 方法是通过为element.style 的属性赋值来实现的(例如collection.css({ border: '1px solid #000' }) 大致相当于collection.each(function() { this.style.border = '1px solid #000' });而collection.attr('style', 'border: 1px solid #000') 相当于collection.each(function() { this.setAttribute('style', 'border: 1px solid #000'); })。通过设置属性而不是属性,您所做的实际上就像追溯编辑 HTML 标记一样。如果您还设置了该冲突的属性,这可能会导致不可预知的结果。

另请注意,通过使用attr('style', ...),您可能会覆盖所有元素的内联样式。

【讨论】:

  • 我认为我不需要发布单独的答案,因为这是非常好的洞察力,但是,您可能要提到这是 style="" HTML 属性之间的区别 和.style.[cssattribute] 属性
  • 很好的解释。我一直认为 DOM 只是一种故障排除工具...我从不期望它与我的标记相匹配,因为它只是特定浏览器对标记的解释
  • @Levi - 不幸的是,这不是真的。起初我认为你是对的,但 @eyelidlessness 是正确的 - 设置 style 属性的属性会导致这个 - jQuery 与否。你说的是“jQuery以这种方式应用.css('border', '1px solid #000')指令。”)。
  • @Levi 你误解了这个答案。它内置在 DOM 中。 jQuery.css() 设置样式 property,而不是 attribute,所以不,它不能“在标记中保持简单”。
  • @Levi 建议 jQuery“可以”做一些甚至无法满足相关功能规范的事情,这根本不是一个合理的“可以”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多