0

ウィンドウの読み込み時に、画像がすでに保存されているかどうかを確認しようとしています。保存されている場合は、保存するリンクが無効になるようにHTMLを変更します。このコードは.each()withなしでも機能しますが、最初のタグのみを検索し、それに基づいて他のすべての同様のタグを変更します。もちろん、各タグを個別に実行したいと思います。firebugのpostトランザクションを見ると、各ajax呼び出しは適切に処理され、正しいhref値が送信されますが、htmlの更新は行われないようです。アラートメッセージが必要なときに表示されるため、ifステートメントは失敗していません。$(this)アイテム値を取得するために機能するのに、htmlの変更を設定するときに機能しない理由はありますか?

window.onload =  function() {
    $(".img a").each(function() {
        var item=$(this).attr( 'href' );
        var action="check";
        jqxhr = $.post("webservice.php", { action: action, color: item }, function(data) {
            var result=data.result;
            if (result=="saved") {
                $(this).html("<div style='line-height:4em '>Saved</div>");
                $(this).attr("href","saved");
                alert(result);
            }

        }, "json")
        .error(function() {         
            alert("error: unable to contact web service"); 
        });
    });
}
4

4 に答える 4

2

問題はthis、コールバックの内部があなたが考える要素を参照していないことです。

ajaxの前にその要素への参照を作成し、それを使用する必要があります。

window.onload =  function() {
    $(".img a").each(function() {
        var self   = $(this),
            item   = this.href,
            action = "check";
        jqxhr = $.post("webservice.php", { action: action, color: item }, function(data) {
            var result=data.result;
            if (result=="saved") {
                self.html("<div style='line-height:4em '>Saved</div>");
                self.attr("href","saved");
                alert(result);
            }

        }, "json")
        .error(function() {         
            alert("error: unable to contact web service"); 
        });
    });
}

さらに、同様のことをチェックするために非常に多くのajax呼び出しを実行するのはやり過ぎのようです。
コードをリファクタリングして単一のajax呼び出しを行うことをお勧めしますが、ファイルのリストを渡してチェックし、それらすべての画像を参照する応答を処理します(1つずつ

于 2012-11-08T12:34:15.863 に答える
1

javascriptクロージャにはいくつかのルールがあります。時々異なるクロージャthisで異なる参照です。

試す

var that = $(this);

that必要な場所でアイテム参照に使用します

于 2012-11-08T12:34:23.073 に答える
1

成功メソッドの呼び出し元は<a>要素ではありません。

window.onload =  function() {
$(".img a").each(function() {
    var $this = $(this);
    var item=$(this).attr( 'href' );
    var action="check";
    jqxhr = $.post("webservice.php", { action: action, color: item }, function(data) {
        var result=data.result;
        if (result=="saved") {
            $this.html("<div style='line-height:4em '>Saved</div>");
            $this.attr("href","saved");
            alert(result);
        }

    }, "json")
    .error(function() {         
        alert("error: unable to contact web service"); 
    });
});
}

それがお役に立てば幸いです。

于 2012-11-08T12:34:23.633 に答える
1

変更してみてください:

var item=$(this).attr( 'href' );

に:

var $item = $(this);
var item=$item.attr( 'href' );

次に変更します。

$(this).html("<div style='line-height:4em '>Saved</div>");
$(this).attr("href","saved");

に:

$item.html("<div style='line-height:4em '>Saved</div>");
$item.attr("href","saved");
于 2012-11-08T12:35:57.377 に答える