#javascript #jquery #html #hidden-field
#javascript #jquery #HTML #скрытое поле
Вопрос:
Сводясь к самому простому элементу, я просто хочу установить значение скрытого поля при нажатии на элемент на странице.
HTML:
<div id="toggleParent">
<input type="hidden" name="toggleValue" id="toggleValue" value="closed" />
<h2>Click Me</h2>
</div>
jQuery:
jQuery(document).ready(function() {
var toggle;
jQuery('div#toggleParent h2').click(function () {
if (toggle == '' || toggle == 'open') {
toggle = 'closed';
} else {
toggle = 'open';
}
jQuery('div#toggleParent input#toggleValue').val(toggle);
});
});
Очевидно, что это не работает. (Иначе зачем бы я здесь был?) Событие click работает нормально, так как я могу пошагово выполнить его в Firebug. Но когда дело доходит до установки значения, код завершается ошибкой. Более того, попытка alert(jQuery('div#toggleParent input#toggleValue').length)
возвращает 0. Фактически, alert(jQuery('div#toggleParent h2').length)
возвращает 0, даже несмотря на то, что событие click для этого точного элемента только что сработало!
Чего я не понимаю?
Комментарии:
1. Все любопытнее и любопытнее. Только что попробовал этот код в jsFiddle, и разве вы этого не знали? Это работает отлично. Очевидно, что есть проблема в другом месте, которую я не вижу. В любом случае, спасибо, что взглянули на это!
Ответ №1:
Это:
document.ready(function () {...});
Должно быть:
jQuery(document).ready(function () {...});
Или даже:
jQuery(function () {...});
Или…
jQuery(function ($) { /* Use $ in here instead of jQuery */ });
Имейте в виду, что при использовании идентификаторов любой другой селектор не нужен, поскольку идентификаторы уникальны. Этого достаточно:
jQuery('#toggleValue').val(toggle);
Комментарии:
1. @Box9 Или даже:
jQuery(function($) { ... });
(поскольку$
это круче, чемjQuery
)2. На самом деле я считаю, что для повышения производительности лучше использовать селектор идентификаторов.
3. Ничто из этого на самом деле не решает проблему, связанную с тем, что код работает, ЗА ИСКЛЮЧЕНИЕМ строки, которая ссылается на .val. Код, который я использую, на самом деле использует jQuery(document). готово — я просто неправильно скопировал его.
4. @Roger, из того, что мы видим, нет причин, по которым это не сработает. Можете ли вы настроить демонстрацию проблемы, которая действительно возникает?
5. Все любопытнее и любопытнее. Только что попробовал этот код в jsFiddle, и разве вы этого не знали? Это работает отлично. Очевидно, что есть проблема в другом месте, которую я не вижу. В любом случае, спасибо, что взглянули на это!
Ответ №2:
Ваше значение ‘toggle’ не определено, вы определяете его только в document.ready, но не присваиваете ему никакого значения. Чтобы назначить, используйте
var toggle = jQuery('div#toggleParent input#toggleValue').val();
Комментарии:
1. Значение undefined не является проблемой; оно просто перемещается в блок else инструкции if. Я пошагово проработал код, и он не завершается с ошибкой до тех пор, пока не будет выполнено присвоение значения val, после чего toggle ДЕЙСТВИТЕЛЬНО получит значение. Кроме того, это не решает проблему, связанную с тем, что предупреждения о длине постоянно возвращают 0.
Ответ №3:
Я предлагаю этот код:
jQuery(function($) {
var toggleParent = $('#toggleParent')[0],
toggleValue = $('#toggleValue')[0];
$(toggleParent).find('h2').click(function() {
toggleValue.value = toggleValue.value === 'closed' ? 'open' : 'closed';
});
});
Комментарии:
1. Это также не удается.
$('#toggleParent').length
возвращает 0, поэтому, когда я пытаюсь ввести [0] в это, я получаю сообщение об ошибке.2. @Roger Если
$('#toggleParent').length
возвращает 0, то на странице нет элемента с идентификатором «toggleParent». Вы пробовали в разных браузерах?
Ответ №4:
Попробуйте этот код:
$(document).ready(function() {
var toggle;
$('div#toggleParent h2').click(function() {
if (toggle == '' || toggle == 'open') {
toggle = 'closed';
} else {
toggle = 'open';
}
$('div#toggleParent input#toggleValue').val(toggle);
alert($("input#toggleValue").val()); // check what the new value is
});
});
Комментарии:
1. Чтобы улучшить качество вашего ответа, пожалуйста, укажите, как / почему ваш пост решит проблему.