小编Pik*_*ass的帖子

克隆节点不等于原始节点(使用isEqualNode)

我正在管理Javascript中的名称列表.选中复选框后,您的姓名将显示在列表中.当你取消选中它时,它会被划掉.当您将框设置为不确定状态时,您的名称将被删除.

我已经在隐藏的div中获得了当前登录用户的名称.名称是具有样式属性的跨度.

我用isEqualNode检查名称是否已经在列表中.当页面加载时它在列表中,它工作正常:找到名称,因此当框选中状态更改时更新名称.

for(var i=0 ; i < bullet.childNodes.length ; i++) {
    var node = bullet.childNodes[i];
    if(node.className == 'crossed')
        node = node.firstChild;
    if(node.isEqualNode(document.getElementById('curUser').firstChild))
        break;
}
// if i < bullet.childNodes.length, then we found the user's name in the list
Run Code Online (Sandbox Code Playgroud)

当名称不在列表中时,我克隆了span.

var newName = document.getElementById('curUser').firstChild.cloneNode(true);
bullet.appendChild(newName);
Run Code Online (Sandbox Code Playgroud)

这在视觉上有效.

但我偶然发现了一些棘手的事情:newName.isEqualNode(document.getElementById('curUser').firstChild)是假的!因此,如果盒状态再次改变,则不会找到新添加的名称,并且将再次创建新名称.

这是跨度的样子:

<span style="font-weight: bold ; color: #003380 ;">Pikrass</span>
Run Code Online (Sandbox Code Playgroud)

目前我只是简单地检查一下(我可以只检查跨度内的文本数据而不是依赖于isEqualNode),但我感兴趣的是为什么克隆节点可能与原始节点不同,根据isEqualNode.

相关规范:cloneNode,isEqualNode


编辑:我测试了Firefox和Chromium.使用Firefox isEqualNode返回false,但使用Chromium它返回true.感谢Felix指出这一点.

html javascript dom

11
推荐指数
1
解决办法
1592
查看次数

返回列表子集的最佳方法是什么?

我有一份任务清单.任务由名称,截止日期(和时间)和持续时间定义.

我的TaskManager类处理std::list<Task>按截止日期排序.它必须提供在特定日期完成任务的方法.

例如:我的任务1应于周一上午6点到期,任务2应于周一上午9点​​到期,任务3应于周二下午7点到期.如果我将"Monday"传递给我的方法,它应该返回任务1和2.

你会如何实现?

我认为(从API的角度来看)一个好方法是提供一std::list<Task>::iterator对.所以我会有一个TaskManager::begin(date)方法.你认为这个方法应该通过从列表的开头迭代直到它找到该日期的第一个任务,或者通过从a获取它来获得迭代器std::map<date, std::list<Task>::iterator>(但是在添加时,我们必须保持它是最新的)删除任务)?

然后,我该如何实现该TaskManager::end(date)方法?

c++ algorithm

0
推荐指数
1
解决办法
466
查看次数

标签 统计

algorithm ×1

c++ ×1

dom ×1

html ×1

javascript ×1