PHP语法问题:如何修正onclick事件中的代码?
咱们先拆解下你遇到的两个核心问题,然后一步步解决:
首先,你的代码当前报错的直接原因是引号嵌套冲突,其次你混淆了前端JS函数和后端PHP方法的运行逻辑,导致误以为要加$this->。
问题1:引号嵌套导致的语法错误
你看,onclick属性用了双引号包裹,而里面的PHP代码date("Y", ...)也用了双引号,这会让浏览器和PHP解析器都混乱——它们不知道哪个引号对应哪个边界。
解决这个问题有两种简单方式:
方式1:调整引号的嵌套规则
把onclick的属性值用单引号包裹,里面的JS参数用双引号,PHP代码里的字符串用单引号:
<a href="javascript:void(0);" onclick='getCalendar("calendar_div","<?php echo date('Y', strtotime($date . ' - 1 Month')); ?>","<?php echo date('m', strtotime($date . ' - 1 Month')); ?>");'> <span class="glyphicon glyphicon-chevron-left"></span> </a> <select name="month_dropdown" class="month_dropdown dropdown"> <?php echo $this->getAllMonths($dateMonth); ?> </select> <select name="year_dropdown" class="year_dropdown dropdown"> <?php echo $this->getYearList($dateYear); ?> </select> <a href="javascript:void(0);" onclick='getCalendar("calendar_div","<?php echo date('Y', strtotime($date . ' + 1 Month')); ?>","<?php echo date('m', strtotime($date . ' + 1 Month')); ?>");'> <span class="glyphicon glyphicon-chevron-right"></span> </a>
方式2:提前计算变量+用HEREDOC输出(更推荐,代码更易读)
先把需要的年月变量在PHP里计算好,再用HEREDOC语法输出HTML,彻底避免引号嵌套问题:
<?php // 提前计算前后一个月的年月 $prev_year = date('Y', strtotime($date . ' - 1 Month')); $prev_month = date('m', strtotime($date . ' - 1 Month')); $next_year = date('Y', strtotime($date . ' + 1 Month')); $next_month = date('m', strtotime($date . ' + 1 Month')); // 用HEREDOC输出HTML,引号完全不冲突 echo <<<HTML <a href="javascript:void(0);" onclick="getCalendar('calendar_div','$prev_year','$prev_month');"> <span class="glyphicon glyphicon-chevron-left"></span> </a> <select name="month_dropdown" class="month_dropdown dropdown"> {$this->getAllMonths($dateMonth)} </select> <select name="year_dropdown" class="year_dropdown dropdown"> {$this->getYearList($dateYear)} </select> <a href="javascript:void(0);" onclick="getCalendar('calendar_div','$next_year','$next_month');"> <span class="glyphicon glyphicon-chevron-right"></span> </a> HTML; ?>
问题2:为什么不能加$this->在getCalendar前?
这里要搞清楚两个核心概念:
$this->是后端PHP类的语法,用来调用当前类的方法/属性,运行在服务器上。getCalendar是前端JavaScript函数,运行在用户的浏览器里。
两者运行环境完全不同,你不能在前端的onclick事件里直接调用后端的PHP方法。如果你的getCalendar需要从后端获取数据,正确的做法是:让JS函数发送AJAX请求到你的PHP接口(比如一个处理日历数据的控制器方法),然后用返回的数据更新页面,而不是直接在onclick里写$this->getCalendar(...)。
总结
先修复引号嵌套问题,代码就能正常运行了;如果需要和后端交互,再通过AJAX来实现,不要混淆前后端的运行逻辑。
内容的提问来源于stack exchange,提问作者kaspianso
相关产品推荐
相关产品推荐

