用php回复javascript是不好的做法

时间:2012-06-08 18:39:23

标签: php jquery decoupling

我有一个使用Listener类的php应用程序,它基本上只是用jquery设置一个ajax请求(下面的例子)。但由于某种原因,回应javascript似乎不够优雅。是否更好的做法是为要传递的javascript(可能引入耦合)构建单例类,或者像我现在所做的那样只回显脚本?

这是我正在做的代码片段。

<?php

        $script = "
                    <script>
                    $(document).ready(function(){
                        $('".$trigger."').".$action."(function() {
                        ".$js_variables."
                            var ajax_load = '';
                            var loadUrl = '".$this->controller_path."';
                            var action = $(this).attr('id');

                            $('".$this->parent."')
                            .hide(2)
                            .html(ajax_load)  
                            .load(loadUrl, {action: action, ".$post_mapper."})
                            .fadeIn(800);
                        });
                    });
                </script>
        ";

      echo $script;

?>

编辑:使用单例类也允许我只使用$(document).ready()或快捷版$(function(){})一次,而不是每次添加一个监听器。但我不确定这是否值得花费额外的时间和精力......任何想法?

4 个答案:

答案 0 :(得分:7)

  

使用php回显JavaScript是不好的做法吗?

一般来说:是的

从php回复JavaScript是一种常见的做法,但我强烈反对。

在大多数情况下,您可以通过遵循前端MVC结构来避免混合语言:

HTML属于.html *个文件。这是模特 CSS属于.css个文件。这是观点。
JS属于.js个文件。这是控制器。

我发现我真的需要从服务器端语言生成JavaScript是非常罕见的。大多数时候我真正需要的是传递JavaScript可以使用的信息。

而不是尝试输出:

<a href="#" id="foo">bar</a>
<script>
    $('#foo').click(function () {
        $.ajax('http://example.com')...
        return false;
    });
</script>

对于每个链接,尝试使用本机HTML属性来完成大部分繁重工作:

<a href="http://example.com/" class="ajax-link">bar</a>

并在您的脚本中,您可以:

$(document).on('click', '.ajax-link', function () {
    $.ajax($(this).attr('href'))...
    return false;
});

委托函数只需绑定一次,可以从静态JS文件中完成,无需尝试将JS注入PHP代码。

如果您需要传递更多信息,请将data-* attributes.data(...)结合使用。

*或.php或用于模板化的任何其他服务器端语言。


有一些利基原因可以从服务器回显客户端代码。一个例子是为JSONP API生成JSON,您需要动态生成回调。

如果您没有 真的 使用服务器端语言生成JS的充分理由,请不要这样做。

答案 1 :(得分:1)

mm这是所有的偏好...我通常会这样做,所以我的文本编辑器将能够确定什么是JavaScript和什么是PHP所以它不会让我的眼睛流血试图看看非代码颜色的文本

<script>
    $(document).ready(function(){
        $('<?php echo $trigger ?>').<? echo $action ?>(function() {
            <?php echo $js_variables ?>
            var ajax_load = '';
            var loadUrl = '<?php echo $this->controller_path ?>';
            var action = $(this).attr('id');

            $('<?php echo $this->parent ?>')
                .hide(2)
                .html(ajax_load)  
                .load(loadUrl, {action: action, <?php echo $post_mapper ?>})
                .fadeIn(800);
            });
    });
</script>

答案 2 :(得分:1)

一如既往地取决于此。如果你正在写一个小应用程序,这种混合物不会伤害你。当应用程序增长到一定大小时,我个人觉得当我不在一个文件中混合使用语言时,它更容易维护。

历史告诉我们,不要在一个文件中混合使用HTML,JavaScript和CSS。保持它们分离要好得多,否则当你试图追踪错误时很难找到合适的位置。混合使用JavaScript和服务器端语言并不是更好。我觉得还有一些事情让我觉得不错。例如。配置或本地化文件,需要具有动态值。

在你的例子中,我宁愿把它分开。您所做的一切都可以完美地完成HTML元素的(数据)属性和一些DOM查找。您似乎还需要为视图收集一些更好地存储在HTML中的信息。例如:$action这可以通过以下形式得出:

HTML

<from method="POST" action="/you-name-it">
  ...
</form>

JS

$(function(){
    var form = $('form');
    $.ajax( {
      type: "POST",
      url: form.attr( 'action' ),
      data: form.serialize(),
      success: function( response ) {
        console.log( response );
      }
    } );
});

提交此确切表单的逻辑可以是JavaScript和/或PHP。它们如何沟通并不重要。

答案 3 :(得分:1)

这是完全可以接受的,但有些冒险 - 你正在生成JS的部分内容,这意味着你必须生成 VALID JS代码,否则整个代码块将被杀死语法错误。

e.g。如果您使用PHP在JS代码块中插入PHP变量的值,例如:

<script type="text/javascript">
var last_name = '<?php echo $last_name ?>';
</script>

和$ last_name恰好是O'Brien,您现在引入了语法错误,因为生成的代码将是:

var last_name = 'O'Brien';
                ^^^--- string with contents O
                   ^^^^^--- unknown/undefined variable Brien
                  ^^--string followed by variable, but no operator present.
                        ^--- start of a new unterminated string containing a ;

无论何时你将原始的基于PHP的数据插入到Javascript变量中,你基本上必须使用json_encode(),这可以保证生成的JS数据在语法上是有效的JS代码:

var last_name = <?php echo $last_name ?>;

请注意,我没有在此版本中添加任何' - json_encode会为您处理。