我更改了您的 HTML 以使其更易于测试。
<div>
<input attribute="x" />
<input attribute="x" />
<p>divider</p>
<input attribute="y" />
<input attribute="z" />
</div>
假设您希望将所有此类元素放在一个容器中,并将其放置在找到第一个容器的位置,您可以执行此操作。
// invoked like this
wrapAll('input[attribute=x]', 'span');
// implemented like this
function wrapAll(selector, wrapper) {
if (typeof wrapper === 'string')
wrapper = document.createElement(wrapper);
else if (!wrapper || !wrapper.nodeType)
throw "Illegal 'wrapper' argument."
var els = document.querySelectorAll(selector);
els[0].parentNode.insertBefore(wrapper, els[0]);
for(var i = 0, len = els.length; i < len; i++)
wrapper.appendChild(els[i]);
}
http://jsfiddle.net/5z2uA/4/
如果您希望将不同的连续组包装在一起,您可以这样做。
// invoked like this
wrapAdjacent('input[attribute=x]', 'span');
// implemented like this
function wrapAdjacent(selector, wrapper) {
if (typeof wrapper === 'string')
wrapper = document.createElement(wrapper);
else if (!wrapper || !wrapper.nodeType)
throw "Illegal 'wrapper' argument."
var els = document.querySelectorAll(selector);
for (var i = 0, len = els.length; i < len; ) {
var this_wrapper = wrapper.cloneNode(false);
els[i].parentNode.insertBefore(this_wrapper, els[i]);
do {
this_wrapper.appendChild(els[i]);
i++;
}
while (nextEl(this_wrapper) === els[i])
}
}
function nextEl(el) {
while (el && (el = el.nextSibling) && el.nodeType !== 1) {}
return el;
}
http://jsfiddle.net/5z2uA/5/