0

P行を入力フィールドに変更するスクリプトを作成しようとしています。ユーザーがそれらを編集し、ajaxを介して外部phpドキュメントをチェックインした後、p行に戻します。ただし、問題は、これを ajax 部分内で使用できないことです。コードが壊れます。どうすれば解決できますか?HTML を投稿する必要がありますか?

$(document).ready(function () {

    function changeshit(result, that) {
        if (result == "success") {

            $(that).closest('div').find('input').each(function () {


                var el_naam = $(that).attr("name");
                var el_id = $(that).attr("id");
                var el_content = $(that).attr("value");

                $(that).replaceWith("<p name='" + el_naam + "' id='" + el_id + "'>" + el_content + "</p>");

            });


            $(".editlink").replaceWith("<a href=\"#_\" class=\"editlink\" name=\"edit\" id=\"" + editid + "\">Bewerken</a>");
        } else {

            alert(result);
        }
    }



    $(".editinv").on('click', 'a', function () {

        var editid = $(this).attr("id");
        var edit_or_text = $(this).attr("name");

        if (edit_or_text == "edit") {


            $(this).closest('div').find('p').each(function () {

                var el_naam = $(this).attr("name");
                var el_id = $(this).attr("id");
                var el_content = $(this).text();

                $(this).replaceWith("<input type='text' name='" + el_naam + "' id='" + el_id + "' value='" + el_content + "' />");

            });


            $(".editlink").replaceWith("<a href=\"#_\" class=\"editlink\" name=\"done\" id=\"" + editid + "\">Klaar</a>");

        } else if (edit_or_text == "done") {


            var poststring = "";
            $(this).closest('div').find('input').each(function () {

                var el_naam = $(this).attr("name");
                var el_id = $(this).attr("id");
                var el_content = $(this).attr("value");

                poststring = poststring + '' + el_naam + '=' + el_content + '&';

            });

            poststring = poststring + 'end=end'

            $.ajax({
                url: 'http://' + document.domain + '/klanten/updateaddress.php',
                type: 'post',
                data: poststring,
                success: function (result, this) {

                    changeshit(result, this);


                }
            });
        }

    });
});
4

4 に答える 4

1

はい、一般的な解決策は、var example self = this を宣言し、その変数を使用することです

 var self = this;
 $.ajax({
            url: 'http://'+document.domain+'/klanten/updateaddress.php',
            type: 'post',
            data: poststring,
            success: function(result) {   

            changeshit(result, self);


            }
        });
    }

そのようにして、 this コンテキストは変数に保存されます。

于 2013-10-25T09:35:37.737 に答える
1

これを達成する方法はいくつかあります

1) ドキュメント ( jQuery.ajax ) を読むと、ajax メソッドにコンテキストを提供できることがわかります。

context タイプ: PlainObjectこのオブジェクトは、すべての Ajax 関連のコールバックのコンテキストになります。デフォルトでは、コンテキストは呼び出しで使用される ajax 設定を表すオブジェクトです ($.ajaxSettings は $.ajax に渡される設定とマージされます)。

$.ajax({
    url: 'http://'+document.domain+'/klanten/updateaddress.php',
    type: 'post',
    data: poststring,
    context: this,
    success: function(result) {   
        // the context sent above would become the context of this function when called by jquery
        changeshit(result, this);
    }
});

このように使用すると、次のコードのようにすることもできます

function changeshit (result) {
    var $that = $(this);
    if (result == "success") {

            $that.closest('div')... // cool ha ?
};
$.ajax({
    url: 'http://'+document.domain+'/klanten/updateaddress.php',
    type: 'post',
    data: poststring,
    context: this,
    success: changeshit
});

2) クロージャーを利用することができます (詳細はこちらを読むか、Google で検索してください)。そのため、コードは次のようになります。

var context = this;
$.ajax({
    url: 'http://'+document.domain+'/klanten/updateaddress.php',
    type: 'post',
    data: poststring,
    success: function(result) {   
        // here you can use any variable you declared before the call
        changeshit(result, context);
    }
});

補足として、変数/オブジェクトのキャッシュを使用することをお勧めします。そのため、関数の先頭で宣言し、必要なたびvar $this = $(this)に呼び出すのではなく、関数を介して使用します。$(this)

于 2013-10-25T09:41:39.367 に答える
1

単に追加する場合:

context: this

$.ajaxoptions に追加すると、ハンドラーsuccessは の正しい値で自動的に呼び出されるため、パラメーターthisは必要ありません。that

コールバックの周りに追加の関数ラッパーも必要なくなるsuccessため、次を使用できます。

$.ajax({
    url: 'http://' + document.domain + '/klanten/updateaddress.php',
    type: 'post',
    data: poststring,
    context: this,       // propagate "this"
    success: changeshit  // just pass the func ref
});
于 2013-10-25T09:35:13.227 に答える
1

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

すぐ下$(".editinv").on('click', 'a', function () {に追加

$(".editinv").on('click', 'a', function () {
    var element = this;

そして、これを次のように変更します。

$.ajax({
    url: 'http://' + document.domain + '/klanten/updateaddress.php',
    type: 'post',
    data: poststring,
    success: function (result) {
        changeshit(result, element);
    }
});

それは、あなたがやろうとしていることを私が正しく理解している場合です

于 2013-10-25T09:32:56.287 に答える