Only the jQuery .contents() method returns all nodes (including text nodes that are usually ignored).
So maybe something like this ?:
http://jsfiddle.net/ykv3gf5L/2/
$('.content').each(function () { var open = false; var result = $(); $(this).contents().each(function () { var $this = $(this); if ($this.text() == "spoiler") { if (open) { result.wrapAll('<div style="border:solid 1px black;"></div>'); open = false; } else { result = $(); open = true; } } else { result = result.add($this) } }); if (open) { result.wrapAll('<div style="border:solid 1px black;"></div>'); } });
It simply iterates over all the nodes and, based on the flag, starts a new collection or wraps the found nodes.
The final if (open) resolves the unclosed argument block in the content classed div.
Notes:
$() is an empty jQuery collection (e.g. an empty array, but for jQuery objects)- I suggest you use a style for your spoilers and use a class, for example.
result.wrapAll('<div class="spoiler"></div>');
eg. http://jsfiddle.net/ykv3gf5L/3/
source share