Javascript Firefox清空克隆上的documentFragment

Javascript Firefox清空克隆上的documentFragment,javascript,firefox,documentfragment,mithril.js,Javascript,Firefox,Documentfragment,Mithril.js,我发现了这样一个奇怪的场景,Firefox在克隆documentFragment后似乎丢失了它的内容(deep标志设置为true)。这是一个Firefox错误,还是我遗漏了一个实现细节 var n=(函数nScope(){ "严格使用",; 函数isDom(x){ 返回x.nodeType>0; } 函数notDom(x){ 返回!isDom(x); } 返回函数n(){ //通过强制标准输出避免以后的条件逻辑。 var args=[].map.call(参数,函数wrapDom(x){ 返回

我发现了这样一个奇怪的场景,Firefox在克隆documentFragment后似乎丢失了它的内容(deep标志设置为
true
)。这是一个Firefox错误,还是我遗漏了一个实现细节

var n=(函数nScope(){
"严格使用",;
函数isDom(x){
返回x.nodeType>0;
}
函数notDom(x){
返回!isDom(x);
}
返回函数n(){
//通过强制标准输出避免以后的条件逻辑。
var args=[].map.call(参数,函数wrapDom(x){
返回isDom(x)?[x]:x;
} );
var dom=[];
var-vdom=[];
//呈现虚拟DOM,然后解析输出。
变量视图=m.apply(无效0,参数);
var cfg=view.attrs.config;
if(view.children.forEach){
view.children.forEach(函数divideChildren(x){
(isDom(x)?dom:vdom).push(x);
} );
}
if(dom.length==0){
返回视图;
}
view.attrs.config=函数appendDom(el、init、context){
//仅在配置时执行DOM插入逻辑:
//在策略无重绘期间保存不必要的执行。
if(!init){
forEach(函数appendNode(节点,索引){
//如果虚拟DOM元素出现在子列表中的真实节点之后,则抓取它并找到它的
//虚拟元素列表中的索引,作为插入真实节点的参考点。
var insertAt=vdom.indexOf(view.children.slice(view.children.indexOf(node)).filter(notDom)[0]);
//将documentFragment插入文档时,引用将变为空。
//因此,我们需要插入原始引用的克隆。
//因为每次重画时都会发生这种情况,这意味着DOM节点不能通过先前的引用进行修改
//在重新绘制周期之间:(
log('原始节点:',节点);
var clone=node.cloneNode(true);
log('克隆节点:',克隆);
如果(插入){
el.insertBefore(克隆,el.childNodes[insertAt]);
}
否则{
el.appendChild(克隆);
}
} );
}
如果(cfg){
返回cfg(el、init、context);
}
};
//确保m.render只解析虚拟元素。
view.children=vdom;
返回视图;
};
}() );
//停止断桥
m、 route.mode='hash';
var links=document.createDocumentFragment();
var数组=[1,2];
forEach(函数appendLink(索引){
var a=document.createElement('a');
a、 innerText='页面'+索引;
a、 href='/route'+索引;
m、 路线(a);
链接。附加儿童(a);
links.appendChild(document.createTextNode(“”));
} );
var modules=array.map(函数makeModule(索引){
返回{
控制器:函数(){},
视图:函数(){
返回n(
“.module”,
[
n(‘h1’{
onclick:function(){
警报(‘重新绘制传入…’);
}
},第页+索引),
链接
]
);
}
};
} );
m、 路线(document.body,“/route1”{
“/route1”:模块[0],
“/route2”:模块[1]
});

您正在使用Firefox不支持的innerText:

您可以改用textContent或innerHTML

array.forEach( function appendLink( index ){
    var a  = document.createElement( 'a' );

    a.textContent = 'Page ' + index; // <-- here
    a.href      = '/route' + index;

    m.route( a );

    links.appendChild( a );
    links.appendChild( document.createTextNode( ' ' ) );
} );
array.forEach(函数appendLink(索引){
var a=document.createElement('a');

a、 textContent='Page'+index;//仍然不明白为什么克隆的片段被记录为没有子节点,但这似乎是正交的。谢谢!当您将片段附加到元素时,它的子节点被转移到元素,因此如果您控制台.log(clone)渲染发生后,您将看到一个空列表。您可以使用console.log(clone.childNodes)查看传输过来的NodeListCollection。真正令人惊讶的是,控制台没有立即评估其输入:
clone.childNodes
也是空的,因为它是在事实之后评估的动态引用。
clone.childNodes.length
,作为原语传递的值是
4
。不能在下面了解控制台决定如何异步计算输入…