2

の値にアクセスするにはどうすればよいimgWidthですか? これは私に与えていますundefined

somejQueryMethod(function() { 
    var imgWidth;
    $("<img/>").attr(
        "src", 
        $("#SomeImgSelector").attr("src")
    ).load(function() {
        imgWidth = this.width;
    });
    // use imgWidth here
    // imgWidth is undefined here
});

背景情報: this SO questionから、メソッドimgWidthの外部で定義されているため、常に外部で使用できると想定しました。なぜそこにではなく、そこに定義するのか疑問に思うのはなぜですか?load()load()imageWidthload()

4

3 に答える 3

7

まだ存在しないため、そこで値を使用することはできません。コマンドのコールバック関数はload、コンテンツが読み込まれた後に実行され、loadコマンドを使用する関数が終了した後に実行されます。

loadコマンドのコールバック関数内に値を必要とするコードを配置します。

...somejQueryMethod(
    function() { 
        var imgWidth;
        $("<img/>").attr("src", $("#SomeImgSelector").attr("src")).load( function() {
          imgWidth = this.width;
          // use imgWidth here
        } );
    }
);
于 2012-08-19T21:21:29.557 に答える
4

あなたの質問は私にはあまり意味がありません。まだ値がないため、そこでは使用できません。ロード ハンドラ関数が定義されている場合は、ロード ハンドラ関数内または後で使用する必要があります。

編集:追加するために、あなたがそこで何をしているのか考えてみてください。src 属性を変更しているときは、何らかの URL から画像をロードするように指示しています。次に、読み込みイベントをトリガー (読み込みが完了したとき) にアタッチして、読み込まれた画像の幅をキャプチャします。もちろん、コードが画像の読み込みを完了するまで、その値を使用することはできません。ここでは非同期読み込みを使用しています。これは実際には、コードが最後まで処理され、「その間」に読み込みが行われることを意味するため、画像の読み込みが完了するまで待機しません。必要に応じて、実際に完了するまで待機するようにコードを変更することも、他の人が実証したように、ロード ハンドラーで幅をいじることもできます。

于 2012-08-19T21:21:00.933 に答える
3

このload関数は非同期です。つまり、コールバック関数内ですべての機能を提供する必要があります。

somejQueryMethod(function() {         
    $("<img/>").attr(
        "src", 
        $("#SomeImgSelector").attr("src")
    ).load(function() {
        var imgWidth = this.width;
        // use imgWidth here
    });
});
于 2012-08-19T21:24:05.813 に答える