jQuery.html () заменяет символ на имя объекта html [duplicate]

Конечно, есть много таких подходов, как синхронный запрос, обещание, но из моего опыта я думаю, что вы должны использовать подход обратного вызова. Естественно, что асинхронное поведение Javascript. Итак, ваш фрагмент кода можно переписать немного иначе:

function foo() {
    var result;

    $.ajax({
        url: '...',
        success: function(response) {
            myCallback(response);
        }
    });

    return result;
}

function myCallback(response) {
    // Does something.
}
305
задан Mark Amery 10 July 2015 в 19:56
поделиться

13 ответов

Без jQuery:

function decodeEntities(encodedString) {
    var textArea = document.createElement('textarea');
    textArea.innerHTML = encodedString;
    return textArea.value;
}

console.log(decodeEntities('1 & 2')); // '1 & 2'

Это работает так же, как принятый ответ , но безопасен для использования с ненадежным пользовательским вводом.


Проблемы безопасности в аналогичных подходах

Поскольку , отмеченный Майком Самуэлем , выполнение этого с помощью <div> вместо <textarea> с ненадежным вводом пользователя является уязвимостью XSS, даже если <div> никогда не добавляется в DOM:

function decodeEntities(encodedString) {
    var div = document.createElement('div');
    div.innerHTML = encodedString;
    return div.textContent;
}

// Shows an alert
decodeEntities('<img src="nonexistent_image" onerror="alert(1337)">')

Однако эта атака невозможна против <textarea>, потому что нет элементов HTML, которые разрешены для содержимого <textarea> . Следовательно, любые HTML-теги, все еще присутствующие в «закодированной» строке, будут автоматически закодированы сущностью в браузере.

function decodeEntities(encodedString) {
    var textArea = document.createElement('textarea');
    textArea.innerHTML = encodedString;
    return textArea.value;
}

// Safe, and returns the correct answer
console.log(decodeEntities('<img src="nonexistent_image" onerror="alert(1337)">'))

Выполнение этого с использованием jQuery .html() и .val() вместо использования .innerHTML и .value также небезопасны * для некоторых версий jQuery, даже при использовании textarea , Это связано с тем, что более старые версии jQuery преднамеренно и явно оценивали скрипты , содержащиеся в строке, переданной в .html(). Следовательно, такой код показывает предупреждение в jQuery 1.8:

// Shows alert
$('<textarea>').html('<script>alert(1337)</script>').text()

* Благодаря Эру Пенкман для обнаружения этой уязвимости.

175
ответ дан Community 25 August 2018 в 17:22
поделиться

Я думаю, вы смешиваете текст и методы HTML. Посмотрите на этот пример, если вы используете внутренний HTML-код элемента как текст, вы получите декодированные HTML-теги (вторая кнопка). Но если вы используете их как HTML, вы получите представление в формате HTML (первая кнопка).

<div id="myDiv">
    here is a <b>HTML</b> content.
</div>
<br />
<input value="Write as HTML" type="button" onclick="javascript:$('#resultDiv').html($('#myDiv').html());" />
&nbsp;&nbsp;
<input value="Write as Text" type="button" onclick="javascript:$('#resultDiv').text($('#myDiv').html());" />
<br /><br />
<div id="resultDiv">
    Results here !
</div>

Первая кнопка пишет: вот HTML-контент.

Вторая кнопка пишет: вот содержимое & lt; B> HTML & lt; / B>.

Кстати, вы можете увидеть плагин, который я нашел в плагине jQuery - HTML-декодирование и кодирование , который кодирует и декодирует строки HTML.

28
ответ дан Peter Mortensen 25 August 2018 в 17:22
поделиться

Вопрос ограничен «с помощью jQuery», но он может помочь некоторым узнать, что код jQuery, приведенный в лучшем ответе, здесь ниже: это работает с jQuery или без него:

function decodeEntities(input) {
  var y = document.createElement('textarea');
  y.innerHTML = input;
  return y.value;
}
26
ответ дан Rondo 25 August 2018 в 17:22
поделиться

Вы должны создать пользовательскую функцию для html-объектов:

function htmlEntities(str) {
return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g,'&gt;').replace(/"/g, '&quot;');
}
1
ответ дан Ali 25 August 2018 в 17:22
поделиться
0
ответ дан Andaeiii 25 August 2018 в 17:22
поделиться

Чтобы декодировать HTML-объекты с помощью jQuery, просто используйте эту функцию:

function html_entity_decode(txt){
    var randomID = Math.floor((Math.random()*100000)+1);
    $('body').append('<div id="random'+randomID+'"></div>');
    $('#random'+randomID).html(txt);
    var entity_decoded = $('#random'+randomID).html();
    $('#random'+randomID).remove();
    return entity_decoded;
}

Как использовать:

Javascript:

var txtEncoded = "&aacute; &eacute; &iacute; &oacute; &uacute;";
$('#some-id').val(html_entity_decode(txtEncoded));

HTML:

<input id="some-id" type="text" />
-3
ответ дан Fred 25 August 2018 в 17:22
поделиться

Самый простой способ - установить селектор класса для ваших элементов, а затем использовать следующий код:

$(function(){
    $('.classSelector').each(function(a, b){
        $(b).html($(b).text());
    });
});

Больше ничего не нужно!

У меня была эта проблема, и я нашел это ясное решение, и он отлично работает.

-2
ответ дан Hamidreza 25 August 2018 в 17:22
поделиться

Вот еще одна проблема: escape-строка не выглядит читаемой при назначении входного значения

var string = _.escape("<img src=fake onerror=alert('boo!')>");
$('input').val(string);

Exapmle: https://jsfiddle.net/kjpdwmqa/3/

0
ответ дан Lauris Kuznecovs 25 August 2018 в 17:22
поделиться

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

var decoded = $("<div/>").text(encodedStr).html();
-3
ответ дан meagar 25 August 2018 в 17:22
поделиться

Расширить класс String:

String::decode = ->
  $('<textarea />').html(this).text()

и использовать как метод:

"&lt;img src='myimage.jpg'&gt;".decode()
13
ответ дан Muhammed 25 August 2018 в 17:22
поделиться

Предположим, что у вас есть ниже String.

Наши каюты Deluxe являются теплыми, уютными и amp; удобный

var str = $("p").text(); // get the text from <p> tag
$('p').html(str).text();  // Now,decode html entities in your variable i.e 

str и назначить обратно тегу

.

вот оно.

0
ответ дан Nikola 25 August 2018 в 17:22
поделиться

В качестве значения для кнопки HTML я просто должен был использовать charater (& dArr;) для HTML. Код HTML хорошо выглядит с самого начала в браузере:

<input type="button" value="Embed & Share  &dArr;" id="share_button" />

Теперь я добавляю переключатель, который также должен отображать charater. Это мое решение

$("#share_button").toggle(
    function(){
        $("#share").slideDown();
        $(this).attr("value", "Embed & Share " + $("<div>").html("&uArr;").text());
    }

Это отображает & dArr; снова в кнопке. Надеюсь, это может помочь кому-то.

4
ответ дан Peter Mortensen 25 August 2018 в 17:22
поделиться

Для пользователей ExtJS, если у вас уже есть закодированная строка, например, когда возвращаемое значение библиотечной функции является содержимым innerHTML, рассмотрите эту функцию ExtJS:

Ext.util.Format.htmlDecode(innerHtmlContent)
0
ответ дан whoan 25 August 2018 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: