循环访问多个元素并为每个元素添加一个包装器
Looping on multiple elements and add a wrapper to each of them
在等待人们来过圣诞节时,我尝试用香草JS启动一个类似floatlabel的库。我被困在我在输入周围添加包装器的部分
var materialFloatLabel = function(o) {
o = (typeof o === 'undefined') ? '' : o;
var lib = {
// Just for the futur settings
settings: {
selector: o.selector ? o.selector : '.matFloat'
},
// Getting the inputs
inputs: function() {
return document.querySelectorAll(this.settings.selector);
},
// Adding a specific class to each input so it can easily be selected later
addWrapper: function() {
for(var i = 0; i < this.inputs().length; i++) {
this.inputs()[i].className = this.inputs()[i].className + ' materialFloatLabel' + i;
var wrapper = document.createElement('div');
wrapper.appendChild(this.inputs()[i]);
// ERROR DOWN HERE
document.querySelectorAll('.materialFloatLabel' + i).parentNode.replaceChild(wrapper, document.querySelectorAll('.materialFloatLabel' + i));
}
},
init: function() {
this.addWrapper();
}
};
return lib.init();
};
(function() {
materialFloatLabel();
})();
我目前遇到的错误是Uncaught TypeError: Cannot read property 'replaceChild' of undefined
而且我无法通过它。知道吗?
这是一个小提琴来实时检查它
您需要使用:
document.querySelectorAll('.materialFloatLabel' + i)[0]
即使只返回一个元素。
根据MDN规范:
elementList = document.querySelectorAll(selectors);
// elementList is a non-live NodeList of element objects.
NodeList
是一些类似数组的对象。
在代码中:
for(var i = 0; i < this.inputs().length; i++) {
this.inputs()[i].className = this.inputs()[i].className + ' materialFloatLabel' + i;
// Create a Node, which is NOT on DOM yet.
var wrapper = document.createElement('div');
// MOVE the input to the new Node, so the input is not on DOM anymore!
wrapper.appendChild(this.inputs()[i]);
// Since the input is not on DOM, querySelectorAll('.materialFloatLabel' + i) returns []
document.querySelectorAll('.materialFloatLabel' + i)[0].parentNode.replaceChild(wrapper, document.querySelectorAll('.materialFloatLabel' + i)[0]);
}
添加新类后无法查询输入,因为输入不再在 DOM 上。请注意,appendChild
会将节点移动到新位置(MDN 规范)。由于您要将输入移动到 wrapper
上,这还没有在 DOM 上,因此您的querySelectorAll
返回为空。
以及更多
不要每次都执行this.input()
,因为你的 DOM 正在发生变化。如果你不小心,你的循环可能会变得一团糟。由于querySelectorAll
的结果不是实时的,因此您可以保持选择结果的一致性。
更重要的是,为了获得更好的性能,最好将中间结果存储在一些变量中。
下面是一个工作示例:http://jsfiddle.net/18fxv7yr/1/
相关文章:
- 使用clickToggle并在单击另一个元素时关闭元素
- 表追加而不附加最后一个元素
- 滚动到容器中的下一个元素-几乎到了
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 使用CSS或js,使用动态选择器选择任意li的下一个元素
- 按我自己的类克隆另一个元素的内容和顺序
- Javascript获取上一个元素的内容
- 如何通过HTML+CSS中的另一个元素Selector更改元素的属性值
- 在数组中的一个元素上设置多个值
- 指令的模板必须只有一个根元素:With restrict E&替换true
- HTML JavaScript,我如何能够通过给每个元素一个不同的Id来使用JavaScript使这个函数工作
- 如何创建一个独立的 DOM 元素?一个不从父母那里继承 css 等
- 如何给图像元素一个“;选择“;使用Raphael.js查看
- 如何显示隐藏的
- 元素一个接一个或全部同时
- 使用"span"创建一个自定义的基于web的文本编辑器;元素——一个坏主意
- 引导旋转木马传递元素一个接一个
- 给所有元素一个匹配数组内容的ID
- 我如何得到Json数组元素一个接一个的jquery上不同的id'
- 一次淡入附加元素一个
- 如何使用AngularJS检索外部网站的内容(一个元素一个元素)