0

Webメソッドのデータを取得してページに表示するAjax関数があります。ページ読み込み時に4項目の最初のページを表示したい。ボタンがクリックされると、次の4つの項目が表示され、次のクリックについても同様に表示されます。これはページの読み込み時に実行されますが、ボタンをクリックしても何も起こりません。

 $(document).ready(function () {
        var s;
        var countnumber = 0;
        function dos(s, countnumber) {

            participant = s.split("!");
            var i
            for (i = countnumber; i < countnumber + 4; i++) {
                part = participant[i].split("ٌ");

                rk = part[5];

                if (rk == 1) {
                    $("#ts" + i).attr('src', 'con1.png'); 
                } else if (rk == 2) {
                    $("#ts" + i).attr('src', 'con2.png');
                } else if (rk == 3) {
                    $("#ts" + i).attr('src', 'con3.png');
                } else if (rk > 3 && rk < 20) {
                    $("#ts" + i).attr('src', 'briliant.ico');
                } else if (arrlist[5] > 20 && arrlist[5] < 50) {
                    $("#ts").attr('src', 'cup.png');
                } else {
                    $("#ts" + i).attr('src', 'box.png');
                }
                    { $("#st" + i) }
                    $("#use" + i).html(part[1]);
                    $("#rnk" + i).html(part[5]);
                    $("#avg" + i).html(part[2]);
                    $("#pnt" + i).html(part[4]);
                    $("#wit" + i).html(part[3]);
                    $("#kl" + i).html(part[0]);
                    $("#use" + i).html(username);
                }

        }
        $('#kil').bind('click', function () {
            countnumber = countnumber + 4;
            dos(s , countnumber);
        })

        var arrlist;
        var participant, part;
        var username, klll, wt, pt, av, rk;


        $.ajax({
            type: "POST",
            url: "rank.aspx/bringdata",
            data: "",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: true,
            cache: false,
            success: function (ret) {
                s = ret.d;
                dos(s, 0);
            },
            error: function (x, e) {
                alert("error");
            }
        });
    });
4

1 に答える 1

1

私が理解したことから、イベントdos()を介して関数を実行しようとしています。onclick=""

機能しない理由は非常に単純ですdos()。グローバル スコープの観点からは存在しません。

代わりに行う必要があるのは、次の 2 つのいずれかです。

  1. dos()関数をグローバルにアクセス可能なスコープに移動します。
  2. jQuery を介してdos()関数をイベントにアタッチします。click

個人的には、グローバル名前空間の汚染を避けるため、2 番目のオプションを好みます。

ローカル変数から

例:ローカル変数

function f() {
    var x = 1;
}

process_x(x); # this will trigger a "ReferenceError: x is not defined"

関数にローカルな変数に外部からアクセスすることはできないことを知っていると思います。

ローカル関数へ –

関数内で関数を定義すると、基本的に、たまたま関数であるローカル変数が作成されます。

例: 関数宣言、これはあなたが持っているフォームです:

$(document).ready(function() { # enclosing_function
    function dos() {

    }
});

前に説明したように、これにより、dos()に対してローカルになりenclosing_functionます。

...本質的に同じものです

類似性をよりよく説明するために、次のように考えることができます。

例:関数式

$(document).ready(function() { # enclosing_function
    var dos = function () {

    };
});

色を持ち上げる – 高機能

この例では、2 つのバージョンは同等です。ただし、関数宣言、つまり代入を持たないもの (いわゆる「関数」) は、それらが定義されているコードの先頭に「巻き上げ」られます。

これは、定義が定義されたスコープの最上部 (または先頭) に移動 (または「巻き上げ」) されることを意味します。その関数を定義する前に (そのスコープで) コードを実行することはできません。したがって、ReferenceErrorfor 関数宣言を受け取ることはできません。(間違った範囲にいない限り、つまり。)

一方、関数は、他のすべてのステートメントと同じ方法で評価されます。つまり、プログラム フローで検出されるとすぐに評価されます。

例:巻き上げ

$(document).ready(function() { # enclosing_function
    # <- This is where "hoisted" is being defined <--
    non_hoisted(); # ReferenceError                 |
    hoisted();     # Works fine                     |
    var non_hoisted = function () { # This is where "non_hoisted" is defined
                                                    |
    };                                              ^
                                                hoisting
    non_hoisted(); # Works fine                     ^
                                                    |
    function hoisted() { ------>-------->------->----

    }
});

もう一つ

var s;
function dos(s, countnumber) {
    ...
}

仮パラメーターは、関数内のローカル変数としてs導入されます。親スコープから変数をシャドウします。sdos()s

なぜ関数sにパラメーターとして渡すのdos()ですか? Ajax リクエストが正常に返されたときに、var s内部のローカル変数に既に割り当てています。enclosing_function()

于 2012-08-06T18:34:51.667 に答える