Я заметил некоторую разницу в представлении строк в DOM, переданных с сервера как атрибут HTML, или как глобальный var.
Существует строка, которая представляет собой JSON-кодированный объект со специальными символами и устанавливает эту строку следующими способами:
<div id="my-id"
data-opt='[{"id":"600900340","parent_id":"600900000","name":"\tCollector\u0027s Cars \u0026 Models","visible":"1","level":"3"}]'
></div>
<script>
window.opt = '[{"id":"600900340","parent_id":"600900000","name":"\tCollector\u0027s Cars \u0026 Models","visible":"1","level":"3"}]';
</script>
Теперь проверьте их с помощью js:
;(function(window) {
console.log(document.getElementById('my-id').dataset.opt);
console.log(window.opt);
}(window))
Вывод:
[{"id":"600900340","parent_id":"600900000","name":"\tCollector\u0027s Cars \u0026 Models","visible":"1","level":"3"}]
[{"id":"600900340","parent_id":"600900000","name":" Collector Cars & Models","visible":"1","level":"3"}]
Почему они разные?
Вот jsfiddle http://jsfiddle.net/9ss5M/3/
Поскольку escape-последовательности, такие как \t
и \u####
которые имеют особые значения в строках JavaScript (включая JSON), не имеют смысла в значениях атрибутов HTML.
Для того, что стоит, escape-последовательности в HTML принимают форму ссылок на сущности. Для остроумия:
<div id="my-id"
data-opt='[{"id":"600900340","parent_id":"600900000","name":"	Collector's Cars & Models","visible":"1","level":"3"}]'
></div>
И, конечно же, есть возможность вставить специальные символы буквально, так как это не прибегает к escape-последовательностям.
window.opt
) и один раз в контексте HTML, где он воспринимается буквально (data-opt
).