从包含引号的PHP函数返回大量JavaScript

时间:2014-08-15 10:08:26

标签: javascript php return

我在php中有以下函数,它接受一个参数,意味着输出带有参数的javascript代码。

我有两个问题:

  1. 返回用引号封装了javascript代码,但是javascript代码本身的引号实际上是导致它提前中断。

  2. javascript中的$标记无效,因为我认为jquery $标记被视为php $,有什么方法可以让javascript代码段中的美元符号和引号不会混淆PHP?

    function returnJS($input){
    
    return "    
    
        $("#toggle1").click(function(){
            if(toggle != 1 && open == true){
                open = false;
                var panel = "#panel"+toggle;
                $(panel).slideToggle("slow");
            }
            toggle = $input;// I need this to update from php argument
            $("#panel1").slideToggle("slow",function(){
    
            $('html, body').animate({
                scrollTop: $("#panel1").offset().top
                }, animation_time );});
    
            if(open == true)
                open = false;
            else
                open = true;
    
            return false;
        });
    
     "
     }
    
  3. 这样做的目的是我想构建一个具有可变数量的这些段的javascript文件,我将让php完全构造javascript文件,然后可以在网页中使用。

    编辑:

    例如:

    <?php
    $bar = 'hello';             
    $tmp = "My name is $bar";
    echo $tmp;
    ?>
    

    在我的代码中,我不希望php对$变量感到困惑,我想让javascript代码中的那些$对php完全不可见。

2 个答案:

答案 0 :(得分:1)

你需要通过在它们前放一个\来逃避双引号。例如:

function returnJS($input){

return '    

    $("#toggle1").click(function(){
        if(toggle != 1 && open == true){
            open = false;
            var panel = "#panel"+toggle;
            $(panel).slideToggle("slow");
        }
        toggle = '.$input.';// I need this to update from php argument
        $("#panel1").slideToggle("slow",function(){

        $(\'html, body\').animate({
            scrollTop: $("#panel1").offset().top
            }, animation_time );});

        if(open == true)
            open = false;
        else
            open = true;

        return false;
    });

 '
 }

答案 1 :(得分:1)

我的建议:

  • 使用单引号(或者更好,在php 5.3+上更新,nowdoc)以防止过度转义
  • 将javascript中使用的所有值编码为json以避免引用/换行问题
  • 使用迷你模板进行变量替换

示例:

    $js = 
<<<'JS'
    $("#toggle1").click(function(){
        if(toggle != 1 && open == true){
            open = false;
            var panel = "#panel"+toggle;
            $(panel).slideToggle("slow");
        }
        toggle = {{input}}; // I need this to update from php argument
        $("#panel1").slideToggle("slow",function(){

            $('html, body').animate({
            scrollTop: $("#panel1").offset().top
            }, animation_time );});

        if(open == true)
            open = false;
        else
            open = true;

        return false;
    });

    return;
JS;
    $input = json_encode($input);
    return str_replace('{{input}}', $input, $js);
}

print returnJS('hi "there" ');