Я использую JavaScript, чтобы извлечь значение из скрытого поля и отобразить его в текстовом поле. Значение в скрытом поле кодируется.
Например,
<input id='hiddenId' type='hidden' value='chalk & cheese' />
втягивается в
<input type='text' value='chalk & cheese' />
через некоторый jQuery, чтобы получить значение из скрытого поля (именно в этот момент я теряю кодировку):
$('#hiddenId').attr('value')
Проблема в том, что когда я читаю chalk & cheese
из скрытого поля, JavaScript, похоже, теряет кодировку. Я не хочу, чтобы значение было chalk & cheese
. Я хочу буквальныйamp;
был сохранен.
Есть ли библиотека JavaScript или метод jQuery, который будет кодировать строку в HTML?
chalk
иcheese
когда-либо использовались вместе 0_oОтветы:
РЕДАКТИРОВАТЬ: Этот ответ был опубликован давно, и
htmlDecode
функция представила уязвимость XSS. Он был изменен, изменив временный элемент с adiv
наtextarea
уменьшение вероятности XSS. Но в настоящее время я бы рекомендовал вам использовать API DOMParser, как это предлагается в других ответах .Я использую эти функции:
В основном элемент textarea создается в памяти, но он никогда не добавляется к документу.
В
htmlEncode
функции я устанавливаюinnerText
элемент и извлекаю закодированныйinnerHTML
; наhtmlDecode
функции я устанавливаюinnerHTML
значение элемента иinnerText
получаю.Проверьте работающий пример здесь .
источник
white-space
свойство, которое подсказывает, как должны обрабатываться пробелы в контенте HTML. Наличие свойства подразумевает, что «это предварительно отформатировано, пробелы и разрывы строк должны быть сохранены». Это нарушает разделение стиля и содержимого, потому что если вы пытаетесь переформатировать HTML-код, чтобы он был «красивым», или вы совершаете обходной цикл через цикл кодирования / декодирования, как это, то количество пробелов / разрывов сокращается, и кодер не имеет способ узнать, нормально ли это сделать, потому что он не знает обwhite-space:pre-*;
индикаторе во внешнем файле CSS!Уловка jQuery не кодирует кавычки, а в IE она лишит вас пробелов.
Основываясь на теге escape- шаблона в Django, который, я думаю, уже интенсивно используется / проверен, я сделал эту функцию, которая делает то, что нужно.
Это, возможно, проще (и, возможно, быстрее), чем любой из обходных путей для устранения пробелов - и он кодирует кавычки, что важно, если вы собираетесь использовать результат, например, внутри значения атрибута.
Обновление 2013-06-17:
В поисках самого быстрого выхода я обнаружил эту реализацию
replaceAll
метода:http://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(также упоминается здесь: Самый быстрый способ заменить все экземпляры символа в строке )
Некоторые результаты производительности здесь:
http://jsperf.com/htmlencoderegex/25
Это дает идентичную строку результата для встроенных
replace
цепочек выше. Я был бы очень рад, если бы кто-то мог объяснить, почему это быстрее !?Обновление 2015-03-04:
я только что заметил, что AngularJS использует именно тот метод, что указан выше:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
Они добавляют пару уточнений - они, кажется, обрабатывают неясную проблему Unicode, а также преобразовывают все не алфавитно-цифровые символы в сущности. У меня сложилось впечатление, что последнее не нужно, если у вас есть кодировка UTF8, указанная для вашего документа.
Отмечу, что (4 года спустя) Джанго все еще не выполняет ни одну из этих вещей, поэтому я не уверен, насколько они важны:
https://github.com/django/django/blob/1.8b1/django/utils /html.py#L44
Обновление 2016-04-06:
Вы также можете избежать косой черты
/
. Это не требуется для правильного кодирования HTML, однако это рекомендуется OWASP в качестве меры безопасности против XSS. (спасибо @JNF за предложение об этом в комментариях)источник
'
вместо'
'
это недопустимая сущность HTML./g
,.replace()
заменит только первый матч.Вот не-jQuery-версия, которая значительно быстрее как jQuery-
.html()
версии, так и.replace()
версии. Это сохраняет все пробелы, но, как и версия jQuery, не обрабатывает кавычки.Скорость: http://jsperf.com/htmlencoderegex/17
Демо-версия:
Вывод:
Автор сценария:
HTML:
источник
.replace()
версия без регулярных выражений, недавно предложенная @SEoF, оказывается намного быстрее: jsperf.com/htmlencoderegex/22/g
,.replace()
только делает первый матч.replace('a', 'b', 'g')
то же самое, что иreplace(/a/g, 'b')
... скорость тоже одинаковаЯ знаю, что это старый, но я хотел опубликовать вариант принятого ответа, который будет работать в IE без удаления строк:
источник
Подчеркивание предоставляет
_.escape()
и_.unescape()
методы, которые делают это.источник
Хороший ответ. Обратите внимание, что если значение для кодирования -
undefined
илиnull
с jQuery 1.4.2, вы можете получить такие ошибки, как:jQuery("<div/>").text(value).html is not a function
ИЛИ
Uncaught TypeError: Object has no method 'html'
Решение состоит в том, чтобы изменить функцию, чтобы проверить фактическое значение:
источник
jQuery('<div/>').text(value || '').html()
value
сif
сохранением необходимости создания DIV на лету и получить его значение. Это может быть гораздо более производительным, если его частоhtmlEncode
вызывать, и если оно, скорее всего,value
будет пустым.Для тех, кто предпочитает простой javascript, вот метод, который я успешно использовал:
источник
FWIW, кодировка не теряется. Кодировка используется анализатором разметки (браузером) во время загрузки страницы. Как только источник прочитан и проанализирован, и браузер загрузил DOM в память, кодировка была проанализирована в том, что он представляет. Таким образом, к тому времени, когда ваш JS выполняется для чтения чего-либо в памяти, символ, который он получает, представляет собой то, что представляет кодировка.
Возможно, я здесь работаю строго по семантике, но я хотел, чтобы вы поняли цель кодирования. Слово «потерял» звучит так, как будто что-то не работает так, как должно.
источник
Быстрее без Jquery. Вы можете закодировать каждый символ в вашей строке:
Или просто нацеливайтесь на главных героев, о которых нужно беспокоиться (&, inebreaks, <,>, "и '), например:
источник
Прототип имеет встроенный класс String . Так что, если вы используете / планируете использовать Prototype, он делает что-то вроде:
источник
.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
Достаточно просто.Вот простое решение JavaScript. Он расширяет объект String методом «HTMLEncode», который можно использовать для объекта без параметра или с параметром.
Я сделал суть "Метод HTMLEncode для JavaScript" .
источник
Основано на санитарной обработке angular ... (синтаксис модуля es6)
источник
if (value === null | value === undefined) return '';
опечатки или фактически функцией? Если так, зачем использовать это, а не общее||
? Спасибо!!== null
?undefined
это единственное, с чем можно иметь эквивалентностьnull
, поэтому два тройных равенства в любом случае не нужныnull
и0
оба ложные, да, так что вы не можете просто сделать!value
, но весь смысл в==
том, чтобы сделать некоторые вещи проще.0 == null
ложноundefined == null
правда. Вы можете просто сделатьvalue == null
Насколько я знаю, в javascript нет прямого метода HTML Encode / Decode.
Однако, что вы можете сделать, это использовать JS для создания произвольного элемента, задать его внутренний текст, а затем прочитать его с помощью innerHTML.
Допустим, с jQuery это должно работать:
Или что-то в этом роде.
источник
Вам не нужно экранировать / кодировать значения, чтобы перемещать их из одного поля ввода в другое.
JS не вставляет необработанный HTML или что-либо еще; он просто указывает DOM установить
value
свойство (или атрибут; не уверен). В любом случае, DOM решает любые проблемы с кодированием для вас. Если вы не делаете что-то странное, как использованиеdocument.write
илиeval
, HTML-кодирование будет эффективно прозрачным.Если вы говорите о создании нового текстового поля для хранения результата ... это все еще так же просто. Просто передайте статическую часть HTML в jQuery, а затем установите остальные свойства / атрибуты для объекта, который он возвращает вам.
источник
У меня была похожая проблема, и я решил ее с помощью функции
encodeURIComponent
из JavaScript ( документация )Например, в вашем случае, если вы используете:
а также
вы получите
chalk%20%26%20cheese
. Даже места сохранены.В моем случае мне пришлось закодировать одну обратную косую черту, и этот код работает отлично
и я получил
name%2Fsurname
источник
Вот немного, который эмулирует
Server.HTMLEncode
функцию из ASP Microsoft, написанную на чистом JavaScript:Результат не кодирует апострофы, но кодирует другие специальные HTML и любые символы вне диапазона 0x20-0x7e.
источник
Моя функция чистого JS:
источник
Если вы хотите использовать jQuery. Я нашел это:
http://www.jquerysdk.com/api/jQuery.htmlspecialchars
(часть плагина jquery.string, предлагаемого jQuery SDK)
Я считаю, что проблема с прототипом заключается в том, что он расширяет базовые объекты в JavaScript и будет несовместим с любым jQuery, который вы, возможно, использовали. Конечно, если вы уже используете Prototype, а не jQuery, это не будет проблемой.
РЕДАКТИРОВАТЬ: Также есть это, который является портом строковых утилит Prototype для jQuery:
http://stilldesigning.com/dotstring/
источник
Это из исходного кода ExtJS.
источник
Будет выводить:
<script>alert("I hack your site")</script>
.htmlEncode () будет доступен для всех строк после определения.
источник
HtmlEncodes заданное значение
источник
Я столкнулся с некоторыми проблемами с обратной косой чертой в строке «Домен \ Пользователь».
Я добавил это к другим побегам от ответа Anentropic
Что я нашел здесь: Как избежать обратной косой черты в JavaScript?
источник
Выбор того, что
escapeHTML()
делает в prototype.jsДобавление этого скрипта поможет вам избежать HTML:
теперь вы можете вызывать метод escapeHTML для строк в вашем скрипте, например:
Надеюсь, что это поможет любому, кто ищет простое решение, без необходимости включать весь prototype.js
источник
Используя некоторые другие ответы здесь, я сделал версию, которая заменяет все соответствующие символы за один проход, независимо от количества различных закодированных символов (только один вызов
replace()
), поэтому будет быстрее для больших строк.Он не полагается на существование DOM API или других библиотек.
Запустив это один раз, теперь вы можете позвонить
Получить
<>&"'
источник
источник