Использование строкового преобразования объекта JSON для использования в атрибуте данных HTML

Я просматривал различные сообщения на stringify, но не смог найти решения своей проблемы.

Я пытаюсь преобразовать объект JSON в строку и вставить его в атрибут данных нового элемента в DOM.

В приведенном ниже примере, если элемент проверяется с помощью Chrome, а затем выбран вариант редактирования HTML, результат будет выглядеть следующим образом:

<div class = "ui-menu-item" data-menu-item = "{" title":"this = "" is = "" a = "" test = "" for = "" \" = "" and = "" '. = "" it = "" fails.","url":"some = "" url"}" = "" id = "test">This element contains the data.</div>

Я думаю, что требуемый результат должен выглядеть так:

<div class = "ui-menu-item" data-menu-item = "{&quot;title&quot;:&quot;this is a test for &quot; and ' it fails.&quot;,&quot;url&quot;:&quot;some url&quot;}" id = "test">This element contains the data.</div>

Примечание. Я знаю, что могу использовать метод данных jQuery, но предпочитаю этого не делать.

  var data = {
    title: 'This is a test for " and \'. It fails.',
	  url: 'Some url'
  };

  data = JSON.stringify(data);

  console.info (data);

$(document).ready(function() {
  var tpl = "<div class=\"ui-menu-item\" data-menu-item=\"" + data + "\" id=\"test\">This element contains the data.</div>";
  
  $('body').append(tpl);
});
<html>
<head>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</head>
<body>
</body>
</html>

привет Аса, ты пробовал jQuery.data ()? он отлично работает в этих ситуациях. если у вас есть jquery, используйте его.

Neo Anderson 11.11.2018 15:19

@NeoAnderson привет, как я уже упоминал в посте, я знаю об этом, но я бы предпочел оставить это в атрибуте. Атрибуты существуют на существующих элементах, созданных на стороне сервера, и я просто хочу, чтобы все было согласовано.

Asa Carter 11.11.2018 15:22

Вы можете создать <div>, а затем использовать setAttribute() для установки значения в строку JSON.

Pointy 11.11.2018 15:25

Кажется, вам может потребоваться написать собственную формулу string.replace, чтобы избавиться от двойных кавычек или других специальных символов. Ожидаете ли вы, что вы также снова загрузите этот JSON и проанализируете его для последующего использования в своем приложении?

Ben Steward 11.11.2018 15:26

если вы настаиваете на том, что не используйте .data (). как насчет использования encodeURI и decodeURI. , как одна из функций, аналогичных подготовительной для этой проблемы. вы можете сделать это: encodeURI (JSON.stringify (data))

Neo Anderson 11.11.2018 15:33

Не требует кодировки URI; в конце концов, это не URI. Все, что ему нужно, - это заменить все символы двойных кавычек на @quot;, но это необходимо только в том случае, если фрагмент должен быть проанализирован как HTML.

Pointy 11.11.2018 15:34

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

Asa Carter 11.11.2018 15:35

Использовать .setAttribute() напрямую почти так же просто, и, в отличие от .data(), у вас действительно будет атрибут в DOM.

Pointy 11.11.2018 15:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
8
1 972
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Рассмотрите возможность вставки объекта jQuery вместо выполнения всей этой работы по экранированию строки и используйте метод data() для передачи вашего объекта элементу.

var data = {
  title: 'This is a test for " and \'. It fails.',
  url: 'Some url'
};


var tpl = $('<div>', {class: "ui-menu-item",id: "test"})
            .text("This element contains the data")
            .data(data); 
            
$('body').append(tpl);

console.info($('#test').data('title'))
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Я большой поклонник .data(), но следует отметить, что на самом деле он не является атрибутом установленный на узле DOM.

Pointy 11.11.2018 15:33

@Pointy обнаружил удивительную проблему, когда при использовании для установки в родительском документе вы не могли получить к нему доступ из iframe, используя iframe-версию jQuery global. Я всегда предполагал, что он использовал Element.dataset в более поздних версиях, но оказалось, что это не так. Пришлось сделать window .parent.$(selector).data(), чтобы получить

charlietfl 11.11.2018 15:38
Ответ принят как подходящий

  var data = {
    title: 'This is a test for " and \'. It fails.',
	  url: 'Some url'
  };

  data = JSON.stringify(data);

  console.info (data);

$(document).ready(function() {
  var tpl = "<div class=\"ui-menu-item\" id=\"test\">This element contains the data.</div>";
  
  $('body').append(tpl);
  $('#test').attr('data-menu-item', data)
});
<html>
<head>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</head>
<body>
</body>
</html>

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