2012-03-02 37 views
0

因爲我知道之前我已經做過了,所以我在我的頭上撞牆。但是這個代碼不起作用。現在,我知道很多事情都是一團糟,因爲我試圖快速把它們放在一起(讓它工作,把它做好,讓它快速等等),但是這又是如何導致我如此痛苦和痛苦?在我將頁面加載到頁面之前,如何使用jQuery計算圖片的寬度和高度?

我有以下的基本HTML:

<div class="js-gallery force js-on"> 
    <h5>More Images &raquo;</h5> 
    <a href="http://url/to/image1.jpg"><img src="http://url/to/image_thumb1.jpg" alt=""></a> 
    <a href="http://url/to/image2.jpg"><img src="http://url/to/image_thumb2.jpg" alt=""></a> 
    <a href="http://url/to/image3.jpg"><img src="http://url/to/image_thumb3.jpg" alt=""></a> 
     etc... 
</div> 

而下面的JS攔截鏈接點擊,創建一個對象,通過微型畫廊(下一個,上,活動等),以保持狀態,並計算屏幕寬度/高度,以便圖像適合。應該這麼簡單:

// Set up intialized variables 
var overlay = $("<div class='gallery-overlay' id='gallery-overlay'></div>").hide().appendTo("body"), 
    state = {}, 
    galleryNext = $("<a class='gallery-next' href='#'>Next</a>"), 
    galleryPrev = $("<a class='gallery-prev' href='#'>Previous</a>"), 
    gallery = $(".js-gallery"); 

gallery.addClass("js-on"); 

gallery.find("a").click(function (e) { 
    e.preventDefault(); 
    state.gallery = $(this).parent(".js-gallery"); 
    thisHref = this.href; 
    overlay.fadeIn(200, function() { 
    buildGalleryOverlay(thisHref); 
    }); 
    return false; 
}); 

$("#gallery-overlay").live("click", function (e) { 
    overlay.fadeOut(); 
    overlay.find("#image-box").remove(); 
}); 

$("#image-box a").live("click", function (e) { 
    var imageBox = $("#image-box"); 
    imageBox.fadeOut().remove(); 
    buildGalleryOverlay(this.href); 
    return false; 
}); 

function buildGalleryOverlay(clickedHref) { 
    var ww = $(window).width(), 
    wh = $(window).height(), 
    imageBox = $("<div class='image-box' id='image-box'></div>").appendTo(overlay).show(), 
    image = $("<img src='" + clickedHref + "' />"), 
    iw, oldW, 
    ih, oldH, 
    overWidth, overHeight, 
    allImages; 

    window.console.log(imageBox); 

    if (!state.total) { 
    state.total = 0; 
    state.images = []; 
    allImages = $(state.gallery).find("a"); 
    $.each(allImages, function (index, value) { 
     state.total += 1; 
     state.images.push(value.href); 
    }); 
    } 

    state.active = state.images.indexOf(clickedHref); 
    state.next = state.images[state.active + 1]; 
    state.prev = state.images[state.active - 1]; 

    image.appendTo(imageBox); 
    window.console.log(image); 
    iw = $(image).width(); 
    ih = $(image).height(); 

    // continued... 

就在這裏,問題的發生,因爲每隔一段時間的圖像鏈接的點擊會爲寬度和高度返回0和0。不知道爲什麼。當發生這種情況時,腳本不工作(如果CSS設置爲width: 0height: 0圖像獲取隱藏 - 或者,如果我把它們關掉,然後這些照片在屏幕過大):

window.console.log(iw); 
    window.console.log(ih); 

    overWidth = iw - ww; 
    overHeight = ih - wh; 

    if (overWidth > 0 || overHeight > 0) { 
    if (overWidth > overHeight) { 
     // Landscape 
     oldW = iw; 
     iw = ww - 80; 
     ih = (iw * ih)/oldW; 
    } 
    else { 
     // Portrait 
     oldH = ih; 
     ih = wh - 160; 
     iw = (ih * iw)/oldH; 
    } 
    } 

    galleryPrev = galleryPrev || $("<a href='##' class='gallery-prev'>Previous</a>"); 
    galleryNext = galleryNext || $("<a href='##' class='gallery-next'>Next</a>"); 

    galleryPrev.attr("href", (state.prev || state.images[state.images.length - 1])).appendTo(imageBox); 
    galleryNext.attr("href", (state.next || state.images[0])).appendTo(imageBox); 


    // Here I've turned off the CSS adjustments because iw and ih were getting 0s 

    if (iw && iw > 0 && ih && ih > 0) { 
    image.css({width: iw + "px", height: ih + "px"}); 
    imageBox.css({width: iw + "px", height: ih + "px"}); 
    } 

} 

}); 
+0

問題標題可能是一個有點誤導 - 我正在加載頁面上的圖像,並試圖立即計算高度/寬度。我會理解,如果它從來沒有奏效,但它在80%的時間內工作,所以其他20%真的讓我感到困惑! – rhodesjason 2012-03-02 19:45:07

+0

而你正在使用燈箱,我想。如果你願意,你最好把答案放在答案中。 – 2012-03-02 19:45:47

+0

在另一個jQuery對象中包裝jQuery對象有什麼意義? 'image = $(...)'...'$(image).width();' – 2012-03-02 19:46:35

回答

0

個人而言,我會使用GD來製作一個PHP腳本,它抓住駐留在服務器上的圖像的尺寸,並通過一些將結果返回給JavaScript的AJAX方法來調用它。然後,頁面不會加載圖像,這在某些情況下可能會有所幫助,因爲它的寬度/高度可能需要排除/修改圖像。

只是一個想法。

+0

雖然GD工具的使用非常昂貴。如果你加載一個包含10個圖像的頁面,並且對10個PHP進程執行10個Ajax調用,這10個PHP進程一次加載GD 10個圖像......等等我認爲我可以聽到CPU在痛苦中尖叫:P最好對圖像進行計算當你處理它們時,不是實時的。將大小/文件類型等上傳的圖像數據存儲在數據庫中,並在通過腳本將圖像上傳到服務器時進行填充,這比使用GD讀取像圖像尺寸和垃圾郵件的方法要好得多AJAX請求。 – Brian 2012-03-02 20:50:17

相關問題