Javascript AngularJS在处理HTML Void元素的自定义指令时是否存在错误 更新 首先,这不是Angular(@PSL)中的错误 出于历史目的,我把我原来的问题留在下面 这不是HTML规范中的一个bug。在点击下面评论员(@zerflagL)的一些链接后,我看到HTML规范说VOID元素与SELF-CLOSING元素不是同义词(这里有一个关于这个主题的示例) 好吧,我这方面的研究很糟糕 然而,在这方面加倍努力:

Javascript AngularJS在处理HTML Void元素的自定义指令时是否存在错误 更新 首先,这不是Angular(@PSL)中的错误 出于历史目的,我把我原来的问题留在下面 这不是HTML规范中的一个bug。在点击下面评论员(@zerflagL)的一些链接后,我看到HTML规范说VOID元素与SELF-CLOSING元素不是同义词(这里有一个关于这个主题的示例) 好吧,我这方面的研究很糟糕 然而,在这方面加倍努力:,javascript,html,angularjs,angularjs-directive,Javascript,Html,Angularjs,Angularjs Directive,HTML应该包含自动关闭标记(看起来不再是了),同级元素不应该神奇地变成子DOM元素(innerHTML) 感谢@PSL、@shaunhusain和@zeroflagL让我明白过来 我相信我可能在Angular的自定义指令处理中发现了一个bug,希望得到确认,以确保我没有误解自定义指令的行为。我对AngularJS不熟悉,所以也许我犯了一个错误 看起来,当Angular在一个void元素上处理一个自定义指令时,会发生不正确的DOM更改,对等元素会被下推到内部HTML中。以下是一些HTML: &

HTML应该包含自动关闭标记(看起来不再是了),同级元素不应该神奇地变成子DOM元素(innerHTML)

感谢@PSL、@shaunhusain和@zeroflagL让我明白过来


我相信我可能在Angular的自定义指令处理中发现了一个bug,希望得到确认,以确保我没有误解自定义指令的行为。我对AngularJS不熟悉,所以也许我犯了一个错误

看起来,当Angular在一个void元素上处理一个自定义指令时,会发生不正确的DOM更改,对等元素会被下推到内部HTML中。以下是一些HTML:

<div ng-app="myApp">
    <div ng-app="mainController">
        <div>
            <voidtagtest></voidtagtest>
            <p>Example 1 - stays peer</p>
        </div>
        <div>
            <voidtagtest/>
            <p>Example 2 - becomes innerHTML</p>
            <p>this one, too.</p>
        </div>
    </div>
</div>
角度处理后的DOM(需要浏览器web检查)为:

。。。
示例2-成为innerHTML

这个也是

...
注意两个段落标记是如何拉入voidtagtest元素的吗

W3C的定义,如果您不知道其语法的话

这里有一个jFiddle实现了

这是一个错误还是我遗漏了什么?如果是一个bug,请推荐我如何向Angular团队提交bug


谢谢。

已更新

不是AngularJS虫。有关所有这些的更新,请参见问题之首



好的,多亏了@PSL(参见对问题的评论),我意识到这是一种已知的具有角度的行为。我看不出容忍这种行为的正当理由。我认为Angular应该解决这个问题,并在github中留下评论告诉他们。我在这里留下这个答案,以防其他人被这个问题绊倒,尽管我拒绝将其标记为已接受,因为我不接受这是正确行为的前提。希望将来的某个版本能够解决这个问题,有人可以在这里添加一个可以接受的正确答案。

与以前的版本不同,HTML5有一套非常严格的规则来解析源代码和创建DOM。将这种行为称为bug是错误的。说

当启动标记令牌在设置了自动关闭标志的情况下发出时,如果在树构造阶段处理该标志时未确认该标志,则这是一个解析错误

对于像
input
这样的标记,它会显式地声明

确认令牌的自动关闭标志(如果已设置)

对于未知标记(称为“任何其他”),解析器不应确认标志。所以浏览器是正确的,Angular是无辜的,我们不能使用自定义的自动关闭标记。如果这种行为是可取的,那就另当别论了

顺便说一句:我喜欢解析器必须如何处理
sarcasm
tag;)

标签名为“sarcasm”的结束标签:深呼吸,然后按照下面“any other end tag”(任何其他结束标签)条目中的描述进行操作


这是众所周知的行为。。我认为您不能强制自定义空元素成为空元素(即始终为空)。@PSL,谢谢您的指针。这很有帮助。我对这个链接发表了评论。虽然它不是一个bug,但我认为这是一个错误(它是一个bug),并且已经清楚地表明了这一点。@BoltClock,实际上,我并不是要强迫它只是一个空元素(相对于开始和结束标记)。仅要求void元素在处理时不使用其同级元素。显然,这种行为是一个已知的问题,建议在自定义指令中使用空格元素。嗨,安得烈,很高兴你在这里找到一些关闭,尽管你仍然认为这是一个角度问题。基于阅读上面由PSL链接的讨论,尽管这似乎是web浏览器中HTML解析器的问题,而不是angular本身的问题。问题是浏览器将在angular有机会通过它来平滑类似的事情之前解释/解析HTML。所以我认为他们关闭了这个bug,因为它不能在Angular或任何其他JS框架中修复,而是一个浏览器bug。@shaunhusain,谢谢。这就是我需要的解释(或显然无法理解)。我创建了另一个jsFiddle()来演示没有js或angular的问题。我被纠正了,但特别恼火(现在是浏览器)。几十年前,我研究过SGML和XML。Void控件的行为不应与浏览器构建控件的方式相同。可能是早期浏览器中的一些糟糕的实现,这些实现一直贯穿于所有内容。我也会在github上更新我的评论。Blech.你应该更新你的答案,因为它不准确,并将责任推给angular而不是Browser更新的问题,以反映angular或HTML浏览器中没有错误。感谢指向HTML规范的指针。我找不到规范中任何地方是如何处理“确认”的,尽管可能我没有深入挖掘。但是,SO问题(此问题更新部分中的链接)拉取了VOID元素、SELF-CLOSING元素并确认。
angular.module('myApp', [])
    .controller('mainController', function ($scope) {
        $scope.message = 'a msg';
    })
    .directive('voidtagtest', function () {
        return {
            restrict: 'E'
        };
    });
    ...
    <div>
        <voidtagtest>
            <p>Example 2 - becomes innerHTML</p>
            <p>this one, too.</p>
        </voidtagtest>
    </div>
    ...