Удалить содержимое элемента, исключая определенные имена / типы узлов

Идея в том, что я хочу удалить содержимое элемента, исключая элементы скрипта, которые используются в качестве шаблонов Handlebarjs.

Приведенный ниже пример полностью работает, но мне интересно, есть ли лучший подход, чем у меня сейчас? Использование.remove() или.empty(), как я сделал в примере, не удаляет узлы TEXT. Даже изменение детей () => find() тоже не работает.

Пример: http://jsfiddle.net/076w8zdm/

// HTML
<div id="content">

<!--This Handlebars template should remain-->
<script type="text/x-handlebars-template">
    <p>{{title}}, {{first_name}}, {{last_name}}</p>
</script>

This text node should be deleted.
<p>This element should be removed too.</p>
</div>
<!--Handlebars template example-->

// JS

// IIFE
; (function ($, undefined) {

console.log('Started');

// Cache the jQuery object
var $content = $('#content');

// Remove the contents of the div#content, but retain the Handlebars template

// $content.empty(); // <<<< Bad, as it removes everything

// These don't work, as the TEXT node isn't removed
// $content.children('*:not(script)').empty()
// $content.children('*:not(script)').remove();

// This works!
$content.contents().filter(function () {
    console.log(this.nodeName);
    // Only filter those which don't have the handlebars type and SCRIPT node name
    return this.nodeName !== 'SCRIPT' || this.type !== 'text/x-handlebars-template';

    // Remove from the DOM
}).remove();

console.log('Finished');

})(jQuery);

1 ответ

Решение

Я думаю, это все, что вам нужно:

$('#content').html($('#content script'));

Удаляет все, кроме содержимого скрипта.

$('#content').html($('#content script'));
console.log($('#content').html());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="content">
    
    <script type="text/x-handlebars-template">
        <p>{{title}}, {{first_name}}, {{last_name}}</p>
    </script>
    
    This text node should be deleted.
    <p>This element should be removed too.</p>

    <script type="text/x-handlebars-template">
      <p>{{more handebars stuff}}</p>
    </script>

    <p>Another element to remove.</p>    
</div>

Другие вопросы по тегам