#php #jquery
#php #jquery
Вопрос:
У меня есть скрипт jQuery, который должен включать связанное текстовое поле, если пользователь нажимает переключатель «да», и отключать это текстовое поле, если пользователь нажимает переключатель «нет». Проблема, с которой я сталкиваюсь, заключается в том, что каждое текстовое поле в каждой строке станет отключенным / включенным, А значение будет установлено в 0, если нажать только на первую пару переключателей «Да» / «нет».
Мне нужно выяснить, как отключить и присвоить значение 0 текстовому полю, специально связанному с назначенными ему переключателями.
Вот HTML для 3 строк примера
Yes <input name="getFlow1" type="radio" value="1" />
No <input name="getFlow1" type="radio" value="0" checked />
<input name="enterFlowVal1" id="enterFlowVal1" value="0" size="7" type="text" disabled="disabled"/>
Yes <input name="getFlow2" type="radio" value="1" />
No <input name="getFlow2" type="radio" value="0" checked />
<input name="enterFlowVal2" id="enterFlowVal2" value="0" size="7" type="text" disabled="disabled"/>
Yes <input name="getFlow3" type="radio" value="1" />
No <input name="getFlow3" type="radio" value="0" checked />
<input name="enterFlowVal3" id="enterFlowVal3" value="0" size="7" type="text" disabled="disabled"/>
Вот jQuery, который работает в определенной степени, но ошибочен.
$(document).ready(function (){
$("input[name^=getFlow]").(function(i){
if (i == 1) { //the "no" radiobutton
$(this).click(function () {
var zero = 0;
$("input[name^=enterFlowVal]").attr("disabled", "disabled");
$("input[name^=enterFlowVal]").val(zero);
});
} else {
$(this).click(function () {
$("input[name^=enterFlowVal]").removeAttr("disabled");
});
}
});
}
);
Ответ №1:
Лично я бы немного изменил вашу разметку, чтобы значительно упростить эту задачу. Добавление родительского тега с некоторым описанием позволяет ограничить доступные входные данные.
<div class="option-group">
Yes <input name="getFlow1" type="radio" value="1" />
No <input name="getFlow1" type="radio" value="0" checked />
<input name="enterFlowVal1" id="enterFlowVal1" value="0" size="7" type="text" disabled="disabled"/>
</div>
<div class="option-group">
Yes <input name="getFlow2" type="radio" value="1" />
No <input name="getFlow2" type="radio" value="0" checked />
<input name="enterFlowVal2" id="enterFlowVal2" value="0" size="7" type="text" disabled="disabled"/>
</div>
Затем в jQ:
$(document).ready(function (){
$("input[name^=getFlow]").(function(i){
if (i == 1) { //the "no" radiobutton
$(this).click(function () {
var zero = 0;
$(this).closest(".option-group").children("input[name^=enterFlowVal]").attr("disabled", "disabled");
$(this).closest(".option-group").children("input[name^=enterFlowVal]").val(zero);
});
} else {
$(this).click(function () {
$(this).closest(".option-group").children("input[name^=enterFlowVal]").removeAttr("disabled");
});
}
});
}
);
Комментарии:
1. Рори, я предполагаю, что ты хотел быть последовательным для имени класса «options-group» (со ссылкой на HTML).
2. Я сделал. Селектор jQuery closest() в коде основан на том, что для ввода всегда присутствует родительский элемент с тем же именем класса.
3. ваше решение выглядит интригующе, как и Bens. Я изучу это.
Ответ №2:
Не могли бы вы попробовать выбрать ввод текста с помощью next ():
$(this).click(function(){
var zero = 0;
$(this).next('input[type^=text]').attr('disabled','disabled');
$(this).next('input[type^=text]').val(zero);
});
Не тестировал это, но что-то подобное должно применять любые изменения атрибуции только к следующему текстовому полю, а не ко всем из них.
Ответ №3:
Попробуйте
$(this).nextAll("input[name^=enterFlowVal]").first()
вместо
$("input[name^=enterFlowVal]")
если вы не можете изменить разметку. Если вы можете это изменить, я бы предпочел приведенные выше предложения, использующие общего предка,
Ответ №4:
Вероятно, самым простым способом сделать это было бы обернуть каждый «набор» входных данных в содержащий div, например
<div>
Yes <input name="getFlow1" type="radio" value="1" />
No <input name="getFlow1" type="radio" value="0" checked />
<input name="enterFlowVal1" id="enterFlowVal1" value="0" size="7" type="text" disabled="disabled"/>
</div>
затем используйте что-то вроде
$(document).ready(function (){
$("input[name^=getFlow]").(function(i){
if (i == 1) { //the "no" radiobutton
$(this).click(function () {
var zero = 0;
$(this).parent().children("input[name^=enterFlowVal]").attr("disabled", "disabled");
$(this).parent().children("input[name^=enterFlowVal]").val(zero);
});
} else {
$(this).click(function () {
$(this).parent("input[name^=enterFlowVal]").removeAttr("disabled");
});
}
});
}
);
По сути, родительская функция найдет родительский элемент ввода, что должно быть идеей, которая ограничит ваш выбор только входными данными с именем enterFlowVal в этом родительском div. Возможно, вам потребуется немного изменить это.
Комментарии:
1. Черт возьми, на полпути к вводу моего ответа появляется это. Похоже, ваш селектор неверен. Должно быть что-то большее в духе
$(this).parent().children("input[name^=enterFlowVal]").attr(...)
2. Да, это на самом деле правильно! Я заменю это. Похоже, мне следовало потратить на это немного больше времени >.<