用php回复javascript是不好的做法

jer*_*rry 3 php jquery decoupling

我有一个php应用程序,它使用一个Listener类,它基本上只是用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;

?>
Run Code Online (Sandbox Code Playgroud)

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

zzz*_*Bov 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>
Run Code Online (Sandbox Code Playgroud)

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

<a href="http://example.com/" class="ajax-link">bar</a>
Run Code Online (Sandbox Code Playgroud)

在你的脚本中你可以:

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

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

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

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


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

如果你没有一个真正的好理由与服务器端语言生成JS,不要.