javascript - 在livetable php中重复JS警报
问题描述
我在一个项目中有一个问题,然后:
我有一个代码 php,它使用 mysql 数据生成一个实时表。在右侧,我有一个执行 php 脚本的按钮,以将电子邮件发送到表中相应行中写入的地址。如果我的搜索结果超过 1 行,它会显示这些行,但是如果我单击与我要发送电子邮件的人相对应的按钮,一个 js 脚本会为表中显示的每个人显示一个警报(正确)
这里的php代码:
$output = '';
if(isset($_POST["query"]))
{
$search = mysqli_real_escape_string($connect, $_POST["query"]);
$query = "
SELECT * FROM mytable
WHERE Last_Name LIKE '%".$search."%'
OR First_Name LIKE '%".$search."%'
OR Number LIKE '%".$search."%'
OR Gmail LIKE '%".$search."%'
OR Year LIKE '%".$search."%'
OR Class LIKE '%".$search."%'
OR Password LIKE '%".$search."%'
OR School LIKE '%".$search."%'
ORDER BY Last_Name LIMIT 200";
}
else
{
$query = "
SELECT * FROM mytable ORDER BY Last_Name limit 0";
}
$result = mysqli_query($connect, $query);
$rowcount=mysqli_num_rows($result);
if(mysqli_num_rows($result) > 0)
{
$output .= '<div class="table-responsive well-lg">
<table class="table table-hover table-striped table-bordered">
<tr>
<th class="text-center">Last Name</th>
<th class="text-center">First Name</th>
<th class="text-center">Student Nr.</th>
<th class="text-center">School Email</th>
<th class="text-center">Year</th>
<th class="text-center">Class</th>
<th class="text-center">Password</th>
<!--<th class="text-center">Doc.</th>-->
<th class="text-center">E-Mail</th>
</tr>';
while($row = mysqli_fetch_array($result))
{
$output .= '
<tr>
<td class="text-center">'.utf8_encode($row["Last_Name"]).'</td>
<td class="text-center">'.utf8_encode($row["First_Name"]).'</td>
<td class="text-center">'.utf8_encode($row["Number"]).'</td>
<td class="text-center">'.utf8_encode($row["Gmail"]).'</td>
<td class="text-center">'.utf8_encode($row["Year"]).'</td>
<td class="text-center">'.utf8_encode($row["Class"]).'</td>
<td class="text-center">'.utf8_encode($row["Password"]).'</td>
<!--<td class="text-center" style="width: 60px"><a href="document.php?firstname='.utf8_encode($row["First_Name"]).'&lastname='.utf8_encode($row["Last_Name"]).'&number='.$row["Number"].'&gmail='.$row["Gmail"].'&password='.$row["Password"].'"><img src="images/document.png" width=18px"></a>
</td>-->
<td class="text-center" style="width: 60px">
<a class="ajax confirmation" href="mail_'.$row["School"].'.php?firstname='.utf8_encode($row["First_Name"]).'&lastname='.utf8_encode($row["Last_Name"]).'&number='.$row["Number"].'&gmail='.$row["Gmail"].'&password='.$row["Password"].'"><img src="images/gmail_icon.png" width=24px"></a>
</td>
<script type="text/javascript">
$(\'.confirmation\').on(\'click\', function () {
return confirm(\'You are sending the password to ' .$row["Gmail"]. '. Are you sure?\');
});
</script>
</tr>
';
}
echo $output;
在 livetable 中管理输出的 js:
$(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();
}
});
这是管理警报的代码:
<script>
$(document).on("click", ".ajax", function(e){
e.preventDefault();
var href = $(this).attr('href');
$.ajax({
type: "GET",
dataType : "html",
url: href,
success: function (data){
alert(data);
}
});
});
</script>
如何避免在显示的每一行显示警报并允许仅针对我单击的行显示警报?
请帮助我...谢谢大家... P。
解决方案
您好 Pablo,欢迎来到 Stack Overflow!
更新的答案:
刚刚在您的代码中发现错误:
while($row = mysqli_fetch_array($result))
{
$output .= '
...
<script type="text/javascript">
$(\'.confirmation\').on(\'click\', function () {
return confirm(\'You are sending the password to ' .$row["Gmail"]. '. Are you sure?\');
});
</script>
...
'
}
您在循环中定义它,因此创建多个事件侦听器(在您的测试中,2 个条目创建了 2 个侦听器)。弹出窗口中显示的邮件地址基于当前$row['Gmail']
条目,这就是为什么您会看到两个不同的邮件地址。脚本块的位置也无效,因为它当前位于结束标记</td>
和结束</tr>
标记之间。
修改代码以拥有一个侦听器,并提供确认对话框中显示的邮件地址作为“data-”属性。
更改的 PHP 代码:
<td class="text-center" style="width: 60px">
<a class="ajax confirmation"
data-mail='.$row["Gmail"].'
href="mail_'.$row["School"].'.php?firstname='.utf8_encode($row["First_Name"]).'&lastname='.utf8_encode($row["Last_Name"]).'&number='.$row["Number"].'&gmail='.$row["Gmail"].'&password='
.$row["Password"].'">
<img src="images/gmail_icon.png" width=24px">
</a>
</td>
JS代码:
完全删除循环中定义的现有侦听器。此侦听器将管理您的警报:
$(document).on("click", ".confirmation", function(e){
e.preventDefault();
var mail= $(this).data("mail");
if (confirm("You are sending the password to " + mail +". Are you sure?")) {
var href = $(this).attr('href');
$.ajax({
type: "GET",
dataType : "html",
url: href,
success: function (data){
alert(data);
}
});
}
});
更新 2:
正如您指出的那样,有一些东西会导致您的代码中出现循环,并不断显示确认信息。我看不出是什么原因造成的,但这是另一个应该万无一失的替代方案:
在您的 PHP中,将其更改为:
<td class="text-center" style="width: 60px">
<a onclick="sendMail(\''.$row["Gmail"].'\',\'mail_'.$row["School"].'.php?firstname='.utf8_encode($row["First_Name"]).'&lastname='.utf8_encode($row["Last_Name"]).'&number='.$row["Number"].
'&gmail='.$row["Gmail"].'&password='.$row["Password"].'\')">
<img src="images/gmail_icon.png" width="24px">
</a>
</td>
连同这个JS 函数:
function sendMail(mail, href)
{
if (confirm("You are sending the password to " + mail +". Are you sure?")) {
$.ajax({
type: "GET",
dataType : "html",
url: href,
success: function (data){
alert(data);
}
});
}
}
推荐阅读
- python - 如何在numpy中将[a,b,c]转换为[a+b+c,b+c,c]?
- python - 上下文添加底图错误:推断的缩放级别无效(CRS 匹配)
- javascript - react-pdf/renderer - 无法读取未定义的属性(读取“高度”)
- python - 从窗口中删除 matplotlib 绘图/tkinter 画布
- amazon-web-services - 无法使用 eskctl 获取节点组信息
- python - 第 1 列有多个值,第 2 列中的值不同。需要使用逗号分隔第 2 列值
- linux - 无法在 linux vm 中解析到 github
- asp.net - 从 xUnit 测试项目启动 ASP.NET Web api
- python - 如何查看 argparse.NameSpace Python 对象的属性?
- webhooks - 带有 webhook 实现的 Google Assistant 自定义操作