2014-06-03 3 views
0

HTML & PHP:Uncaught SyntaxError: Неожиданный конец ввода Во время выполнения JSON.parse

<select id="package"> 
    <?php $package_size_array = array('size_a' => 70, 'size_b' => 90, 'size_c' => 130); ?> 
    <option value="size" id="<?php echo json_encode($package_size_array, JSON_PRETTY_PRINT); ?>">Size</option> 
    <!--Some more <option>s here...--> 
</select> 

JavaScript:

$(document).ready(function() { 
    $('select#package').change(function() { 
     var id = $(this).children(':selected').attr('id'); 
     alert(JSON.parse(id)); /* Line 217. in functions.js file */ 
    }); 
}); 

Проблема: Chrome и, возможно, другие браузеры консоли печатает:

Uncaught SyntaxError: Unexpected end of input functions.js:217 
(anonymous function) functions.js:217 
jQuery.event.dispatch jquery.js:4371 
elemData.handle 
+2

Зачем вам нужен JSON.parse() id? –

+0

Что вы на самом деле пытаетесь выполнить с помощью этого кода? 'id' - это просто строка, это не объект JSON. – David

+0

Поскольку идентификатор

ответ

7

Если данные, которые вы конвертируете в JSON, состоят исключительно из булевых или a Number, в результате JSON будет содержать " символов.

Вы используете символы ", чтобы разграничить значение идентификатора вашего идентификатора, поэтому первый в данных должен преждевременно прекратить действие атрибута.

Это было бы гораздо более очевидным, если бы вы исследовали данные, которые вы отправляли в браузер (с view > source), а не просто смотрели на PHP.

Вам нужно преобразовать текстовое представление JSON в его представление HTML.

id="<?php echo htmlspecialchars(json_encode($package_size_array)); ?>" 

Вы должны также удалить JSON_PRETTY_PRINT, это полезно для отладки, но неэффективен на практике, и новые линии не хорошо подходят для значений атрибутов.

Это говорит о том, что использование JSON для значения идентификатора является ужасной идеей. Если вы хотите хранить произвольные данные для элемента, используйте a data-* attribute (вам все равно нужно преобразовать текст в HTML!)

+3

. Хорошая вещь о сохранении JSON в атрибуте 'data- *' заключается в том, что jQuery автоматически расшифрует его для вас. – Barmar

+0

Извлеките 'JSON_PRETTY_PRINT', я думаю, что это еще хуже. – Barmar

+0

в chrome running' document.getElementById ('package'). Options [0] .id' в консоли на предоставленном php-файле дает ожидаемый json в полном объеме Слава. Поэтому не обязательно ломать вещи, хотя я разделяю вашу озабоченность по поводу многострочных атрибутов html – Noino

Смежные вопросы