3

私はリスナークラスを利用する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()、ショートカットバージョンを1回だけ使用することもできます。$(function(){})しかし、これが余分な時間と労力の価値があるかどうかはわかりません...何かアイデアはありますか?

4

4 に答える 4

8

JavaScriptをphpでエコーするのは悪い習慣ですか?

一般的に:はい

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-*属性を。と組み合わせて使用​​します.data(...)

*または.phpまたはテンプレートに使用されるその他のサーバー側言語。


サーバーからクライアント側のコードをエコーするニッチな理由があります。例として、JSONP APIのJSONを生成します。ここでは、コールバックを動的に生成する必要があります。

サーバーサイド言語でJSを生成する正当な理由がない場合は、そうしないでください

于 2012-06-08T18:59:42.463 に答える
1

うーん、それはすべて好みです...私は通常、このようにして、テキストエディタが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>
于 2012-06-08T18:47:35.987 に答える
1

いつものようにそれは異なります。あなたが小さなアプリケーションを書いているなら、この混合物はあなたを傷つけません。アプリケーションが特定のサイズに成長すると、1つのファイルに言語を混在させない方が、個人的には保守が容易になります。

歴史は、フロントエンドでHTML、JavaScript、CSSを1つのファイルに混在させないことを教えてくれました。それらを分離しておく方がはるかに優れています。そうしないと、バグを追跡しようとするときに調べる適切な場所を見つけるのが非常に困難になります。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、あるいはその両方である可能性があります。彼らがどのようにコミュニケーションするかは問題ではありません。

于 2012-06-08T19:07:13.523 に答える
1

これは完全に許容できますが、多少リスクがあります。JSの一部をオンザフライで生成しているため、有効なJSコードを生成する必要があります。そうしないと、コードブロック全体が構文エラーによって強制終了されます。

たとえば、PHPを使用してPHP変数の値をJSコードブロックに挿入する場合は、次のようになります。

<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がそれを処理します。

于 2012-06-08T19:15:04.793 に答える