0

私はJqueryとJavascriptを初めて使用しますが、symfony2でphpコントローラーと通信するスクリプトを作成しました。

私の質問は、スクリプトの長さを減らすために何ができるかです->スイッチ式で解決したロジックを解決するよりスマートな方法があるでしょうか?

ありがとう

/**
 * This function gets the current clicked buttons value and post it to the given action + returns the correct value
 */

$(document).ready(function() {
    $('button.rating-button').click(function(event) {
        event.preventDefault();
        var $element   = $(this).attr('id');
        var $rating    = $(this).attr('value');
        var $messageId = $(this).closest('ul').next('input:hidden').val();

        if(typeof $rating !== 'undefined' && $rating != null) {
            $.post(Routing.generate('rating_vote', { 'messageId': $messageId, 'ratingCode': $rating }),
            function($json) {
                $('button#'+$element).parent().find('span').text($json.numberOfRatings);

                /* check if oldRating is defined and oldRating is not the same as new rating ( prevent decrease of actual value if this is the first vote entry for the current message and the specific user ) */
                if(typeof $json.oldRating !== 'undefined' && $json.oldRating != null && ($json.oldRating != $rating) ) {
                    switch($json.oldRating) {
                        case 1:
                            $oldElement = 'rating-first';
                            break
                        case 2:
                            $oldElement = 'rating-second';
                            break;
                        case 3:
                            $oldElement = 'rating-third';
                            break;
                    }
                    $('button#'+$oldElement).parent().find('span').text(Number($('button#'+$oldElement).parent().find('span').text()) -1);
                }

            });
        }

    });
});
4

1 に答える 1

2

switch case ロジックをこのかなりきちんとしたコンセプトに置き換えることができます。

$(function() {
    $('button.rating-button').on('click',function(event) {
        event.preventDefault();
        var $this = $(this),
            element   = $this.attr('id'),
            rating    = $this.attr('value'),
            messageId = $this.closest('ul').next('input:hidden').val();
        if(typeof rating !== 'undefined' && rating != null) {
            $.post(Routing.generate('rating_vote', { 'messageId': messageId, 'ratingCode': rating }),
                function(json) {
                    $('button#'+element).parent().find('span').text(json.numberOfRatings);
                    if(typeof json.oldRating !== 'undefined' && json.oldRating != null && (json.oldRating != rating) ) {
                        var oldElement = ({
                            1: 'rating-first',
                            2: 'rating-second',
                            3: 'rating-third'
                        })[json.oldRating];
                        $('button#'+oldElement).parent().find('span').text(Number($('button#'+oldElement).parent().find('span').text()) -1);
                    }
                }
            );
        }
    });
});

いくつかの一般的な考え:

  • jQuery を使用する場合は、jQuery オブジェクトを含む変数の指標として $[varname] を使用します (PHP のバックグラウンドを知っていると、最初は非常に奇妙に感じるかもしれません)。
  • jQuery-Object の作成はパフォーマンス面でやや重いため、できれば一度だけ作成するようにしてください
于 2013-01-29T14:28:14.770 に答える