javascript - 如何制作一个完整的可选择的?
问题描述
我看过一些关于使整个 div 可点击的帖子,但我希望使其可选择。
我所拥有的是一个 php while 循环,它根据用户输入到 mySQL 数据库中显示一个表。该代码如下所示:
<div class='tracksub'>
<div class='headname'><div class='headtext'>Name</div></div>
<div class='headtype'><div class='headtext'>Type</div></div>
<div class='headbrand'><div class='headtext'>Brand</div></div>
<div class='headedp'><div class='headtext'>EDP</div></div>
<div class='headdiameter'><div class='headtext'>Diameter</div></div>
<div class='headflutes'><div class='headtext'>Flutes</div></div>
<!-- <div class='headaddremove'><div class='headtext'>Add/Remove Tool</div></div> -->
</div>";
$i = 0;
while($row = mysqli_fetch_assoc($resulttable)){
if($i%2 == 0){
echo "<div class='even' id='" . $row['pKey'] . "'>";
echo "<div class='name'><div class='tracktext'><a class='tracklink'>" . $row['name'] . "</a></div></div>";
echo "<div class='type'><div class='tracktext'>" . $row['type'] . "</div></div>";
echo "<div class='brand'><div class='tracktext'>" . $row['brand'] . "</div></div>";
echo "<div class='edp'><div class='tracktext'>" . $row['part_number'] . "</div></div>";
echo "<div class='diameter'><div class='tracktext'>" . $row['cutting_diam'] . "</div></div>";
echo "<div class='flutes'><div class='tracktext'>" . $row['flutes'] . "</div></div>";
//echo "<div class='addremove'><form id='addremove' method='POST' action=''><button type='submit' class='addbtn' name='add" . $row['pKey'] . "'>Add</button><button type='submit' class='removebtn' name='remove" . $row['pKey'] . "'>Remove</button></form></div>";
echo "</div>";
} else {
echo "<div class='odd'>";
echo "<div class='name'><div class='tracktext'><a href='" . $row['image'] . "'>" . $row['name'] . "</a></div></div>";
echo "<div class='type'><div class='tracktext'>" . $row['type'] . "</div></div>";
echo "<div class='brand'><div class='tracktext'>" . $row['brand'] . "</div></div>";
echo "<div class='edp'><div class='tracktext'>" . $row['part_number'] . "</div></div>";
echo "<div class='diameter'><div class='tracktext'>" . $row['cutting_diam'] . "</div></div>";
echo "<div class='flutes'><div class='tracktext'>" . $row['flutes'] . "</div></div>";
//echo "<div class='addremove'><form id='addremove' method='POST' action=''><button type='submit' class='addbtn' name='add" . $row['pKey'] . "'>Add</button><button type='submit' class='removebtn' name='remove" . $row['pKey'] . "'>Remove</button></form></div>";
echo "</div>";
}
if(isset($_POST['add' . $row['pKey'] .''])){
$add = $row['pKey'];
$sql = "UPDATE `cutting tools` SET `qty` = `qty` + 1 WHERE `pKey` = '$add'";
$conn->query($sql);
}
if(isset($_POST['remove' . $row['pKey'] .''])){
$remove = $row['pKey'];
$sql = "UPDATE `cutting tools` SET `qty` = `qty` - 1 WHERE `pKey` = '$remove'";
$conn->query($sql);
}
$i++;
}
echo "</div>";
我想选择的 div 是 class="even" 和 class="odd" (每一个都是相同的,每一行都有一个交替的背景颜色)。当用户选择这一整行时,我想显示 mySQL 表中未显示在选择条目的表中的某些数据。布局看起来像这样:
<div class="rightbox">
<div class="tbdrawer">
</div>
<div class="bininfo">
<div>
<div class="toolimg">
<img src="" /> <!--src comes from selected mySQL row -->
</div>
<div class="toolinfoextra">
<!-- a couple rows of additional info go here -->
</div>
</div>
我对如何解决这个问题有一些想法,但在大多数情况下,我很困惑。
- 将 class="odd" 和 class="even" 内容放在提交按钮中并删除所有格式 - 实质上使按钮不可见。通过这种方式,我可以跟踪按下了哪个按钮并通过执行以下操作显示其余数据:
if(isset($_POST['. $row['pKey'] .'])){ //where the buttons name is the primary key
$imglink = $row['image'];
$length = $row['length'];
}
依此类推,我要显示的每条数据。然后在每个 div 中,我可以回显 $length 等等,使特定数据可显示。
- 我的另一个想法是使用 Javascript 使每个选项都可以选择,但我对这种方法没有太多的运气。如您所见,我希望可选择的 div 的 class="even" 的 ID 等于该 mySQL 行的主键。这里的想法是让我可以执行以下操作:
"<script type="text/javascript">
$( "#" . $row['pKey'] . "" ).focus(function() {"
$imglink = $row['image'];
"});
</script>"
然后基本上做与 PHP 方法相同的操作,其中每个 div 都在回显仅在选择行时才填充的变量。
我在哪里错了?任何指示或更好的方法来解决这个问题?
解决方案
将您的逻辑与演示文稿分开:
将您的脚本放入这种标准格式将避免许多心痛,并有助于防止编写意大利面条式代码
<?php
// all processing of user input, database access, and business logic happens here
// initialize database connection here, proper connection left to reader
$pdo = new PDO($dsn, $user, $pass, $options);
// This is an example of PRG (Post-Redirect-Get) pattern. This eliminates resubmissions and back button traps
// this section roughly corresponds to the controller in MVC
if(isset($_POST['add')){
$sql = "UPDATE `cutting tools` SET `qty` = `qty` + 1 WHERE `pKey` = ?";
$pdo->prepare($sql);
$pdo->execute ($_POST['id']);
header('Location: /';
die;
}
if(isset($_POST['remove')){
$sql = "UPDATE `cutting tools` SET `qty` = `qty` - 1 WHERE `pKey` = ?";
$pdo->prepare($sql);
$pdo->execute ($_POST['id']);
header('Location: /';
die;
}
// code to get $resultTable...
// all done with logic, now show view, using php only as necessary for looping and filling in data
?>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<!— snip —>
<!— BTW, it’s OK to use tables for tabular data! Really! —>
<div class='tracksub'>
<div class='headname'>
<div class='headtext'>Name</div>
</div>
<div class='headtype'>
<div class='headtext'>Type</div>
</div>
<div class='headbrand'>
<div class='headtext'>Brand</div>
</div>
<div class='headedp'><div class='headtext'>EDP</div></div>
<div class='headdiameter'>
<div class='headtext'>Diameter</div>
</div>
<div class='headflutes'>
<div class='headtext'>Flutes</div>
</div>
<!-- <div class='headaddremove'><div class='headtext'>Add/Remove Tool</div></div> -->
</div>
<?php $evenOdd = 'even'; ?>
<?php while($row = mysqli_fetch_assoc($resulttable)):?>
<div
class="<?= $evenOdd == 'even' ? 'odd' : 'even' ?>"
data-id="<?=$row['pKey']?>"
>
<div class="name">
<div class="tracktext"><a class="tracklink"><?=$row['name']?></a></div>
</div>
<div class="type">
<div class="tracktext"><?=$row['type']?></div>
</div>
<div class="brand">
<div class="tracktext"><?=$row['brand']?></div>
</div>
<div class="edp">
<div class='tracktext'><?=$row['part_number']?></div>
</div>
<div class='diameter'>
<div class='tracktext'><?=$row['cutting_diam']?></div>
</div>
<div class='flutes'>
<div class='tracktext'><?=$row['flutes']?></div>
</div>
<div class='addremove'>
<form id='addremove' method='POST' action=''>
<input type="hidden" name="id" value="<?=$row['pKey']?>" >
<button type='submit' class='addbtn' name='add'>Add</button><button type='submit' class='removebtn' name='remove'>Remove</button>
</form>
</div>
<?php endwhile; ?>
添加 Javascript (JQuery)
既然演示与 PHP 逻辑分离,使用 HTML/JavaScript 脚本就容易多了。您不必为进出引号、单引号与双引号、您正在做的事情之间的数英里代码而烦恼。
添加jQuery:
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
...
至少有两种方法可以解决这个问题:
- 使用 ajax
- 在 while 循环中显示和隐藏数据
此示例将使用第二种方法,并假设您要使用容器,
<div class="rightbox">
<div class="tbdrawer">
</div>
<div class="bininfo">
<div>
<div class="toolimg">
<img src="" /> <!--src comes from selected mySQL row -->
</div>
<div class="toolinfoextra">
<!-- a couple rows of additional info go here -->
</div>
</div>
将类 ( tableRow
) 添加到偶数/奇数 div 以用作挂钩:
<div
class="table-row <?= $evenOdd == 'even' ? 'odd' : 'even' ?>"
data-id="<?=$row['pKey']?>"
>
我之前输入属性 data-id 希望使用 ajax,但现在,只需为图像添加一个 data-image-src :
<div
class="table-row <?= $evenOdd == 'even' ? 'odd' : 'even' ?>"
data-id="<?=$row['pKey']?>"
data-image-src="<?=$row['image']?>"
>
现在在页面底部,添加一个事件监听器
<script>
$(document).ready(function() {
$('.table-row').on('click', function() {
console.log( $(this).data('image');
});
}
</script>
单击一行时,您应该会在浏览器控制台中看到图像 url。
未完待续...
推荐阅读
- sql - 基于另一个字段的案例陈述结果
- python - 寻找一个正则表达式来匹配以下
- asp.net-mvc - 如果未关闭,则自动关闭或自动格式化 razor 动态内容中的 html 标记
- java - 如何处理java servlet中的多个查询
- html - 谷歌自动完成地图搜索
- android-layout - 如何以编程方式创建具有圆角半径的波纹?
- python - 在 matplotlib 中重复相同的子图
- javascript - 如何使用 jQuery 获取每个元素的索引号
- docker - 在docker中以supervisord作为CMD运行Lucee(tomcat),奇怪的路径问题
- android - Trying to create a PDF from a listview