2010-02-18 82 views
0

海伊傢伙,我正在做一個簡單的預載功能jQuery的傳遞變量的函數

(function($) { 
    $.fn.preload = function(settings) { 

    var config = { 
     before: function(){ return; }, 
     end: function(){ return; }, 
     after: function(a){ return; } 
    }; 

    if (settings) $.extend(config, settings); 

    var limit = this.length - 1; 
    var counter = 0; 

    settings.before(); 

    is_last_done = function(i){if (i == limit) return true;}; 

    this.each(function(i, src){ 
     $("<img>").attr("src", src).load(function(){ 

      if(a == counter) settings.after(); 
      if(is_last_done(i)) settings.end(); // Last is done 
      counter++; 

     }); 
    }); 
    return this; 
}; 
})(jQuery); 

img = ['a.jpg', 'b.jpg', 'b.jpg']; 

    a = 1; 

    $(img).preload({ 
     before: function(){ return; }, 
     end: function(){ }, 
     after: function(a){ 
      console.log('first done'); 
     } 
    }); 

問題調用它是在「A」變量傳遞即時消息到'after()'函數沒有被傳遞。

插件我可以用「一個」訪問變量,喜歡上了這行

if(a == counter) settings.after(); 

裏面的「a」是速效,但是如果我想說出別的東西的一個變量是什麼?我如何訪問after()函數的參數?

如果我使用這個代碼

IMG = [ 'A.JPG', 'B.JPG', 'B.JPG']我的代碼將不再有效;

b = 1; 

$(img).preload({ 
    before: function(){ return; }, 
    end: function(){ }, 
    after: function(b){ 
     console.log('first done'); 
    } 
}); 

b不通過,有什麼想法嗎?

感謝

回答

0

如果我沒有理解正確地,您想要將迭代索引傳遞給.after()。

在你的插件,可變計數器用於跟蹤哪些你在各()迭代的步驟,這是不必要的,因爲每一個的第一個參數是循環索引。請參閱文檔中的each

此外,不需要功能is_last_done()作爲限制變量是在範圍爲()由每個被稱爲匿名函數。

var limit = this.length - 1; 

settings.before(); 

this.each(function(i, src){ 
    $("<img>").attr("src", src).load(function(){ 

     if (i == a) settings.after(i); 
     if (i == limit) settings.end(); 

    }); 
}); 

JavaScript是詞法範圍的,所以你不必爲函數做任何事情來查看封閉範圍中聲明的變量。這被恰當地稱爲關閉,並在這篇Mozilla文章 - Working with Closures中進行了描述。

+0

我想要的是能夠將int傳遞到after()函數,並在我的插件中調用它,而不管它的名稱如何。 – dotty 2010-02-18 15:29:02

0

變量是你的嵌套函數訪問,因爲它生活在外部closure,你並不需要的參數,你可以簡單地使用它:

var img = ['a.jpg', 'b.jpg', 'b.jpg']; 
var b = 1; 

$(img).preload({ 
    before: function(){ return; }, 
    end: function(){ }, 
    after: function(){ 
     // b is accessible here. 
     console.log(b); 
    } 
}); 
+0

我想要的是能夠將一個int傳遞給after()函數,並在我的插件中調用它,而不管它叫什麼。 – dotty 2010-02-18 15:27:30