首页 > 解决方案 > php 生成的字符串未正确传递给 javascript 函数

问题描述

总结我有一个简单的Javascript函数

<script>
  function PopUP($str) {alert($str);}
</script>

我正在尝试将一个长 JSON 字符串传递给 PopUP() 字符串是

{"Date":"2021-09-13 22:25:42","From":"simard57@hotmail.com","Sect":"Other","Villa#":"my villa","VillaName":"Resort","Owner":"Simard","OwnerSite":"https:\/\/donsimard.wix.com\/DomRepAI","BRs":"1 BR","StreetMBR":"0","StreetBR":"0","UpperMBR":"0","UpperBR":"0","LowerMBR":"0","LowerBR":"0","Comments":"testing"}

生成的 HREF 是

<a HREF="javascript:PopUP('{"Date":"2021-09-13 22:25:42","From":"simard57@hotmail.com","Sect":"Other","Villa#":"my villa","VillaName":"Resort","Owner":"Simard","OwnerSite":"https:\/\/donsimard.wix.com\/DomRepAI","BRs":"1 BR","StreetMBR":"0","StreetBR":"0","UpperMBR":"0","UpperBR":"0","LowerMBR":"0","LowerBR":"0","Comments":"testing"}')">JSON</a>

该链接似乎被截断并且没有被传递给 Javascript 函数。我错过了一些微不足道的事情吗?

---原帖---

我有一个表单正在由操作中的 php 文件处理。下面的代码片段。它收集通过 GET 传递的表单内容,并将 JSON 记录附加到日志文件的末尾

$pathToJSONFile ="LHVC_Logs/LHVCResortMapLog.json";
$jsonToLog = array(
   "Date" => date("Y-m-d H:i:s"), 
);
foreach ($_GET as $field => $entry) {
   $jsonToLog[$field] = $entry;
}
$json = json_encode($jsonToLog);
$json .= PHP_EOL;
$bytes = file_put_contents($pathToJSONFile, $json, FILE_APPEND);

我还写了一个网页来在表格中显示日志。使用表单中的条目并显示 json 记录,因此如果接受为有效更新,则可以轻松地将其从日志移动到另一个 json 文件中。

读取 json 的相关代码如下。读取日志文件,并通过 EOL 记录分隔符将其转换为数组。$log 关联数组由 json 字符串索引,并指向一个关联数组,其中包含每条记录的内容。

$json = file_get_contents($logFile);
$lines = explode(PHP_EOL, $json);
$log = array();
foreach ($lines as $line) {
  $log[$line] = json_decode($line,true);
}

在循环内创建一个 html 表

foreach ($log as $field => $entry) 
          ...
    $field = addslashes($field);
    echo "<td><a HREF=\"javascript:PopUP('$field')\">JSON</a></td>";
}

PopUP 脚本非常简单,它在警告框中显示传递给它的字符串

function PopUP($str) {alert($str);}) 

我遇到的问题是 PopUP 无法正常工作,因为 json 字符串未正确传递。

<tr id=RV1 class=Royal> 
    <td style='text-align:right'> <a href="#RoyalVillas"> Royal </a> </td> 
    <td> <a HREF="javascript:PopUP('Link not yet available!\nCheck back soon.')"> RV1 </a> </td> 
    <td>  </td><td>  </td> <td style='text-align:left'> <details> <summary> 3 </summary>Street:1 MBR,0 BR <br> Upper:0 MBR,2 BR <br> Lower: MBR, BR <br> </details></td> 
    <td style='text-align:left'> Very nice. Highly recommended. Upstairs Theatre Seating </td>
    <td><a HREF="javascript:PopUP('{\"Sect\":\"Royal\",\"Villa#\":\"1\",\"VillaName\":\"\",\"Owner\":\"\",\"OwnerSite\":\"\",\"BRs\":\"3\",\"StreetMBR\":\"1\",\"StreetBR\":\"0\",\"UpperMBR\":\"0\",\"UpperBR\":\"2\",\"LowerMBR\":\"\",\"LowerBR\":\"\",\"Comments\":\"Very nice. Highly recommended. Upstairs Theatre Seating\"}')">JSON</a></td></tr>

最后一个是不能正常工作的-第二个工作正常

我尝试删除将最后一个条目更改为的addslashes函数

<td><a HREF="javascript:PopUP('{"Sect":"Royal","Villa#":"1","VillaName":"","Owner":"","OwnerSite":"","BRs":"3","StreetMBR":"1","StreetBR":"0","UpperMBR":"0","UpperBR":"2","LowerMBR":"","LowerBR":"","Comments":"Very nice. Highly recommended. Upstairs Theatre Seating"}')">JSON</a></td>

看起来更漂亮但具有相同的症状。我相信这是因为引号,这就是为什么我首先做了addlashes。

很抱歉长时间的条目,但我希望我能得到一些关于如何完成我的意图的建议。

标签: javascriptphphtml

解决方案


呃——有趣的是,你的大脑如何说服自己,你的眼睛看到的是你的意图,而不是你所做的。

我将我的 php 更改为

$field=htmlspecialchars($field);
echo "<br><a HREF=\"javascript:PopUP('$field')\">JSON</a>";

现在一切都很好

感谢所有评论...


推荐阅读