【问题标题】:Why is HAML swapping tag positions?为什么 HAML 交换标签位置?
【发布时间】:2013-01-08 17:31:12
【问题描述】:

这个 HAML(带有链式助手):

- haml_tag :a, helper_method_1(local1, local2).merge( helper_method_2 local3, local4 ) do
  %div{ style: helper_method_3(local5, local6) }
  %span= local7
  %h3{style: "color: black"}= local8

正在生成这个(倒置)HTML:

<div style="prop1: val:1; prop2: val2;"></div>
<span>Span Text</span>
<h3 style="prop3: val3;">H3 Text</h3>
<a class="class-value" id="id-value" href="href-value"></a>

但是如果我们去掉链式方法,比如:

(...)
- haml_tag :a, helper_method_1(local1, local2) do
(...)

比 HTML 按预期呈现:

<a class="class-value" id="id-value" href="href-value">
  <div style="prop1: val:1; prop2: val2;"></div>
  <span>Span Text</span>
  <h3 style="prop3: val3;">H3 Text</h3>
</a>

HAML 有什么问题?

【问题讨论】:

  • 你能在第一行添加明确的括号- haml_tag(:a, helper_method_1(local1, local2).merge( helper_method_2(local3, local4) )) do看看是否有效?
  • 您确定 HAML 正在这样做吗? &lt;a&gt; 在 DOM 中的父元素是什么?
  • 我和 mu 在一起;我不确定在 div/etc 周围包裹一个锚点。是有效的 HTML。
  • 很难解释,但确实是括号问题。实际上,我的第一个代码块与我的真实示例略有不同。在我的代码中,helper_method_2 收到了 local3 和 local4 没有括号。我想我只是无法完全弄清楚这个红宝石选项。无论如何...非常感谢。我将更新示例并开始回答。也许有一天会有一个更高的人完成它。 :)
  • 用&lt;a&gt; 包裹&lt;div&gt; 是不合法的。 Tidy 说:missing &lt;/a&gt; before &lt;div&gt;.

标签: html ruby-on-rails ruby haml


【解决方案1】:

通过更改此行解决了问题:

- haml_tag :a, helper_method_1(local1, local2).merge( helper_method_2 local3, local4 ) do

进入这一行(在 helper_method_2 上添加括号):

- haml_tag :a, helper_method_1(local1, local2).merge( helper_method_2(local3, local4) ) do

这是一个不完整的答案。 请随意扩展/编辑它。

【讨论】:

    【解决方案2】:

    我猜 HAML 正在生成您期望的 HTML,但浏览器正在重写它以符合 HTML 标准。

    让我们看看HTML4 has to say about &lt;a&gt;:

    <!ELEMENT A - - (%inline;)* -(A)       -- anchor -->
    

    和inline means:

    <!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
    

    如果您查看 fontstyle、phrase、special 和 formctrl,您不会找到 @ 987654330@ 或 &lt;h3&gt; 在任何这些列表中,因此 &lt;a&gt;&lt;div&gt;&lt;/div&gt;&lt;/a&gt; 和 &lt;a&gt;&lt;h3&gt;&lt;/h3&gt;&lt;/a&gt; 都不是有效的 HTML4。

    HTML5 has this to say about what an &lt;a&gt; can contain:

    允许的内容

    透明(短语内容或流式内容)

    Transparent content 表示:

    如果特定元素 foo 的内容模型被描述为 透明,意思是:

    • 当元素 foo 是其内容模型允许包含流元素的父元素 bar 的子元素时,则内容 foo 元素也可以包含流元素
    • 当元素 foo 是父元素 baz 的子元素时,其内容模型将其子元素限制为仅是短语 元素,则元素 foo 的任何子元素也受到限制 仅作为短语元素

    &lt;div&gt; 是flow element,但不是phrasing element,&lt;h3&gt; 也是流元素而不是短语元素。因此,如果您处于 HTML5 模式,您的 &lt;a&gt; 将需要一个可以包含流元素的父元素。我认为这并不适用;如果正在使用 HTML5 并且 &lt;a&gt; 的父级不允许流元素,我希望浏览器能够更多地重组事物,它必须将 &lt;div&gt; 和 &lt;h3&gt; 再上一层才能获得超越了对短语元素的限制。

    我猜你的浏览器认为它正在呈现 HTML4,或者它不是最新的 HTML5 所说的。

    你有一些选择:

    1. 查看 HAML 生成的 HTML,不要询问浏览器,在浏览器对其执行任何操作之前查看原始输出。这会告诉你谁在改变事情。
    2. 确保您的 HTML 被呈现为 HTML5。
    3. 重新构建您的 HTML 以匹配相关标准,您可能必须在此处补偿过时但过于狂热的浏览器。这可能需要您在 &lt;a&gt; 中使用 &lt;div&gt; 和 &lt;h3&gt; 以外的其他内容。

    【讨论】:

    • 感谢 mu,特殊的方法,但这只是一个括号问题。顺便说一句,我在 Chrome 23.0.1271.101(相当更新)中进行测试,我没有考虑代码合规性,但我会寻求纠正这个问题。感谢您的精彩提示!
    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    相关资源
    最近更新 更多