Побег, описанный в укусе с JS

У меня проблема с моим скриптом со следующим var:

var jsondatacats = eval(currentbtn.attr("data-jsond")); 

это работало хорошо, пока атрибут data-json не получил строку, в которой одно из значений содержало одинарную кавычку «Как сделать».

Побег, описанный в укусе с JS

В будущем я позабочусь о том, чтобы мой PHP уловил это, но на данный момент мне интересно, смогу ли я решить эту проблему и остановить JS-скрипт от выдачи ошибки с помощью JS-решения.

Является ли это возможным?

Не используйте eval(). Если значением атрибута data-jsond является JSON, используйте JSON.parse()

Phil 09.04.2019 02:07

Каков пример значения этого атрибута? Как это установлено в вашем HTML?

Phil 09.04.2019 02:07

Вы мало что можете сделать с существующими значениями, которые не отформатированы должным образом. В дальнейшем вы должны использовать json_encode() (в PHP) или JSON.stringify() (в JavaScript) для заполнения атрибута. Кроме того, если вы используете метод jQuery .data(), он автоматически анализирует JSON.

Barmar 09.04.2019 02:12

@Фил, спасибо за предложение. Я пробовал JSON.parse(), но теперь получаю другую ошибку: «SyntaxError: JSON.parse: неопределенная строка в строке 1 столбца 749 данных JSON»

santa 09.04.2019 02:15

@Phil Я обновил свой пост примером из реальной жизни.

santa 09.04.2019 02:23

Где конец значения атрибута?

Phil 09.04.2019 02:25

@Phil - добавил скриншот. По какой-то причине инструменты разработчика преобразовали все кавычки, когда я вставлял.

santa 09.04.2019 02:27

Это именно то, что делает dev-tools. Это делает закодированные значения читабельными. Ваш исходный код HTML будет источником правды

Phil 09.04.2019 02:28

Имеет смысл. Я обновился из исходного кода.

santa 09.04.2019 02:32
Поведение ключевого слова "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
9
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Собираюсь предположить, что вы используете что-то подобное в своем PHP-скрипте.

<i data-jsond='<?= json_encode($someVariable) ?>'></i>

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

При вставке значений в HTML всегда убедитесь, что вы правильно их кодируете. Например

<i data-jsond = "<?= htmlspecialchars(json_encode($someVariable)) ?>"></i>

Это создаст что-то вроде следующего, которое можно разобрать как JSON

const jsonData = $('#currentButton').data('jsond')
// or jsonData = JSON.parse($('#currentButton').attr('data-jsond'))
$.each(jsonData, function(key, val) { 
  console.info(key, ':', val)
})
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.slim.min.js"></script>
<i id = "currentButton" data-jsond = "{&quot;message&quot;:&quot;Hello 'world'&quot;}"></i>

Лемм дать ему вихрь

santa 09.04.2019 02:41

Теперь я получаю еще одну ошибку: TypeError: невозможно использовать оператор «in» для поиска «длины» в «[{"id":"140593",... Я обновил свой OP с полной функцией. Теперь ошибка переместилась на строку $.each.

santa 09.04.2019 02:52

Кажется, вы все еще используете eval(). Как я уже говорил, не делай этого

Phil 09.04.2019 02:56

Это исходная функция. С тех пор я изменился на JSON.parse(), но ошибка сместилась на $.each

santa 09.04.2019 03:03

Хорошо, думаю, я понял. Я также добавил JSON.parse(jsondataformergedcats) в $.each, и теперь все работает. Фу... Спасибо за помощь!

santa 09.04.2019 03:29

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