3
var l = false;
var l2 = false;

var imm = new Image();
imm.src = "b.png";

imm.onload = function(){
l = true;
}

var imm2 = new Image();
imm2.src = "c.png";

imm2.onload = function(){
l2 = true;
}

ll2が true の場合にのみ関数を開始するようにこの JavaScript に指示するにはどうすればよいですか? これら 2 つの変数を常にチェックするループを設定する必要がありますか? より効率的な方法はありますか?スクリプトを画像なしで開始したくありませんが、.onloadすべての画像ではなく、1 つの画像のみが読み込まれるのを待つことができます。ご協力いただきありがとうございます!

4

6 に答える 6

11

私の意見では、よりエレガントな方法:

var loadedImagesCount = 0;
var imageNames = ["b.png", "c.png"];
var imagesArray = [];
for (var i = 0; i < imageNames.length; i++) {
    var image = new Image();
    image.src = imageNames[i];
    image.onload = function(){
        loadedImagesCount++;
        if (loadedImagesCount >= imageNames.length) {
            //loaded all pictures
        }
    }
    imagesArray.push(image);
}

多くの異なる画像変数をいじる代わりに、画像名を単純な配列に保存し、これをループして、読み込まれた画像の数を数えます。

于 2012-04-11T10:49:45.757 に答える
5

ループは必要ありません。lとl2が真であるかどうかをチェックする関数を呼び出して、実行したいことを実行させることができます。

var onLoaded = function() {
    if (l && l2) {
        // do your stuff
    }
}

imm.onload = function(){
    l = true;
    onLoaded(); // call to onLoaded
}

imm2.onload = function(){
    l2 = true;
    onLoaded(); // call to onLoaded
}

これは基本的に、オブザーバーパターンのより単純な形式です。これをカプセル化するRadio.jsなどのjQueryプラグインがあります。

于 2012-04-11T10:43:29.810 に答える
5

これは一般的なものです(任意の数の画像で動作します

function preload( images, callback){
   var imageElements = [],
       counter = images.length,
       lfunc = function(){if (--counter === 0 && callback) callback(imageElements);};

   // first create the images and apply the onload method
   for (var i = 0, len = images.length; i < len; i++){
      var img = new Image();
      imageElements.push( img );
      img.onload = lfunc;
      img.src = images[i];
   }
}

function codeOncePreloadCompletes(preloadedImages){
  // Do whatever you want here
  // images are preloaded
  // you have access to the preloaded image if you need them
  // with the preloadedImages argument
}

// USAGE

preload( ['b.png', 'c.png'], codeOncePreloadCompletes);

// OR

preload( ['b.png', 'c.png'], function(preloadImages){
   // write directly here what to do after preload
});
于 2012-04-11T10:51:08.633 に答える
1

指定された URL のリストから画像を順番にロードする場合は、次のようにすると便利です。

preloadImages_helper("firstURL", "secondURL");

    function preloadImages_helper(){
        var args =  Array.prototype.slice.call(arguments);
        if(!(args === undefined) && args.length > 0){
            var img = new Image();
            img.src = arguments[0];
            img.onload = function(){
                preloadedImages.push(img);
                console.log("pushing image");
                //Don't forget to call user code!
                if(!(args === undefined) && args.length > 1){
                    args.shift();
                    preloadImages_helper.apply(this, args);
                }
                else{
                    console.log("finished loading images");
                    userCode();
                }
            };
        }
    }
于 2013-08-22T19:04:01.273 に答える
0

スクリプト全体でこれらが2回だけ設定されll2いる場合は、値を設定した後で確認できます。

var l = false;
var l2 = false;

var imm = new Image();
imm.src = "b.png";

imm.onload = function(){
  l = true;
  if (l && l2) {
    myFunc();
  }
}

var imm2 = new Image();
imm2.src = "c.png";

imm2.onload = function(){
  l2 = true;
  if (l && l2) {
    myFunc();
  }
}

function myFunc(){
  //do stuff
}
于 2012-04-11T10:43:15.223 に答える
0

常にチェックする必要はありません。一方が終了するたびにもう一方をチェックするだけです。そうすれば、2 つ目が完了すると関数が起動し、「チェック」は 1 回だけで済みます。var l = false; var l2 = false;

var imm = new Image();
imm.src = "b.png";

imm.onload = function(){
l = true;

if (l2)
   call yourFunction();

}

var imm2 = new Image();
imm2.src = "c.png";

imm2.onload = function(){
l2 = true;

if (l)
   call yourFunction();
}
于 2012-04-11T10:44:23.457 に答える