2011-10-21 20 views
5

Đây là same question as this one, nhưng tôi có vấn đề về vấn đề này trên JSFiddle lên here. Vì vậy, tôi nghĩ rằng tôi muốn repost.Làm cách nào để tải JQuery Masonry để nhận ra các mục đã thêm?

JQuery Masonry dường như chỉ đánh giá con của vùng chứa của nó một lần, vào lần chạy đầu tiên. Sau đó, không thể làm cho nó nhìn vào DOM một lần nữa để có được nó để đánh giá lại con cái của nó.

Trả lời

2

Bạn phải vượt qua các nội dung mới vào phương pháp appended Masonry của:

$("#container").append(content).masonry("appended", content); 

tôi cập nhật fiddle bạn here.

+0

Cảm ơn! Không chắc tại sao tôi cần nói với Masonry rằng đã có nội dung được thêm vào. Nó có thể nhận được điều đó từ DOM chỉ bằng cách tải lại các viên gạch khi được gọi. –

+0

Vâng, tôi đoán chỉ xử lý các yếu tố mới có quy mô tốt hơn khi bạn có số lượng lớn các viên gạch. –

+0

Có thể. Phụ thuộc vào số lượng viên gạch. Tôi có hơn 150 viên gạch được xếp chồng động và không có sự chậm trễ rõ rệt. –

1

tôi dường như đã giải quyết điều này bằng cách thêm một dòng để tải lại "gạch" vào _reLayout hàm trong mã JQuery Masonry tại dòng 305.

_reLayout : function(callback) { 

    // This is my added line. 
    // Items might have been added to the DOM since we laid out last. 
    this.reloadItems(); 

    // reset columns 
    var i = this.cols; 
    this.colYs = []; 
    while (i--) { 
    this.colYs.push(this.offset.y); 
    } 
    // apply layout logic to all bricks 
    this.layout(this.$bricks, callback); 
}, 

// ====================== Convenience methods ====================== 

// goes through all children again and gets bricks in proper order 
reloadItems : function() { 
    this.$bricks = this._getBricks(this.element.children()); 
}, 


reload : function(callback) { 
    this.reloadItems(); 
    this._init(callback); 
}, 

Bất cứ ai nhìn thấy bất kỳ vấn đề với điều này?

+1

Cảm ơn Rich, reloadItems() của bạn đã chỉnh sửa được vấn đề Firefox điên rồ của tôi. Nội dung nề của tôi liên tục và nhanh chóng được cập nhật bằng gạch được nối thông qua ajax, cũng như loại bỏ các viên gạch. Chỉ trong Firefox, tôi đã nhận được một số vị trí xấu sau khoảng 3 cập nhật nội dung, vị trí trên cùng của hàng đầu tiên/đầu tiên bị tắt và sẽ giữ nguyên vị trí không chính xác ngay cả khi thay đổi kích thước hoặc gọi lại hàm .masonry().Khi theo dõi các giá trị được chuyển qua hàm _placeBrick, tôi nhận thấy rằng tôi đã nhận được các giá trị "setY" của -Infinity. Một lần nữa tôi không chắc chắn tại sao, nhưng điều này loại bỏ các -Infinity và –

+0

Cool! Vui vì nó đã giúp người khác. Có lẽ tôi có thể thấy về việc làm cho nó như là một lựa chọn trong mã phát hành. –

1

tôi đã sử dụng phương pháp reload:

.masonry('reload')

Đây là masonry doc for reload:

"phương pháp thuận tiện để kích hoạt reloadItems sau đó .masonry() hữu ích cho thêm vào trước hoặc chèn mục.. "

+0

Liên kết đã chết. :( – Manwal

0

nếu bạn đang sử dụng jQuery, điều này sẽ giải quyết mọi vấn đề của bạn.

Bạn đã bao gồm Masonry trong trang/php html của bạn với một cái gì đó như thế này:

<script src="js/masonry.min.js"></script> 
<script> 
    $('#ms-container').masonry({ 
     columnWidth: '.ms-item', 
     itemSelector: '.ms-item' 
    }); 
</script> 

Thay vào đó, hãy để nó như thế này:

<script src="js/masonry.min.js"></script> 
<script src="js/masonry-init.js"></script> 

Và tạo ra các tập tin js/masonry-init.js như sau:

$('#ms-container').masonry({ 
    columnWidth: '.ms-item', 
    itemSelector: '.ms-item' 
}); 
var masonryUpdate = function() { 
    setTimeout(function() { 
     $('#ms-container').masonry(); 
    }, 500); 
} 
$(document).on('click', masonryUpdate); 
$(document).ajaxComplete(masonryUpdate); 

Không bao giờ phải lo lắng về điều đó nữa!

Các vấn đề liên quan