- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在通过 PHP 从 mysql 查询创建一个 html 表。我用查询结果集中的一条记录填充每个表行。
我使用 javascript 函数 getElementById
来显示或关闭对话框。
因为我有很多行,所以我将 javascript 代码添加到 while 循环/表数据中。这会创建大量的 javacode,我非常确定这是不良做法的一个很好的例子。
如何在不为每一行生成(以编程方式)唯一的 javascript 函数的情况下执行此操作?数组是可行的方法吗?
这是我的代码
<?php while($r = mysqli_fetch_assoc($result)){ $current_row_number++; ?>
<tr>
<td>
<!--Popup Window-->
<dialog id="window<?php echo $current_row_number; ?>">
<h3>Description</h3>
<p><?php echo $r['description']; ?></p>
<button id="exit<?php echo $current_row_number; ?>">Close</button>
</dialog>
<button id="show<?php echo $current_row_number; ?>">View</button>
<!--Popup Window-->
<script type="text/javascript">
var dialog<?php echo $current_row_number; ?> = document.getElementById('window<?php echo $current_row_number; ?>');
document.getElementById('show<?php echo $current_row_number; ?>').onclick = function() { dialog<?php echo $current_row_number; ?>.show(); };
document.getElementById('exit<?php echo $current_row_number; ?>').onclick = function() { dialog<?php echo $current_row_number; ?>.close(); };
</script>
</td>
</tr>
<?php } ?>
生成此示例输出:
<script type="text/javascript">
var dialog8 = document.getElementById('window8');
document.getElementById('show8').onclick = function() { dialog8.show(); };
document.getElementById('exit8').onclick = function() { dialog8.close(); };
</script>
<script type="text/javascript">
var dialog9 = document.getElementById('window9');
document.getElementById('show9').onclick = function() { dialog9.show(); };
document.getElementById('exit9').onclick = function() { dialog9.close(); };
</script>
<script type="text/javascript">
var dialog10 = document.getElementById('window10');
document.getElementById('show10').onclick = function() { dialog10.show(); };
document.getElementById('exit10').onclick = function() { dialog10.close(); };
</script>
等等……
我不需要一个完整的例子,但如果你能把我推向正确的方向,我会很高兴。我想摆脱那个 $current_row_number
...
在代码中重复执行任务是不好的做法,java 脚本代码看起来很垃圾
提前致谢
最佳答案
是的,确实没有必要。
在事件处理程序中,this
指的是事件处理程序附加到的元素,事件对象的 target
属性告诉您事件从哪里开始。您可以使用此信息在表上设置一个处理程序来处理对这些按钮的点击。在按钮上放置一个类,指示它们是应该“显示”还是“隐藏”,然后执行如下操作(参见注释):
document.getElementById("the-table").addEventListener("click", function(e) {
// Find the row
var row = e.target;
while (row.tagName != "TR") {
if (row === this) {
// The click wasn't on a row, ignore it
return;
}
row = row.parentNode;
}
// Find the button
var button = e.target;
while (button.tagName != "BUTTON") {
if (button === this) {
// The click wasn't on a button, ignore it
return;
}
button = button.parentNode;
}
// Find the dialog
var dialog = row.querySelector("dialog");
if (!dialog) {
// Couldn't find it
return;
}
// Now, use the `className` or `classList` on `button` to determine
// whether to show or hide, and do that on `dialog`
}, false);
当然,您可以将其中的一些封装在实用函数中(或使用已有的库,如 jQuery)。
这是一个简化的示例,使用 h3
而不是 dialog
:
document.getElementById("the-table").addEventListener("click", function(e) {
// Find the row
var row = e.target;
while (row.tagName != "TR") {
if (row === this) {
// The click wasn't on a row, ignore it
return;
}
row = row.parentNode;
}
// Find the button
var button = e.target;
while (button.tagName != "BUTTON") {
if (button === this) {
// The click wasn't on a button, ignore it
return;
}
button = button.parentNode;
}
// Find the "dialog"
var dialog = row.querySelector("h3");
if (!dialog) {
// Couldn't find it
return;
}
// Now, use the `className` or `classList` on `button` to determine
// whether to show or hide, and do that on `dialog`
if (button.className == "show") {
dialog.className = "";
} else {
dialog.className = "hidden";
}
}, false);
.hidden {
display: none;
}
<table id="the-table">
<tbody>
<tr>
<td>
<h3 class="hidden">Dialog 1</h3>
<div>
<button class="show">Show 1</button>
<button class="hide">Hide 1</button>
</div>
</td>
</tr>
<tr>
<td>
<h3 class="hidden">Dialog 2</h3>
<div>
<button class="show">Show 2</button>
<button class="hide">Hide 2</button>
</div>
</td>
</tr>
<tr>
<td>
<h3 class="hidden">Dialog 3</h3>
<div>
<button class="show">Show 3</button>
<button class="hide">Hide 3</button>
</div>
</td>
</tr>
<tr>
<td>
<h3 class="hidden">Dialog 4</h3>
<div>
<button class="show">Show 4</button>
<button class="hide">Hide 4</button>
</div>
</td>
</tr>
</tbody>
</table>
关于javascript - 错误做法 - 从 PHP while 循环为 getElementbyID 生成 javascript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40204659/
我有不同的 div,每个 div 都有一个调用相同函数的按钮。 . . . INIT . . . INIT 棘手的部分是每个按钮应该只对自己的 div 执行函数(#btn1 到 #div1、#
XSP.getElementById 和 document.getElementById 之间有什么区别?在我的测试中,两者似乎都返回相同的值(存储在字段中的值)。为 XPage 编码时应首选哪一个?
我通常会通过以下方式为某些事件注册 javascript 函数: myBtn.Attributes.Add("onClick", "Validate(getElementById('"+txtFirs
当我想检查页面中是否存在某个元素时。这两个检查是一样的吗?有没有更好更紧凑的方法来检查是否存在? 如果我想检查 value == '' 该怎么办。这也可以包含在这张支票中吗? 最佳答案 对元素的引用永
我尝试将新值分配给输入表单的隐藏输入和复选框。它在 Firefox 中工作正常,但在 IE 中则不然(我使用的是 IE 7)。有谁知道我的代码有什么问题吗? HTML: Javascript: v
我真的不知道如何描述我的问题,但基本上: 为了好玩,我在 JSFiddle 中编写了一个元素,不知何故我的代码输出只是上下跳动。 如果您想亲自查看,请单击下面的链接,然后单击“提交投诉”按钮。 问题是
document.getElementById("test").value document.getElementById("test").innerHTML 第一个表示地址,第二个表示存储在该地址的
在将 html block 插入 dom 之前,我对在 dom 外构建 html block 很感兴趣,因此我使用 dynatrace 进行了一些测试。我使用了bobince的方法: Is there
我在 GWT 应用程序中使用 native 函数,我尝试了这两种方法: document.getElementById("id") 返回 null 但 $doc.getElementById() 返回
以下代码有什么区别: Hover Over me SomeLink1 SomeLink2 SomeLink3
我正在尝试使用 javascript 设置 div 的内部 html,但由于某种原因,它不起作用。我发现其他人以前也遇到过这个问题,但我在其他帖子中找到的解决方案均无效。我不明白怎么了。 这是我的测试
编辑:我修复了分号、区分大小写以及方括号。如果我删除 buttonPARTICULAR 之后的函数,代码就可以工作!为什么? 编辑:固定。我是个笨蛋。对不起!!! :-Z 当我保持简单时,就像这样,一
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
我正在尝试创建一个通用的 JavaScript 函数来更改事件的属性。 它的工作方式是 function fooFunction(sourceElement) { var newName =
我需要获取元素的 ID,但该值是动态的,只有它的开头始终相同。 这是一段代码。 ID 总是以 poll- 开头,然后数字是动态的。 如何只使用 JavaScript 而不是 jQuery 获取 ID
我需要使用 VBA 从 HTML 中提取某些信息。 这是我试图单独提取位置信息的 HTML。 Location Dallas/Fort Worth Area Industry
我正在制作一个程序,该程序从输入字段返回值,然后根据条件将字段字符串更改为 x 结果。非常感谢您的帮助,因为这里的成员过去一直给我很大帮助。调试器抛出此错误,当然没有任何效果: script.js:2
我不确定为什么这不起作用,有人可以告诉我为什么吗? var red = [0, 100, 63]; var orange = [40, 100, 60]; var green = [75, 100,
这个问题已经有答案了: Javascript Shorthand for getElementById (24 个回答) 已关闭 8 年前。 我的下面的代码工作正常,但我想知道,是否有任何仅通过 Ja
我有这个simple HTML 标记: //a reserved property name id //same here 但是——运行: alert(document.getEle
我是一名优秀的程序员,十分优秀!