Nano Hash - криптовалюты, майнинг, программирование

Экранирование кавычек в атрибуте данных HTML5 с использованием Javascript

Я использую jQuery .data() для работы с пользовательскими атрибутами данных HTML5, где значение атрибута должно содержать как одинарные, так и двойные кавычки:

<p class="example" data-example="She said "WTF" on last night's show.">

Я знаю, что использование кодов символов, таких как &quot;, в значении атрибута данных может заставить работать вышеописанное, но я не всегда могу контролировать, как вводятся значения. Кроме того, мне нужно иметь возможность использовать теги HTML в разметке, например:

<p class="example" data-example="
She said "<abbr title="What The F***">WTF</abbr>" on last night's show.
">

Если ответом является некоторая форма .replace(), то это нужно сделать до того, как значение будет прочитано .data(), возможно, применяя его ко всему <body>?

Обычная обратная косая черта, например <abbr title="te\'st">WTF</abbr>, тоже не работает.

В идеале это должно иметь гибкость для работы с обоими:

data-example="..." и data-example='...'

Но если это возможно только одним способом, то я мог бы, по крайней мере, согласиться с этим. Идеи?

Обновление – еще немного контекста:

Я работаю над этим для responsejs.com. Фактическое применение этого может состоять в том, чтобы загружать боковую панель только для браузеров выше определенной ширины (и обрабатывать это в браузере, а не в PHP). В случае WordPress, например, боковая панель может содержать виджеты, изображения и т. д. Кавычки внутри тегов PHP не являются проблемой, потому что они анализируются в HTML до того, как попадут в браузер. Пример:

<aside id="primary" class="sidebar" 

        data-oweb=' 

            <?php dynamic_sidebar( 'primary' ); ?>

        '
    >

    optional default markup for mobile and no-js browsers here

</aside>

  • JavaScript не поможет вам после рендеринга страницы исправить кавычки тега. Должен быть сделан на стороне сервера. 31.08.2011

Ответы:


1

Нет никакого способа обойти это, вы должны правильно экранировать значения, иначе HTML не может быть правильно проанализирован. Вы не можете использовать Javascript для исправления кода после его разбора, потому что тогда он уже дал сбой.

Ваш пример с правильной кодировкой HTML будет:

<p class="example" data-example="She said &quot;&lt;abbr title=&quot;What The F***&quot;&gt;WTF&lt;/abbr&gt;&quot; on last night's show.">

Вы не можете использовать обратную косую черту для экранирования символов, потому что это не код Javascript. Вы используете объекты HTML для экранирования символов в коде HTML.

Если вы не можете контролировать ввод данных, то вы облажались. Вам просто нужно найти способ взять его под контроль.

31.08.2011
  • Используйте htmlspecialchars() с ENT_QUOTES, чтобы напечатать его, например. <?php echo(htmlspecialchars($myValue,ENT_QUOTES)) ?> Для получения дополнительной информации: php.net/manual/en/function.htmlspecialchars.php 24.01.2016

  • 2

    Используйте encodeURI, чтобы избежать кавычек в вашем объекте JSON. Разберите строку с помощью decodeURI.

    var popup = document.getElementById('popup'),
        msgObj = JSON.parse(decodeURI(popup.dataset.message));
    
    console.log(msgObj);
    <a id="popup" href="#" data-message="%7B%22title%22:%22Print%22,%22message%22:%22Printing%20not%20yet%20implemented%22%7D" />

    06.03.2015

    3

    Если это должны быть строки HTML с " и ' и так далее, почему бы просто не сделать для них отдельные HTML-элементы: http://jsfiddle.net/N7XXu/.

    Например. HTML:

    <p class="example" data-which="1">a</p>
    
    <p class="example-data" data-which="1">She said "<abbr title="What The F***">WTF</abbr>" on last night's show.</p>
    

    в сочетании со следующим JavaScript:

    $('.example').each(function() {
        var correspondingElem = $('.example-data[data-which="'
                                  + $(this).data('which')
                                  + '"]');
        $(this).data('example', correspondingElem.html());
    });
    
    alert($('.example').data('example'));
    

    Конечно, скройте элементы .example-data.

    31.08.2011
  • Спасибо — это круто, но для чего мне это нужно, потому что он не будет летать. Я только что обновил вопрос, добавив еще немного контекста. 31.08.2011

  • 4

    Вот простой инструмент, который я создал, который вы можете использовать для кодирования html:

    Хитрость заключается в том, чтобы избежать его дважды.

    Я добавил дополнительную замену \n, чтобы сохранить многострочный текст, поскольку он отбрасывается функцией text().

    Кроме того, вам нужно избегать кавычек, чтобы сделать его безопасным для атрибута данных.

    <div id="esc"></div>
    <textarea id="escinput" placeholder="Enter text"></textarea>
    <script>
        $("#escinput").bind("change paste keyup", function(){
            $("#esc").text($(this).val().replace(/\n/g,'\\n'));
            $("#esc").text($("#esc").html().replace(/"/g, '&quot;'));
        });            
    </script>
    

    Это должно создать безопасную строку атрибута данных.

    Вы можете проверить это здесь: http://jsfiddle.net/SplicePHP/n6HFq/

    Чтобы декодировать его обратно в html, просто используйте:

    <script>
        var attr = $("#idOfElement").data('attribute');
        var decoded = $('<textarea/>').html(attr).val();
    </script>
    
    25.04.2014

    5

    Чтобы это был правильный html, вы должны избегать неприятных символов. Я бы избежал их с помощью объектов HTML. Это означает, что любой инструмент, используемый для ввода этой информации, должен будет хранить их должным образом, и/или инструмент, извлекающий их на серверной части, должен их избегать.

    Затем, если вы хотите использовать их в своем JS, вам придется запустить некоторые функции поиска и замены, чтобы преобразовать символы обратно в HTML и кавычки.

    Большинство серверных языков разработки имеют некоторую функциональность «htmlescape/unescape», так что это не должно быть сложно.

    Чтобы отключить его с помощью jQuery, вот что можно найти с помощью быстрого Google: http://www.naveen.com.au/javascript/jquery/encode-or-decode-html-entities-with-jquery/289

    31.08.2011
  • Там нужно заменить закодированные символы обратно - значение атрибута при доступе через js уже нормализовано обратно в обычный текст 31.08.2011

  • 6

    Поскольку я использую атрибут data для передачи некоторых данных вместе с элементом html из PHP в JavaScript, я просто использую base64_encode на бэкэнде, а затем на стороне клиента использую base64Decode(input) для возврата данных. Таким образом, я избегаю любой беглой оргии. Код JavasScript, который я использую, находится здесь http://www.webtoolkit.info/javascript_base64.html#.Wl3tl6jiZjE

    16.01.2018

    7

    Это немного сложно, но вы можете выбирать объекты dom с их атрибутами data, содержащими одинарные кавычки. Хитрость \\'

    <div id="text" data-message="Stanley Kubrick's Oranges">Hello</div>
    
    <script>
        var message = "Stanley Kubrick\\'s Oranges";
        $("#text[data-message='"+message+"']").fadeOut("slow");
    </script>
    

    Скрипка

    07.03.2017

    8

    Если вы используете Lodash, вы можете использовать _.escape() и _.unescape(). Он преобразует символы "&", "‹", ">", '"' и "'" в строке в соответствующие им объекты HTML.

    Ссылка: https://lodash.com/docs/#escape

    19.04.2020

    9

    Используйте метод btoa для установки данных и метод atob для их получения:

     $(document).data("test2",btoa('She said "<abbr title="What The F***">WTF<\/abbr>" on last nights show.">'))
    

    Или просто разыменуйте строку как переменную:

     var stringer = 'She said "<abbr title="What The F***">WTF<\/abbr>" on last nights show.">'
    
     $(document).data("test2",stringer);
    

    Ссылки

    28.08.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..