javascript - PHP 在 HTML 中插入不在回显字符串中的字符
问题描述
当我尝试在 onclick 属性中回显一个按钮时,php 正在将 ="" 添加到字符串的末尾。
这会在 XAMPP 服务器上获取 sql 数据。它循环并构建了一个日历,显示我所有的账单,以及我是否每个月都支付了这些账单。我正在使用 AJAX 更新数据库并更改每个月单击按钮的付费值。
我尝试了各种使用单引号和双引号并转义字符串中的引号的方法,但我仍然无法正确输出。
echo $billName
foreach ($months as $v) {
//$clickstring = 'onclick="setCalendar("'.$billName.'","'.$v.'")';
$clickstring = "onclick=\"setCalendar(\"".$billName."\",\"".$v."\")";
if ($row["$v"] == "1") {
echo '<button class="paidBtn green-text"'.$clickstring . '><i class="fa fa-check" aria-hidden="true"></i></button>';
} else {
echo '<button class="unpaidBtn red-text"'.$clickstring.'><i class="fa fa-times" aria-hidden="true"></i></button>';
}
例如在第一次迭代 $billname = "Amazon"; 和 $v = "一月"。在第一个回声亚马逊是正确的。但是,当它在双击中使用相同的变量时,它会在它之前插入一个空格,并且似乎执行 strtolower()。jan 插入正确,但之后会添加额外的字符和引号。这是浏览器的html输出:
<button class="unpaidBtn red-text" onclick="setCalendar(" amazon","jan")=""><i class="fa fa-times" aria-hidden="true"></i></button>
解决方案
问题是您回显的 html 看起来像这样
onclick="setCalendar("something", "month")"
请注意您是如何在该 HTML 属性的双引号内添加双引号的?你不能这样做,因为它会过早地结束你的点击。您可以通过各种方式解决这个问题,例如使用 \ 转义它,但这会变得复杂,因为您的 php 您必须转义看起来像 \\ 的 \ ,这会变得很疯狂。
只有一种可能的方式来重写它,使用单引号作为 onclick 参数
echo $billName;
foreach ($months as $v) {
$className = ($row[$v] == 1) ? 'paidBtn green-text' : 'unpaidBtn red-text';
$icon = ($row[$v] == 1) ? 'check' : 'times';
echo "<button class=\"$className\" onclick=\"setCalendar('$billName', '$v'\")>";
echo "<i class=\"fa fa-$icon\" aria-hidden=\"true\"></i></button>";
}
我还用三元组对其进行了一些重构,并取出了两次有 html 的 if,这在 IMO 中有点多余。并取出字符串连接以使其更易于阅读。
推荐阅读
- x86 - 在将 XGETBV 的结果用于 XSETBV 之前,我应该还是不应该掩盖它们?
- cypress - 赛普拉斯:新的 cy.intercept() 方法是否应该模拟不是从浏览器发送的请求的响应,而是使用 cy.request() 方法?
- reactjs - 如果在输入字段中未进行任何更改,如何禁用提交按钮?
- swift - AFHTTPRequestOperation 的合适替代品是什么?
- jwt - springdoc:如何为请求设置默认的 JWT 令牌(演示 API)?
- powershell - PowerShell 远程处理未安装 MSI
- javascript - 如何使用material-ui动态添加/删除类名?
- swift - 是否有类似于 Java 中的 Reentrant Lock for Swift 的库?
- python - 这个生成器 for 循环的扩展形式是什么?
- android - ArcGIS Android SDK,使用vectorDrawable向mapView添加标记