
在Web开发中,我们经常需要从数据库中获取数据,并通过服务器端语言(如PHP)循环生成HTML元素列表。当这些动态生成的元素需要进行用户交互时,一种常见的但不推荐的做法是在PHP循环内部为每个元素生成独立的JavaScript函数和内联事件处理代码。
例如,在提供的原始代码中,PHP循环为每一行表格(zuojiankuohaophpcntr>)生成了唯一的ID(如id="line<?php echo $x;?>"),并为按钮、输入框和选择框等交互元素绑定了内联的onclick、onkeyup、onchange事件,这些事件又调用了以行号命名的独立JavaScript函数(如hiddenLine<?php echo $x;?>()、editSave<?php echo $x;?>())。这种模式带来了诸多问题:
为了解决这些问题,我们应该采用更现代、更高效的JavaScript事件处理和DOM操作方法。
优化动态生成内容的JavaScript交互,主要依赖以下三个核心策略:
立即学习“PHP免费学习笔记(深入)”;
事件委托是一种利用事件冒泡机制的技术。它不是为每个子元素都添加一个事件监听器,而是将一个监听器添加到它们的共同父元素上。当子元素上的事件被触发时,该事件会向上冒泡到父元素,父元素上的监听器就能捕获到这个事件。通过检查event.target属性,我们可以确定是哪个子元素触发了事件,并据此执行相应的逻辑。
优点:
在处理多个具有相同行为或样式的元素时,应优先使用CSS类(class)而不是唯一的ID(id)。虽然ID在DOM中是唯一的,但当我们需要对一组元素应用相同的行为时,类是更合适的选择。我们可以为具有特定功能的元素(如“隐藏/显示按钮”、“品牌输入框”)分配一个通用类名。
优点:
对于需要唯一标识的数据,例如数据库中的记录ID,可以通过HTML5的data-*属性(如data-item-id="123")存储在元素上,而不是将其作为ID的一部分。
结合事件委托,以下DOM操作方法是实现高效交互的关键:
我们将根据上述策略,重构原始的PHP和JavaScript代码。
首先,修改PHP代码,移除内联事件处理属性(onclick, onkeyup, onchange),并将唯一的ID替换为通用的类名。同时,使用data-*属性存储每行的唯一标识符(item['id'])和行索引。
<table id="mySEARCH" class="shoppinglist-content">
<!-- ************************************************************************ shopping list beginn-->
<?php
if(isset($_COOKIE['shoppinglist'])){
$list = $_COOKIE['shoppinglist'];
$stmt = $pdo->prepare("SELECT * FROM `$list`");
$stmt->execute();
$x = 0;
foreach($stmt as $item)
{ $x++;?>
<!-- 为每行添加一个通用类和data属性来存储item ID -->
<tr class="shopping-list-item-row" data-item-id="<?php echo $item['id'];?>" data-row-index="<?php echo $x;?>" style="opacity: 1.0;">
<td>
<!-- 移除onclick,使用类名 -->
<button class="btn-hide-row-trigger" name='activ' value="true">
<img class="list-icon visibility-icon" src="images/icon-invisible.png" />
</button>
</td>
<form action='calculate.php' method='post'>
<td class="pcs-unit-list"><?php echo $item['pieces']." ".$item['unit']?></td>
<td name='item' class="shop-list-item"><?php echo $item['item']?></td>
<td class="brand-list">
<!-- 移除onkeyup,使用类名 -->
<input type='text' class="brand-input" name='brand' value="<?php echo $item['brand']?>">
</td>
<td class="kind-list">
<!-- 移除onchange,使用类名 -->
<select class="shoppinglist-kind item-kind-select" name='item-kind'>
<option value=""></option>
<option value="Gemüse" <?php if($item['kind'] == "Gemüse") echo "selected"?>>Gemüse</option>
<option value="Obst" <?php if($item['kind'] == "Obst") echo "selected"?>>Obst</option>
<option value="Fleisch" <?php if($item['kind'] == "Fleisch") echo "selected"?>>Fleisch</option>
<option value="Fisch" <?php if($item['kind'] == "Fisch") echo "selected"?>>Fisch</option>
<option value="Getreideprod." <?php if($item['kind'] == "Getreideprod.") echo "selected"?>>Getreideprod.</option>
<option value="Milchprod." <?php if($item['kind'] == "Milchprod.") echo "selected"?>>Milchprod.</option>
<option value="Gewürze" <?php if($item['kind'] == "Gewürze") echo "selected"?>>Gewürze</option>
<option value="Knabbern" <?php if($item['kind'] == "Knabbern") echo "selected"?>>Knabbern</option>
<option value="Getränke" <?php if($item['kind'] == "Getränke") echo "selected"?>>Getränke</option>
<option value="Kräuter" <?php if($item['kind'] == "Kräuter") echo "selected"?>>Kräuter</option>
<option value='Hygiene' <?php if($item['kind'] == "Hygiene") echo "selected"?>>Hygiene</option>
<option value='Putzen' <?php if($item['kind'] == "Putzen") echo "selected"?>>Putzen</option>
<option value='Haustier' <?php if($item['kind'] == "Haustier") echo "selected"?>>Haustiere</option>
<option value='Sonstiges' <?php if($item['kind'] == "Sonstiges") echo "selected"?>>Sonstiges</option>
</select>
</td>
<以上就是PHP循环中JavaScript代码去重与高效事件处理指南的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号