Добрый вечер! Есть такая проблема. Форма html, в которой есть поля select, количество которых высчитывается из базы и соответственно отображается. На этой форме есть кнопка , которая вызывает ajax, который в свою очередь передаёт данный url, где меняется количество полей select. После получения ответа происходит window.location = "view_z?id="+result.id; По логике вещей, вся страница должна обновится и все компоненты select должны показаться. По факту получается, что элементы новые, то показываются, то нет ( приходиться обновлять страницу вручную, если не показались.). В чём может быть проблема? Код (Javascript): function AjaxFormR1(result_id,form_id,url) { jQuery.ajax ({ url: url, type: "POST", dataType: "html", data: jQuery("#"+form_id).serialize(), success: function(response) { result = jQuery.parseJSON(response); if (result['type']==='err') { alert("Ошибка в типе"); } else { window.location = "view_zakaz?id="+result.id; } }, error: function(response) { alert("Ошибка выполнения"); } }); } На форме часть кода выглядит так PHP: <div id="idhistory2" class="history"> <?php $row = Array(); $row = $z->selAll(Array(0 => $id, 1 => '0')); $i = 1; if (!empty($row)) { foreach ($row as $mas) { ?> <div class="form-group" style="background: #dcf1fa;"> <label for="inputstatus<?php echo $i; ?>">Статус:</label> <select name="status<?php echo $i; ?>" id="inputstatus<?php echo $i; ?>" list="character5" placeholder="Статус" autocomplete="off" class="form-control"> <option selected><?php echo $z->sel_status($mas["status_id"]); ?></option> <?php echo $z->option_status(); ?> </div> <?php $i++; } } ?> </div>
жаль что ссылка сразу не на гуггл. Тогда бы я все проблемы решил. Если уж ссылка на документацию, то плиз на конкретный пункт
это я изменил, но к сожалению ситуация не сдвинулась с мертвой точки. Что ещё можно попробовать? В js я не силён, как вы поняли. Может быть нужно использовать console.log , чтобы увидеть все тонкости или и так бы ошибки были?
какие элементы ? после ajax скрипта происходят дальнейшие действия, а значит он тут не причем. Почему они не обновляются ? Кеш с браузера возможен ? Элементы чего ? --- Добавлено --- для рекомендации: советую лучше от корня сайта прописывать путь. /index.php?id=3 --- Добавлено --- Так же могу предложить, на бесплатной основе, законектиться по TeamViewer для более действительной помощи. В лс по времени договориться мож.
Нашёл информацию, что "по location страница не обновляется. обновляется по reload". Если это так, то получается я не верно делал?
Вечер добрый! Снова я решил вернуться к этой теме, так как и не достиг результата. Выяснил я, что проблема в том, что success ajax выполняется раньше, чем выполняется insert в базу. Не пойму, как сделать, чтобы обновление страницы было после удачного инсерта. То есть на странице выводиться количество записей echo $rez->num_rows; Но когда нажимаешь кнопку сохранить, количество записей не верное и чтобы получить верное, надо обновлять страницу вручную. Что я делаю не так? Всё сделал в тестовом режиме, чтобы разобраться. Это файл index.php. PHP: <?php include("db.php"); ?> <!DOCTYPE html> <html lang="en"> <head> <title>Просмотр </title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script> <script type='text/javascript' src='https://code.jquery.com/jquery-3.0.0.min.js' ></script> <script src='js/jquery.form.js' type='text/javascript'></script> <script type='text/javascript'> function AjaxFormRequest(result_id,form_id,url) { $(function() { jQuery.ajax ({ url: url, type: "POST", dataType: "json", data: jQuery("#" + form_id).serialize(), success: function (response) { console.log(response); const result = jQuery.parseJSON(response); location.reload(); }, error: function (response) { alert("Ошибка выполнения"); } }); }); } </script> </head> <a href="" id="save" onclick="AjaxFormRequest('idhistory', 'formview', 'https://test.ru/test555')" > <img src="img/save2.jpg" width="100" height="50" ></a> <form id="formview" action="" enctype="multipart/form-data" target="_top" method="post" > <input name="test" id="idins" type="hidden" value="123"> <?php $sql="select * from test"; $rez=$mysqli->query($sql); echo $rez->num_rows; ?> </form> </body> </html> А это файл https://test.ru/test555 на который ссылается аякс. PHP: <?php include("db.php"); $sql="insert into `test` (dd) VALUES ('1')"; //$rez=$mysqli->query($sql); if ($mysqli->query($sql) === True) { $rez = array("id" =>111,"resp" =>"1"); echo json_encode($rez); die(); }
@shtrih во первых ajax нужен чтобы не перезагружать страницу. Если ты хочешь получить новые данные, их надо вставить куда тебе надо. Вот код вставки в js: PHP: <form id="formview" action="" enctype="multipart/form-data" target="_top" method="post" > <input name="test" id="idins" type="hidden" value="123"> <?php $sql="select * from test"; $rez=$mysqli->query($sql); echo '<div id="rows">'.$rez->num_rows.'</div>'; ?> </form> Код (Javascript): success: function (response) { console.log(response); let result = jQuery.parseJSON(response); // {"id" : 111,"resp" : "1"} $("#rows").html(result.resp); } я хз где тебе там result.id нужен, сам вставишь
Да спасибо, так работает, но опять же, только в том случае, если $("#rows").html выполнится после того, как сделается insert, а если insert долгий, то данные на странице будут не актуальны. Например, так PHP: <?php include("db.php"); $sql="insert into `test` (dd) VALUES ('1')"; //$rez=$mysqli->query($sql); sleep(5); if ($mysqli->query($sql) === True) { $rez = array("id" =>111,"resp" =>"1"); echo json_encode($rez); die(); } То есть эмитируем долгий инсерт с помощью sleep на 5 секунд. Как в это случае быть?
Сделай лоадер, чтобы пользователь знал что данные не актуальны, на кой тебе вообще тут js. Не понимаю я логики работы твоего кода.
А как сделать, чтобы данные обновились, только выполнения всех инсертов? Лоадер это немного не то. Мне просто нужна пауза 1 секунду и после этого обновление
Опиши словами что должно происходить, зачем это вообще все, зачем одна секунда. Что вообще твой код должен делать, на пальцах.
Одна секунда, так как не успеваете записаться insert. Например, При нажатии кнопки Сохранить, в базу добавляется несколько строк, например имена Василий, Сергей, Дмитрий. И их статусы Работает, Не работает, Отпуск. И тут же, когда аякс возвращает, что всё ок, выполняется select. И выводиться Input поля с именами всех людей и их статусами. Но так как insert может длится немного дольше, то когда аякс сделает $("#rows").html на странице будут не верные сведения
@shtrih блок success выполняется только после успешного завершения http запроса. а он завершится только после выполнения insert - здесь всё последовательно, а не параллельно.
@shtrih а я тебе еще раз говорю херня, создай 2 этих файла и тести: HTML: <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>node</title> </head> <body> <form method="post"> <input type="text" class="form-control" name="name"> <button type="submit" class="btn btn-primary">Отправить</button> </form> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script> $( "form" ).submit(function( e ) { e.preventDefault(); $.post( 'test_2.php', $(this).serialize(), function( data ){ console.log(data); }); }); </script> </body> </html> PHP: <?php $start = date('H:i:s'); sleep(5); $end = date('H:i:s'); $rez = [ $start, $end ]; echo json_encode($rez); die(); ?>