簡體   English   中英

用於echo javascript函數的php語法

[英]php syntax for echo javascript function

我希望有人可以幫助我解決這個小問題。 問題是我仍然對語法感到困惑

php行echo是一個javascript函數,它帶有一個參數,即數據庫值。

需要對其進行糾正,以使其正常工作。 多余的逗號?轉義? 我永遠不知道確切在哪里。

while($row=mysql_fetch_array($r)){
     echo '<li onclick="fill(\''.$row["value"].'\');">'.$row["value"].'</li>';

}

編輯,因為我剛剛發現我的語法是正確的。 我只需要包含反斜杠。 看來javascript函數引起了問題。 特別是隱藏列表的行

有人對此有解決方案嗎?

function fill(thisValue) {
    $('#inputString').val(thisValue);
   //$('#suggesties').hide();

}

編輯我終於想到了:回調

function fill(thisValue) {

     $('#suggesties').fadeOut('fast',function(){
        $('#inputString').val(thisValue);
    });

    }

謝謝,理查德

我建議也將字符串轉義以用於javascript。 json_encode可以解決問題。 還有html部分, 如果它不應該包含html

echo '<li onclick="fill('.htmlentities(json_encode($row["value"])).');">'.htmlspecialchars($row["value"]).'</li>';

您可以將PHP保留在PHP標記內。 有時,它比轉義許多地方容易:

<?php while($row=mysql_fetch_array($r)) { ?>
  <li onclick="fill('<?php print $row["value"]; ?>');">
    <?php print $row["value"]; ?>
  </li>
<?php } ?>
echo '<li onclick="fill(\''.$row["value"].'\');">'.$row["value"].'</li>';

哎喲。 您已經在HTML編碼的屬性和HTML字符串的內部包含了JavaScript字符串。 難怪逃脫使您感到困惑。

好吧,首先:您要在列表項的文本中輸出$row['value']而不進行轉義。 當該值包含特殊字符(例如<&" )時,就意味着麻煩(可能是安全問題)。需要將其包裝在htmlspecialchars()

接下來,將某些內容放入JavaScript字符串文字中。 這意味着,如果在值中使用字符串定界符'或轉義的反斜杠\\ ,則它可能會脫離字符串並將JavaScript代碼注入頁面:再次,這是潛在的安全問題。 addslashes()可用於轉義包含在JS字符串文字中的字符串; 請注意,之后您仍然必須對其進行htmlspecialchars() ,因為字符串文字本身位於HTML編碼的屬性內。

所以我們在看:

echo "<li onclick=\"fill('".htmlspecialchars(addslashes($row['value']), ENT_QUOTES)."');\">".htmlspecialchars($row['value']).'</li>';

不是很可讀,是嗎? 好吧,我們可以改善這一點:

  1. 我們可以通過使用PHP本身對字符串進行插值來丟失PHP字符串文字(如Jonathan所示)。 PHP是一種模板語言,請利用它!

  2. 我們可以定義一個名稱比htmlspecialchars短的函數,這是一個好主意,因為我們需要在典型的模板中大量使用該函數。

  3. 我們可以通過讓JavaScript端從列表項(jQuery中的text()的內容中讀取所需的數據來避免JavaScript字符串,而不必將其包裝在丑陋的內聯事件處理程序。

例如:

<?php
    function h($text) {
        echo(htmlspecialchars($text, ENT_QUOTES));
    }
?>

<ul id="suggesties">
    <?php while ($row= mysql_fetch_array($r)) { ?>
        <li><?php h($row['value']); ?></li>
    <?php } ?>
</ul>

<script type="text/javascript">
    $('#suggesties>li').click(function() {
        $('#inputString').val($(this).text());
        $('#suggesties').hide();
    });
</script>

嘗試像這樣轉義:

while($row=mysql_fetch_array($r)){
 echo '<li onclick="fill(\''.$row["value"].'\');">'.$row["value"].'</li>';

}

刪除value周圍的引號,使您擁有$row[value]而不是$row["value"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM