2013-06-24 51 views
1

我創建了一個lightbox,它可以從圖庫中加載圖像,當單擊圖像時(一次一個)。問題是圖像不加載,因此圖像的尺寸未知。這裏是代碼:圖像載入觸發器立即

function showimage(image_path) { 
    imgobj = new Image(); 
    imgobj.src = image_path; 
    var aspectratio = imgobj.width/imgobj.height; 
    var newht = imgobj.height; 
    var newwd = imgobj.width; 
    if (($(window).height() - 100) < newht) { 
     newht = $(window).height() - 100; 
     newwd = newht*aspectratio; 
    } 
    if (($(window).width() - 100) < newwd) { 
     newwd = $(window).width() - 100; 
     newht = newwd/aspectratio; 
    } 
    $('#lightbox img').attr('height', newht); 
    $('#lightbox img').attr('width', newwd); 
    $('#lightbox').show(); 
} 

我使用的onLoad試過,但立即觸發和圖像仍沒有加載和犯規給予適當的圖像尺寸。 Here我讀到,當圖像已經加載到瀏覽器中時,onLoad被立即調用。

其他人都建議使用時間延遲「setTimeout」,但這似乎不是一個好的解決方案,因爲圖像可能具有不同的大小,並且可能需要不同的時間加載。

有什麼建議如何解決這個問題。

編輯1:

感謝下面的答案,我能夠得到使用負荷工作()的功能。但是現在如果圖像已經加載並且已經顯示在燈箱中,那麼再次點擊。 load()中的函數不會被調用,並且不會出現燈箱。有什麼建議麼?

編輯2:

解決方法:這是我工作:

function showimage(image_path) { 
    imgobj = new Image(); 
    imgobj.src = image_path; 
    if (imgobj.complete == false) 
     $(imgobj).load(function(){processimage(imgobj);}); 
    else 
     processimage(imgobj); 
} 

function processimage(imgobj) { 
    var aspectratio = imgobj.width/imgobj.height; 
    var newht = imgobj.height; 
    var newwd = imgobj.width; 
    if (($(window).height() - 100) < newht) { 
     newht = $(window).height() - 100; 
     newwd = newht*aspectratio; 
    } 
    if (($(window).width() - 100) < newwd) { 
     newwd = $(window).width() - 100; 
     newht = newwd/aspectratio; 
    } 
    $('#lightbox img').attr('height', newht); 
    $('#lightbox img').attr('width', newwd); 
    $('#lightbox').show(); 
} 
+0

'$(窗口).load'會等到所有外部文件都下載...你可以使用 –

+1

而不是編輯的問題,以顯示你是如何解決它,請在下面接受一個答案,或添加您自己的解決方案作爲新的答案。這使得其他人將來可以更清楚地看到這個問題,並且允許你的答案被上/下調,並與可能給出的其他答案進行比較。如果是最好的,你甚至可以接受你自己的答案。 – jcsanyi

回答

0

這爲我工作。我正在重新使用圖像對象。

$(document).ready(function() { 
    var imgobj = new Image(); 
    function showimage(image_path) { 
     imgobj.src = image_path; 
     if (imgobj.complete == false) 
      $(imgobj).load(function(){processimage(imgobj);}); 
     else 
      processimage(imgobj); 
    } 

    function processimage(imgobj) { 
     var aspectratio = imgobj.width/imgobj.height; 
     var newht = imgobj.height; 
     var newwd = imgobj.width; 
     if (($(window).height() - 100) < newht) { 
      newht = $(window).height() - 100; 
      newwd = newht*aspectratio; 
     } 
     if (($(window).width() - 100) < newwd) { 
      newwd = $(window).width() - 100; 
      newht = newwd/aspectratio; 
     } 
     $('#lightbox img').attr('height', newht); 
     $('#lightbox img').attr('width', newwd); 
     $('#lightbox').show(); 
    } 
}); 
0

如果妳總是想訪問圖像的高度和寬度,你可以採取不同的方法,並使用jQuery的hide()show()功能。

這種方式圖像將始終加載,你只會在圖像被點擊時顯示它們,從而給用戶加載的幻覺,並給你訪問的高度和寬度。

+0

有一個巨大的圖像列表和加載所有這些似乎並不是一個好主意。因此我必須在用戶點擊後加載圖像。 – vikramaditya234

+0

你想用寬度和高度達到什麼程度? 按原樣使用它還是改變它? – drarkayl

+0

我不得不調整燈箱和圖像,以適應窗口 – vikramaditya234

0

我認爲你的函數的問題是在你的函數中創建一個新的圖像對象,然後在其中添加路徑,但是實際的圖像從未加載過。你想要做的是設置對象,添加路徑,然後什麼加載:

function showimage(image_path) { 
     imgobj = new Image(); 
     imgobj.src = image_path; 
     //load the image: 
     $(imgobj).load(function(){ 
      var aspectratio = imgobj.width/imgobj.height; 
      var newht = imgobj.height; 
      var newwd = imgobj.width; 
      if (($(window).height() - 100) < newht) { 
       newht = $(window).height() - 100; 
       newwd = newht*aspectratio; 
      } 
      if (($(window).width() - 100) < newwd) { 
       newwd = $(window).width() - 100; 
       newht = newwd/aspectratio; 
      } 
      $('#lightbox img').attr('height', newht); 
      $('#lightbox img').attr('width', newwd); 
      $('#lightbox').show(); 
     }); 
    } 

小提琴演示:http://jsfiddle.net/5d7mM/

+0

這工作。謝謝。我正在使用onLoad,它不能很好地工作。但我現在面臨的另一個問題是,一旦在Lightbox中加載圖像並且再次點擊同一圖像,則不會調用加載函數,也不會調用lightbox。任何線索? – vikramaditya234

+0

由於您正在將圖像加載到新對象中,因此必須再次將點擊事件綁定到圖像。看到j​​query.bind()或jquery.on() – JanR

+0

這個問題與事件沒有關係。代碼指針到達負載,然後沒有進一步的處理,並且在此之後javascript無法工作,並且在控制檯中沒有錯誤。 – vikramaditya234