javascript - Javascript不在php循环中打印
问题描述
php 和 javascript 的新手。我正在尝试在 php 循环中使用 javascript 打印一个 id,但没有任何结果。这是代码:
$sql = "SELECT dueDate, assignmentName, className FROM assignments INNER JOIN classes ON assignments.class = classes.id ORDER BY DATE(dueDate)";
if ($result = mysqli_query($link, $sql)) {
if (mysqli_num_rows($result) > 0) {
echo "Assignments";
while ($row = mysqli_fetch_array($result)) {
echo '<div class="popup" id="popup">';
echo '<div class="overlay"></div>';
echo '<div class = "content">' . $row['dueDate'] . $row['className'] . '</div>';
echo '<div class="close-btn content" onclick="togglePopup()">×</div>';
echo '<div class = "btn-group">' . '<button onclick="togglePopup()">' . $row['assignmentName'] . '</button>' . '</div>';
echo '</div>';
echo '<script type=\"text/javascript\"> document.write(printID()); </script>';
}
}
解决方案
问题是,您希望 PHP 知道printID()
它是什么以及它应该做什么。PHP 对 JavaScript 函数一无所知,因为 JavaScript 和 PHP 在完全不同的地方执行。PHP 呈现您的 HTML 并向您的浏览器发送响应,该浏览器执行 JavaScript。当 PHP 处理数据时,JavaScript 不会被执行。
你可以做一件事。等到所有内容都呈现并在</body>
标记之前的 HTML 末尾执行您的 JavaScript 函数。
document.addEventListener('DOMContentLoaded', (event) => {
const elements = document.querySelectorAll('.popup');
Array.prototype.forEach.call(elements, (element) => {
let id = printID();
element.appendChild(document.createTextNode(id));
});
});
上面的代码片段是什么?它等待并将被执行,直到所有 DOM 被加载。然后它使用名为“popup”的 css 类搜索所有元素。顺便说一句,您的代码中还有另一个问题。您正在使用循环处理数据库查询结果,并且正在使用 id 属性。Id 属性只能在您的标记中使用一次。所以请使用 css 类而不是 id 属性。使用类名“popup”时,您可以读出所有元素并执行您的 javascript 函数printID()
并附加一个新元素。而已。
您的失败在于,您没有认识到 JavaScript 是一种客户端语言,并且不是由 php 执行的。即使它是用 html 模板编写的。
一种可能的更好的方法
正如您所说,您想更改togglePopup
JavaScript 函数中的参数。以下代码显示了一个可能的解决方案。
<?php
...
$i = 0;
while ($row = mysqli_fetch_array($result)) {
echo '<div class="popup">';
echo '<div class="overlay"></div>';
echo '<div class = "content">' . $row['dueDate'] . $row['className'] . '</div>';
echo '<div class="close-btn content">×</div>';
echo '<div class = "btn-group">' . '<button id="popup-' . $i . '">' . $row['assignmentName'] . '</button>' . '</div>';
echo '</div>';
$i++;
}
与其放置 onclick 属性,不如将其省略。而是在按钮元素上放置一个 id 参数。请记住,id 参数的值必须是唯一的。除了使用 id 属性,您还可以使用数据属性,例如data-id="my-value"
. 数据属性确保该属性的值不必是唯一的。只是为了向您展示可能的方法...
在</body>
标签之前的 HTML 末尾放置以下内容。
<script>
const togglePopup = (event) => {
let target = event.target;
let id = target.getAttribute('id');
// do something with the id attribute
}
document.addEventListener('DOMContentLoaded', (event) => {
const elements = document.querySelectorAll('.popup button[id^="popup-"]');
Array.prototype.forEach.call(elements, (element) => {
element.addEventListener('click', togglePopup);
});
});
</script>
这个小片段为元素内的每个按钮添加了一个单击事件处理程序,该元素的类.popup
具有以 . 开头的 id 属性popup-
。单击此按钮时,将调用 togglePopup 函数。在这个函数内部,id 属性来自目标元素。
使用此解决方案,您可以保持 html 标记干净,并且所有 javascript 内容都与 php 代码分离。
推荐阅读
- mysql - 无法通过 AWS.RDS.Signer 连接到 RDS
- python - 在for循环中返回多个值?
- node.js - Node.js 如何将 multer 字段上传到 AWS s3
- ubuntu - 在 Ubuntu 的 PHP CI 中将静态 json 文件存储在哪里?
- twilio - 使用 twilio 和 node js 通过 whatsapp 发送订单详情
- javascript - 节点js中的get-request参数(不带express)
- python - 获取 Rasa Core/NLU 中的 Intent 排名列表
- c# - c# 从四个数字创建唯一键并检查重复项
- rest - 本地主机已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态
- amazon-web-services - 了解 IAM 主体