1

私のコードには次のようなセクションがあります$(document).ready(function() {}。len getInitial(len); は整数です。

function getInitial(number){
    number--;
    if(number < 0) return
    var $items = $(balls()); 
    $items.imagesLoaded(function(){
        $container
        .masonry('reloadItems')
        .append( $items ).masonry( 'appended', $items, true );
    });
    getInitial(number);
}

次の行に注意してください。var $items = $balls(());

それは次のように定義されています。

function balls(){
    $iterator -= 1;
    if($iterator < 0){
        var $boxes = $( '<div class="box">No more games!</div>' );
        $container.append( $boxes ).masonry( 'appended', $boxes, false );   
        return; 
    }
    var imgPreload = new Image();
    var ret; 
    imgPreload.src = 'scripts/php/timthumb.php?src='+$test[$iterator][2]+'&q=100&w=300';
    $(".imgHolder").append('<img src="'+imgPreload.src+'"/>');
    //console.log(imgPreload);
    $(".imgHolder").imagesLoaded(function(){
        ret = '<div class="box" style="width:18%;">'
            +'<p>'+$test[$iterator][1][2]['name']+'</p>'
            +'<img src="'+imgPreload.src+'"/>'//Replace this with the one below when timthumb is whitelisted
            +'<div id=boxBottom>'+Math.floor($test[$iterator][0]*100)+'%</div>'
            +'</div>';
    });
    console.log(ret);
    return ret;
}

私の質問はret、関数内の imagesLoaded() メソッドから取得して、内部balls()に戻るにはどうすればよいですか? $itemsgetInitial()

これ以上混乱がないことを願っています。

4

2 に答える 2

1

関数は非同期で実行されるため、コールバック関数が必要です。値を返すことはできません。コールバックを渡して値を返します。

function getInitial(number){
    number--;
    if(number < 0) return
    // Can't do the following, it's asynchronous
    // var $items = $(balls()); 

    // Do this instead
    balls(function(html) {
        var $items = $(html);
        $items.imagesLoaded(function(){
            $container
            .masonry('reloadItems')
            .append( $items ).masonry( 'appended', $items, true );
        });
        getInitial(number);
    })
}

function balls(callback){
    $iterator -= 1;
    if($iterator < 0){
        var $boxes = $( '<div class="box">No more games!</div>' );
        $container.append( $boxes ).masonry( 'appended', $boxes, false );   
        return; 
    }
    var imgPreload = new Image();
    var ret; 
    imgPreload.src = 'scripts/php/timthumb.php?src='+$test[$iterator][2]+'&q=100&w=300';
    $(".imgHolder").append('<img src="'+imgPreload.src+'"/>');
    //console.log(imgPreload);
    $(".imgHolder").imagesLoaded(function(){
        callback('<div class="box" style="width:18%;">'
            +'<p>'+$test[$iterator][1][2]['name']+'</p>'
            +'<img src="'+imgPreload.src+'"/>'//Replace this with the one below when timthumb is whitelisted
            +'<div id=boxBottom>'+Math.floor($test[$iterator][0]*100)+'%</div>'
            +'</div>');
    });
}

コールバックは、非同期関数から値を返す方法です

おそらくまだ問題があり、コードは非常に紛らわしいです。しかし、これで正しい方向に進むはずです。

于 2012-07-28T01:58:26.040 に答える
1

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

var imgPreload = new Image();
var ret = '<div class="box" style="width:18%;">'
          +'<p>'+$test[$iterator][1][2]['name']+'</p>'
          +'<img src="'+imgPreload.src+'"/>'
          +'<div id=boxBottom>'+Math.floor($test[$iterator][0]*100)+'%</div>'
          +'</div>'; 
imgPreload.src = 'scripts/php/timthumb.php?src='+$test[$iterator][2]+'&q=100&w=300';
$(".imgHolder").append('<img src="'+imgPreload.src+'"/>');
//console.log(imgPreload);
$(".imgHolder").imagesLoaded();
return ret;
于 2012-07-28T01:50:50.623 に答える