0

ajaxリクエストは次の場所で機能します。

success: function(data) {
   $('#totalvotes1').text(data); 
}

そしてどこで<span id="totalvotes1">

しかし、一意のIDで動作するために必要です。

success: function(data) { 
    $('#total_' + $(this).attr("id")). text(data); 
}

そして、どこ<span id="total_vote_up_<?php echo $mes_id; ?>">

<a id="vote_up_<?php echo $mes_id1; ?>">

次のコードの何が問題なのか理解できません。誰かがjsonで簡単に修正できるなら、私はそれを試してみますが、jsonがどのように機能するのかわかりません。誰かが私がここでこのコードをデバッグするのを手伝ってくれるなら、私はそれが大好きです

general.js:

$(".vote").click(function() 
{
    var id = $(this).attr("id");
    var name = $(this).attr("name");
    var eData = $(this).attr("data-options");
    var dataString = 'id='+ id + '&' + eData ;
    var parent = $(this);

    if(name=='up')
    {
        $(this).fadeIn(200).html('');
        $.ajax({
            type: "POST",
            url: "up.php",
            data: dataString,
            cache: false,

            success: function(data) { 
                $('#total_' + $(this).attr("id")).text(data); 
            }
        });
    }

});
});
});

index.php

<div id="main">
<div id="left">
    vote_up_<?php echo $mes_id1; ?>
<span class='up'><a id="vote_up_<?php echo $mes_id1; ?>" class="vote" name="up" data-options="key1=<?php echo $mes_id1;?>&key2=<?php echo $mes_id2;?>&key3=<?php echo $totalvotes1;?>&key4=<?php echo $totalvotes2;?>"> <img src="up.png" alt="Down" /></a></span><br />
<span id="total_vote_up_<?php echo $mes_id1; ?>"><?php echo $totalvotes1; ?></span><br />
</div>
<div id="message">
    <?php echo $message1; ?>
</div>
<div class="clearfix"></div>
 </div>
4

3 に答える 3

2

インデントと入力はあなたの友達です。

次のようなことを試してください。

// Before $.ajax
var that = this;
// Inside success
$('#total_' + $(that).attr("id")).text(data);

ほとんどのjQuery関数はコンテキストを変更するため、success関数内の「this」は「.vote」要素を指していません。要素への参照を保存し(通常は「varthat = this」のようなもので)、success関数内でこの参照を使用する必要があります。

編集:

Matt Burlandが指摘したように、クリックされた要素参照(親)とIDの両方がすでに保存されているため、これは次のように解決できます。

$('#total_' + id).text(data); 
于 2013-02-21T17:59:06.983 に答える
1
$(".vote").click(function() 
{

var id = $(this).attr("id");
var name = $(this).attr("name");
var eData = $(this).attr("data-options");
var dataString = 'id='+ id + '&' + eData ;
var parent = $(this);


if(name=='up')
{

$(this).fadeIn(200).html('');
$.ajax({
type: "POST",
url: "up.php",
data: dataString,
cache: false,

success: function(data) { $('#total_'+id).text(data); } // here is the change

});

}

});
});
});
于 2013-02-21T18:01:36.350 に答える
1

クリーンアップして修正しました。注意してください、続ける代わりに、$(this)一度それを行い、それを変数に保存して、それを再び使用することができます。これは、jQueryオブジェクトを繰り返し作成するオーバーヘッドを回避するため、はるかに効率的です(これが$(...)機能します)。

$(".vote").click(function() 
{
    var parent = $(this);   //Note: calling this parent is really confusing!
    var id = parent.attr("id");
    var name = parent.attr("name");
    var eData = parent.data("options");
    var dataString = 'id='+ id + '&' + eData ;

    if(name=='up')
    {

        parent.fadeIn(200).html('');
        $.ajax({
            type: "POST",
            url: "up.php",
            data: dataString,
            cache: false,

            success: function(data) { $('#total_' + id).text(data); }

        });

    }

});

注:オリジナルが機能しなかった理由thisは、AJAXコールバックのコンテキストのがハンドラーthisのコンテキストと同じではないためです。.clickコールバックが実行されるとき、thisはブラウザウィンドウであり、最初にクリックされた要素ではありません。

それで、これはどのようにそれを修正しますか?それはクロージャを利用します。別の関数内にネストされた関数(AJAXコールバックなど)がある場合、内部関数は外部関数で定義されたすべての変数にアクセスできます。したがって、変数にをキャッシュするidことidで、AJAXコールバックが呼び出されたときに変数にアクセスできます。さらに良いことに.vote、元のクリックからのコールバックが呼び出される前に別のクリックをどこでクリックしても、正しい値が記憶されます。

于 2013-02-21T18:03:13.473 に答える