Я написал некоторый код, который берет строку html и удаляет из нее любой уродливый HTML, используя jQuery (см. Ранний прототип в этом вопросе ).Это работает довольно хорошо, но я наткнулся на проблему:
При использовании .append () для переноса html в div все элементы сценария в коде оцениваются и запускаются (см. этот ответ SO для объяснения, почему это происходит).Я не хочу этого, я просто хочу, чтобы они были удалены, но я могу справиться с этим позже, если они не будут запущены.
Я использую этот код:
var wrapper = $('<div/>').append($(html));
Вместо этого я попытался сделать это следующим образом:
var wrapper = $('<div>' + html + '</div>');
Но это просто вызывает ошибку «Отказано в доступе» в IE, которую исправляет функция append () (см. Ответ, на который я ссылался выше).
Я думаю, что я мог бы переписать свой код, чтобы не требовать обертки вокруг HTML, но я не уверен, и я хотел бы знать, возможно ли добавить HTML без запуска сценариев в нем,в любом случае.
Мои вопросы:
Как мне обернуть кусок неизвестного html, не запуская в нем скрипты, желательно полностью их удалив?
Должен ли я выбросить jQuery из окна и сделать это с помощью простых манипуляций с JavaScript и DOM?Поможет ли это?
Что я не пытаюсь сделать:
Я не пытаюсь создать какой-то уровень безопасности на стороне клиента.Я очень хорошо понимаю, что это было бы бессмысленно.
Обновление: предложение Джеймса
Джеймс предложил мне отфильтровать элементы сценария, но посмотрите на эти два примера (сначала оригинал ипредложение Джеймса):
jQuery("<p/>").append("<br/>hello<script type='text/javascript'>console.log('gnu!'); </script>there")
сохраняет текстовые узлы, но пишет gnu!
jQuery("<p/>").append(jQuery("<br/>hello<script type='text/javascript'>console.log('gnu!'); </script>there").not('script'))`
Не пишет gnu !, но также теряет текстовые узлы.
Обновление 2:
Джеймс обновил свой ответ, и я принял его.Смотрите мой последний комментарий к его ответу.