#php #html #jquery
#php #HTML #jquery
Вопрос:
В приведенном ниже примере в контроллере поля ввода динамически поступают с сервера и отображаются на странице просмотра через ajax
public function Testing() {
$query =.....;
$result = $query->result_array();
$i=1;
foreach ($result as $row) {
echo '<div class = "readingparent">
<div class="form-group">'.$row['cm_name'].'</div>
<div class="form-group">
<input type="text" class="form-control prev-'.$i.'" placeholder="" onkeypress="return isNumber(event)">
</div>
<div class="form-group">
<input type="text" class="form-control present-'.$i.'" placeholder="" onkeypress="return isNumber(event)">
</div>
<div class="form-group">
<input type="text" class="form-control reading" id="reading-'.$i.'" placeholder="" onkeypress="return isNumber(event)">
</div>
</div>';
$i ;
}
}
Эти входные данные отображаются на странице просмотра с помощью ajax $('.testingnew').html(data);
.
Проблема в том, что я не получил второе входное значение после первого ввода.
$(document).ready(function () {
for (var i=1; i<4; i ) {
$(document).on('keyup','.prev-' i,function( e ) {
var prev = $(this).val();
// alert(prev);
var present = $('.present-' i).val();
// var present = $(document).val($('.present-' i).val());
// var present = $(document).on("trigger", '.present-' i).val();
// var present = document.getElementsByClassName( '.present-' i ).value;
// var present = $(document).on('trigger','.present-' i).val();
// var present = $(document).on('change','.present-' i).val();
alert(present);
});
}
});
Комментарии:
1. Это странный способ использования делегирования событий … Эти элементы должны иметь один общий класс, и должен быть один обработчик ввода, отслеживающий событие, происходящее с элементами с этим классом, добавленным в документ.
Ответ №1:
На самом деле, ваш код выполняется без ошибок, проблема в ваших обработчиках, это называется closure:
function( e ) {
...
var present = $('.present-' i).val();
alert(present);
}
Все ваши обработчики будут сохранять и использовать одну и ту же ссылку i
, во время запуска обработчика он выполняет поиск в своей лексической области и использует ссылку i = 4
. Таким образом, значение '.present-' i
всегда будет .present-4
, и это заставляет вас думать, что код не будет выполняться.
Это можно легко исправить, используя меньшую область блока:
for (var i=1; i<4; i ) {
const j = i;
// use the reference of `j` instead of `i`
$(document).on('keyup','.prev-' j,function( e ) {
var present = $('.present-' j).val();
alert(present);
}
}```