Javascript通过PHP回应

时间:2010-10-09 06:38:51

标签: php javascript

echo "<br><font face='Segoe UI' color='blue'><a href='#' onClick='javascript:alert(".$nam.");return false;'>".$nam."</a></font>";

我想知道上面代码中是否存在语法错误。我不认为正在调用alert()。

谢谢!

3 个答案:

答案 0 :(得分:2)

我们说你有

$nam = 'test';
... your code

打印出来:

'javascript:alert(test); return false;'

也就是说,它正在尝试打印出一个javascript变量,例如从未初始化的“测试”。

你需要:

'javascript:alert(\"".$nam."\"); return false;'

现在有几条建议:

获取一个很好的Javascript调试器,例如Firefox的Web Developer工具栏或firebug。您可以立即看到问题。

请勿使用'javascript:'decleration。它已被弃用且不必要。

使用onclick,而不是onClick。 不推荐使用font标记,face和color属性也是如此。 关闭您的代码(&lt; br /&gt; vs&lt; br&gt;)。

不要注入javascript,php和html。我强烈建议你使用模板。

如果你使用弱引号(“,而不是”)php将在引号内插入变量。你不必连接。这些是等价的:

echo "javascript:alert('".$nam."');";
echo "javascript:alert('$nam');";

答案 1 :(得分:1)

除了tandu所说的:

echo "<br><font face='Segoe UI' color='blue'><a href='#' onClick='javascript:alert(".$nam.");return false;'>".$nam."</a></font>";

通过在JavaScript中混合使用PHP,HTML,样式,脚本和字符串文字,你真的在​​努力工作。

每次将一种字符串放入另一种字符串中时,您需要一种转义类型,否则该字符串可能会脱离其上下文。例如,考虑如果$nam包含单引号或双引号会发生什么。在您处理的数据是用户提交的情况下,这不仅仅是一个错误,而是一个XSS安全漏洞。

每次将文本字符串插入HTML时,都需要使用htmlspecialchars()。每次将文本字符串插入JavaScript文字时,都需要反斜杠 - 转义它。 addslashes()几乎但不太合适。 json_encode()要好得多,因为它可以将任何合适的PHP值转换为JavaScript文字,而不仅仅是字符串,并且确实是包含引号的完整文字,因此您无需添加它们。所以:

echo "<br><font face='Segoe UI' color='blue'><a href='#' onClick='alert(".htmlspecialchars(json_encode($nam)).");return false;'>".htmlspecialchars($nam)."</a></font>";

这当然是一个难以理解的混乱。让我们分离每一层以简化,并使用PHP本身而不是试图破解HTML字符串。 PHP是一种模板化语言,您也可以使用它!

<style type="text/css">
    #alerter {
        display: block;
        color: blue;
        font-family: "Segoe UI", sans-serif;
    }
</style>

...

<a id="alerter" href="#">
    <?php echo htmlspecialchars($nam); ?>
</a>

...

<script type="text/javascript">
    document.getElementById('alerter').onclick= function() {
        alert(<?php echo json_encode($nam); ?>);
        return false;
    };
</script>

这样可以更容易地应对并且可以轻松扩展到样式并同时编写大量类似链接。您也可以从DOM中获取$nam的值,以避免必须两次声明,一次在HTML中,一次在JS中。您还可以使用短名称定义函数,以避免必须输入htmlspecialchars()json_encode()

<?php
    function h($s) {
        echo htmlspecialchars($s, ENT_QUOTES, 'utf8');
    }
?>
<style type="text/css">
    .alerter {
        display: block;
        color: blue;
        font-family: "Segoe UI", sans-serif;
    }
</style>

...

<a class="alerter" href="#"><?php h($nam); ?></a>
<a class="alerter" href="#"><?php h($nam2); ?></a>

...

<script type="text/javascript">
    for (var i= document.links.length; i-->0;)
        if (document.links[0].className==='alerter')
            document.links[0].onclick= function() {
                alert(this.firstChild.data);
                return false;
            };
</script>

这是“不引人注目的脚本”的一个例子。

答案 2 :(得分:0)

alert()将字符串作为参数。转义双引号来执行此操作:\"

echo "<br><font face='Segoe UI' color='blue'><a href='#' onClick='javascript:alert(\"".$nam."\");return false;'>".$nam."</a></font>";