0

JSONオブジェクトから取得した本の文字列オブジェクトがあります。この Book オブジェクトには、Title、Author、および URL という 3 つの Key 値のペアがあります。for ループを使用して各オブジェクトを読み取り、オブジェクトのタイトルをボタンとして HTML ページに配置します。しかし、ボタンがクリックされたときに、本の URL を警告したいと思います。オブジェクトを読み取ると、Books オブジェクトを作成し、後で使用するために配列にプッシュします。しかし、URLが正しくない.Click()メソッドを使用できません。理解を深めるためにコードを参照してください。:-)

for (i = 0; i < 6; i++) //I know that there is only 65 Books..jsonString.books.lenght is not working.
{
    var title = jsonString.books[i].title;
    var classname = title.replace(/\s/g, "");
    var author = jsonString.books[i].author;
    var URL = jsonString.books[i].url;
    var htmlString = '<div class="' + classname + '"><input type="button" value="' + title + '"></div>';
    $(htmlString).appendTo(attachPoint).click(function () {
        loadBook(URL);
    });

    OneBook = new Book(author, title, URL);
    arr.push(OneBook);
}

attachpoint は、取得した html ファイルの参照です

var attachpoint=document.querySelector('.buttonAttachPoint');

したがって、上記のコードでは、クリックした URL は常に jsonString の最後のオブジェクトになります。これは for ループで起こっています。作成したオブジェクトの配列から URL を取得できるように、onclick またはボタンのタイトルを持つ Div のクラス名を取得する方法はありますか? または、もっと簡単な方法があります。また、「jsonString.books.length」が機能しない理由を指摘できますか? 前もって感謝します.:-) すべての助けに感謝します。:-)

4

2 に答える 2

2

すぐに呼び出される関数式を使用してクロージャーを作成すると、うまくいくはずです。これを置き換えるだけです:

$(htmlString).appendTo(attachPoint).click(function () {
    loadBook(URL);
});

これとともに:

(function(URL) {
    $(htmlString).appendTo(attachPoint).click(function () {
        loadBook(URL);
    });
})(URL);

URLその無名関数のスコープ内には値が渡されます。これは、forループのその反復の正しい値になります。

于 2013-03-27T16:30:19.107 に答える
1

ECMAScript では、変数のスコープはブロックではなく、その関数に限定されます。

バインドしている関数は、ループ反復のコンテキストではなく、ループ全体のコンテキストでclickクロージャーを持つようにします。URLURL

これは、いずれかの関数が呼び出されるたびにURL、ループが設定した最後の値を持つことを意味します。

URLfor each ループの値を固定する必要があります。URLこれを行う 1 つの方法は、引数として取り、それを閉じる関数を返す関数を別の場所に置くことです。

function getBookLoader(url) {
  return function (){
    loadBook(url);
  };
}

... .click次に、行を次のように置き換えることができます。

$(htmlString).appendTo(attachPoint).click(getBookLoader(URL))

タイトルの質問に答えるために、イベントのtargetプロパティには、イベントがディスパッチさcurrentTargetれたオブジェクトが含まれ、プロパティには、リスナーが現在評価されているオブジェクトが含まれます。 currentTarget問題のはずdivです。

于 2013-03-27T16:35:44.263 に答える