0

頻繁に再利用する必要がある機能があります。この問題は、別のページを現在のページにロードすると発生し、関数が 2 回起動します。私はこの解決策を試しましたが、うまくいきませんでした(複数の実行を防ぐために、1クリック後にjquery関数を無効にします)。リクエストが行われている間に関数が複数回起動するのを防ぐための解決策はありますか? この関数は、クリックごとに 1 回だけ起動する必要があります。

(function($) {
    $.fn.likeclick = function(thiss, key) {  
        var $this = thiss;
        var pid=key;
        if ($this.hasClass('addd')) {
            $.post("/blah.php?id="+pid, function(data) {
                if (data=="ok"){
                    $this.removeClass('addd').addClass('rem');
                    $('.ccount#'+pid).html(function(i,val) {
                        return (parseFloat(val) + 1).toFixed(0);
                    });
                }
            });
        } else {
            $.post("/blah1.php?id="+pid, function(data) {
                if (data=="okk"){
                    $this.removeClass('rem').addClass('addd');
                    $('.ccount#'+pid).html(function(i,val) {
                        return (parseFloat(val) - 1).toFixed(0);
                    });
                }
            });
        }
    };
})(jQuery);

使用法:

<div class="like addd"></div>

$('.like').click(function() {
    likeclick($(this),this.id);
});
4

2 に答える 2

0

私があなたの質問を正しく理解している場合、必要なのは、関数がその要求を行う前に、現在アクティブな要求があるかどうかを知る方法です。hasActiveRequestこれを追跡するようなブール値を追加してみませんか?したがって、デフォルトではfalse、それをクリックしたときに、ブール値を確認します... falseの場合は、に設定しtrueて要求を行います。それ以外の場合はtrue、リクエストを行わないでください(すでに進行中のものがあるため)。リクエストが完了したら、ブール値をに戻しfalseます。

于 2013-03-10T02:46:53.243 に答える
0

.post()メソッドで読み込んだページ(またはデータ)で関数が動かないので、読み込んだページに直接、または.jsファイルでjQuery関数を追加してみました。いずれにせよ、.post() を使用していくつかのページがロードされた後、コードが複数回実行されていました。クリックごとに関数が複数回起動されないようにするために、遅延、タイムアウト関数、またはブール値を追加したかどうかに関係なく、関数は依然として複数回実行されました。

無限の検索の後、jQuery ドキュメントでこの記事 ( http://docs.jquery.com/FAQ#Why_do_my_events_stop_working_after_an_AJAX_request.3F ) に出会いました。

その記事では次のように述べています。

注意してください!jQuery 1.4.2 の時点で、同じハンドラーを同じ要素に複数回バインドすると、複数回実行されます。これは、以前のバージョンの jQuery や DOM 2 Events 仕様 (通常、重複するイベント ハンドラーを無視する) とは異なります。

より多くの調査で .live() メソッドが判明しましたが、そのメソッドは推奨されていません。.on() メソッドは .live() を置き換えました。だから私の解決策は次のとおりです。

$(document).on('click', '.like', function(){
var $this = $(this);
likeclick($this,this.id);
});

これで、読み込まれたページ (データ) に .post() メソッドから関数を追加したり、関数が 2 回起動するのを防ぐために他のメソッドを使用したりする必要がなくなりました。

于 2013-03-10T12:28:39.157 に答える