0

所以我有这个返回 html/js 的 PHP 函数。但我发现我使用的方法是错误的,效率不高。有没有更好的办法?

这只是代码的简化版本。

function doSomething() {
$speed = 1000;
$duration = 500;
$start = false; // this is a boolean and doesn't work below (not sure why)

$output = '<div class="container">something</div>' . "\r\n";
$output .= '<script type="text/javascript">' . "\r\n";
$output .= 'jQuery(document).ready(function() {' . "\r\n";
$output .= 'jQuery(".container.").cycle({' . "\r\n";
$output .= 'speed : ' . $speed . ',' . "\r\n";
$output .= 'duration : ' . $duration . ',' . "\r\n";
$output .= 'start : ' . $start . "\r\n"; // this doesn't work I think is because of it becoming a string instead of a boolean here.
$output .= '})' . "\r\n";
$output .= '})' . "\r\n";
$output .= '</script> . "\r\n";
return $output;
}

所以你可以在上面看到一堆输出和一堆换行符,基本上很难维护和调试。此外,根据评论,START 变量不起作用。

一定有更好的方法。我想到了heredocs?但不确定...

感谢您的关注。

4

4 回答 4

2

我会使用以下内容:

function doSomething() {
     $speed = 1000;
     $duration = 500;
     $start = (int)false; // this is a boolean and doesn't work below (not sure why)
     $output = <<<END
       <div class="container">something</div>
       <script type="text/javascript">
         jQuery(document).ready(function() {
         jQuery(".container").cycle({
           speed : $speed ,
           duration : $duration,
           start : $start
          })
        })
       </script>
END;
return $output;
}

echo doSomething();

易于维护

于 2012-12-08T16:21:55.380 回答
1

你可以这样做:

function doSomething() {        
    $cycleArguments = array(
        'speed'    => 1000,
        'duration' => 500,
        'start'    => false
    );

    $output = '<div class="container">something</div>' . "\r\n";
    $output .= '<script type="text/javascript">' . "\r\n";
    $output .= 'jQuery(document).ready(function() {' . "\r\n";
    $output .= 'jQuery(".container.").cycle(' . "\r\n";
    $output .= json_encode( $cycleArguments );
    $output .= ')' . "\r\n";
    $output .= '})' . "\r\n";
    $output .= '</script>' . "\r\n";
    return $output;
}

并结合json_encode() heredoc语法:

function doSomething() {        
    $cycleArguments = array(
        'speed'    => 1000,
        'duration' => 500,
        'start'    => false
    );

    $jsonCycleArguments = json_encode( $cycleArguments );

    $output = <<<OUTPUT
    <div class="container">something</div>
    <script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery(".container.").cycle( $jsonCycleArguments );
    });
    </script>
OUTPUT;
    return $output;
}

另一个选择仍然是:

function doSomething() {        
    $cycleArguments = array(
        'speed'    => 1000,
        'duration' => 500,
        'start'    => false
    );

    $output = array(
        '<div class="container">something</div>',
        '<script type="text/javascript">',
        'jQuery(document).ready(function() {',
        '    jQuery(".container.").cycle(' . json_encode( $cycleArguments ) . ');',
        '});',
        '</script>'
    );

    return implode( "\r\n", $output );
}

ETC...

于 2012-12-08T16:18:34.447 回答
0

您可以在单独的 HTML 文件中编写代码,从 php 对该文件进行 AJAX 调用,并根据需要在 AJAX 响应中获取 HTML 页面的代码。

于 2012-12-08T16:18:00.403 回答
0

这里有几个选项:

1)在你的页面顶部(或者如果你已经模块化了所有的 JS,并且在你调用任何东西之前,它都不会在页面底部触发),让 php 转储一个 JSON 编码的多维数组,包含您在该页面上需要的所有数据,都放入一个 var。

您的 JS(存储在静态文件中)将该 var 传递给 init 函数之一,并将对该数据进行操作。

2)从那里调用html页面的php脚本src="script.php",将JS存储为单独的包含,作为HEREDOC或模板值。获取您的值,将它们插入模板并回显字符串。为此,您必须弄乱 MIME 类型才能使其正常工作。

3) 重写您的 apache 安装以重写名称,编写一个路由脚本来处理值抓取和模板,并根据请求的文件扩展名返回一个 mime 类型。

这对于大多数站点来说是一种过度杀伤,但对于希望所有 JS 都是外部的、希望 JS 文件包含动态数据并希望所有脚本标签具有常规外观src标签的大型站点很有用。

另一种方法是将 php 设置为将“.js”文件视为 php 文件(但随后您需要确定脚本中的类型,以设置 MIME 类型)。

于 2012-12-08T16:52:33.993 回答