为什么使用自定义标签创建元素会在IE9或10中的outerHTML中添加xml命名空间,直到调用.find()方法为止?

qua*_*els 10 javascript jquery internet-explorer dom

我有一个jsfiddle,演示了这个问题:

http://jsfiddle.net/H6gML/8/

$(document).ready(function() {

    // this seems fine in IE9 and 10
    var $div = $("<div>");
    console.log("In IE, this <div> is just fine: " + $div[0].outerHTML);

    // this is weird in IE
    var $test = $("<test>");    
    console.log("However, this <test> has an xml tag prepended: \n" 
                + $test[0].outerHTML);    
    $test.find("test");    
    console.log("Now, it does not: \n" + $test[0].outerHTML);    
    console.log("Why does this behave this way?");
});
Run Code Online (Sandbox Code Playgroud)

为什么会这样?它不会发生在Chrome或Firefox中.有没有更好的方法来解决这个问题,而不是调用.find("test")对象?

编辑

为了澄清,我不是在问为什么添加xml标签,而是,我想知道为什么.find()调用可以摆脱它.这对我来说没有意义.

PSL*_*PSL 6

为什么会这样?它不会发生在Chrome或Firefox中.有没有更好的方法来解决这个问题,而不是在对象上调用.find("test")

document.createElement在使用未知的html元素类型时,IE导致问题.它认为它是一个XML节点并添加了前缀的xml命名空间<?XML:NAMESPACE PREFIX = PUBLIC NS = "URN:COMPONENT" />.相反,如果你试图明确提到它是一个html元素,这个问题就不会发生.

尝试:

 var $test = $("<html><test/></html>");
Run Code Online (Sandbox Code Playgroud)

问题不再发生.

为了澄清,我不是在问为什么添加xml标签,而是,我想知道为什么.find()调用可以摆脱它.这对我来说没有意义.

现在,当你进行查找时,jquery在内部使用context.getElementsByTagName或(类似于基于类型,无论是类,标签还是id等),这意味着它对元素执行此操作test.所以在IE中,当你这样做时,它可能在内部解决了你试图对html元素而不是xml元素执行操作的事实,它改变了底层上下文的文档类型(但我不知道它为什么会改变父上下文,而不是只返回一个匹配).你也可以通过这个简单的例子来看看.

var $test = document.createElement("test");    
console.log("However, this <test> has an xml tag prepended: \n" 
            + $test.outerHTML);  
$test.getElementsByTagName("test");
console.log("Now, it does not: \n" + $test.outerHTML); 
Run Code Online (Sandbox Code Playgroud)

演示

更新

这是一种定义自定义元素文档化方法

自定义元素类型标识自定义元素接口,并且是必须与NCName生成匹配且包含U + 002D HYPHEN-MINUS字符的字符序列.自定义元素类型不能是以下值之一: annotation-xml,color-profile,font-face,font-face-src,font-face-uri,font-face-format,font-face-name,missing -glyph

所以根据这个你的标签名称是somename-testex: - custom-testIE识别它并且它按预期工作.

演示