#javascript #php #ajax #function
#javascript #php #ajax #функция
Вопрос:
я застрял в коде и нуждаюсь в вашем быстром ответе, чтобы закончить свой проект. Я могу извлечь все данные из базы данных, но когда я нажимаю на кнопку просмотра, детали не отображаются в модальной форме. Кнопка не работает. Когда я удаляю функциональную кнопку click из цикла while, она начинает работать. Но я хочу, чтобы кнопка просмотра была в каждой строке, чтобы я мог отображать детали с помощью modal. Может кто-нибудь, пожалуйста, помочь это исправить?
$(document).ready(function(){
load_data();
function load_data(query)
{
$.ajax({
url:"fetch.php",
method:"POST",
data:{query:query},
success:function(data)
{
$('#result').html(data);
}
});
}
$('#search_text').keyup(function(){
var search = $(this).val();
if(search != '')
{
load_data(search);
}
else
{
load_data();
}
});
});
$('.view_data').click(function(){
var employee_id = $(this).attr("id");
$.ajax({
url:"select.php",
method:"post",
data:{employee_id:employee_id},
success:function(data){
$('#employee_detail').html(data);
$('#dataModal').modal("show");
}
});
});
PHP:
<?php
//fetch.php
$connect = mysqli_connect("localhost", "root", "", "crud");
$output = '';
if(isset($_POST["query"]))
{
$search = mysqli_real_escape_string($connect, $_POST["query"]);
$query = "
SELECT * FROM records
WHERE User_ID LIKE '%".$search."%'
OR User_Name LIKE '%".$search."%'
OR User_Email '%".$search."%'
OR User_Age LIKE '%".$search."%'
";
}
else
{
$query = "
SELECT * FROM records ORDER BY User_ID
";
}
$result = mysqli_query($connect, $query);
if(mysqli_num_rows($result) > 0)
{
$output .= '
<div class="table-responsive">
<table class="table table bordered">
<tr>
<th>User ID</th>
<th>User Name</th>
<th>User Email</th>
<th>User Age</th>
<th>View</th>
</tr>
';
while($row = mysqli_fetch_array($result))
{
$output .= '
<tr>
<td>'.$row["User_ID"].'</td>
<td>'.$row["User_Name"].'</td>
<td>'.$row["User_Email"].'</td>
<td>'.$row["User_Age"].'</td>
<td><input type="button" name="view" value="view" id="'.$row["User_ID"].'" class="btn btn-info btn-xs view_data" /></td>
</tr>
';
}
echo $output;
}
else
{
echo 'Data Not Found';
}
?>
<?php
if(isset($_POST["employee_id"]))
{
$output = '';
$connect = mysqli_connect("localhost", "root", "", "crud");
$query = "SELECT * FROM records WHERE User_ID = '".$_POST["employee_id"]."'";
$result = mysqli_query($connect, $query);
$output .= '
<div class="table-responsive">
<table class="table table-bordered">';
while($row = mysqli_fetch_array($result))
{
$output .= '
<tr>
<td width="30%"><label>Name</label></td>
<td width="70%">'.$row["User_ID"].'</td>
</tr>
<tr>
<td width="30%"><label>Address</label></td>
<td width="70%">'.$row["User_Name"].'</td>
</tr>
<tr>
<td width="30%"><label>Gender</label></td>
<td width="70%">'.$row["User_Email"].'</td>
</tr>
<tr>
<td width="30%"><label>Designation</label></td>
<td width="70%">'.$row["User_Age"].'</td>
</tr>
';
}
$output .= "</table></div>";
echo $output;
}
?>
Комментарии:
1. Вероятно, это не решит вашу проблему, но я не думаю, что использовать атрибут HTML
id
для храненияUser_ID
.id
Атрибут имеет особое значение для браузеров, он однозначно идентифицирует HTML-тег в DOM, тогда как вы используете его для передачи данных в Javascript. В программировании есть правило, которого я придерживаюсь: «Используйте вещи только для того, для чего они предназначены».. Было бы лучше использоватьdata-*
атрибуты. jQuery может справиться с этим. Смотрите: api.jquery.com/data
Ответ №1:
Вы можете попробовать изменить эту строку:
$('body').on('click', '.view_data', function(){
/* old:
$('.view_data').click(function(){ */
Сработало ли это?
Идея в том, что в вашей версии код не будет работать по двум причинам:
- когда вы обновляете DOM новыми
.view_data
элементами, эта функция подключается только к начальным элементам (вы должны вспомнить функцию для новых элементов …) - ваша функция запускается сразу после загрузки документа, когда в DOM нет
.view_data
элементов, поэтому она не влияет, когда они появляются асинхронно
Предложенный альтернативный вариант привязывает событие щелчка к body
, а затем фильтрует его по .view_data
. Таким образом, независимо от того, какие изменения в DOM, событие всегда запускается и функция работает.
Комментарии:
1. спасибо, это сработало. есть ли какой-либо другой метод, кроме добавления события в тело?
2. Прохладный. Вы можете 1) добавить событие к любому родительскому элементу, который существует в DOM, когда вы определяете функцию; 2) добавить событие индивидуально для каждого нового элемента, добавленного в DOM, просто убедитесь, что вы не дублируете их. Может быть, есть другие способы? Но я использую первое: помещаю все динамические элементы в предопределенный контейнер (div), к которому привязаны все события.