日期:2014-05-16  浏览次数:20924 次

瀑布流遭遇ajax排版问题
本人建立一个类似于瀑布流类型的图片站,php+jquery+ajax,瀑布流用插件wookmark来实现,页面数据使用ajax调入后再用wookmark排版。页面结构如下:

<div id="bodyright">
</div>

wookmark代码如下:
   
function pbl(){
        var $handler = $('.fieldset');
        $handler.wookmark({
            // Prepare layout options.
            autoResize: true, // This will auto-update the layout when the browser window is resized.
            container: $('#bodyright'), // Optional, used for some extra CSS styling
            offset: 8, // Optional, the distance between grid items
            outerOffset: 15, // Optional, the distance to the containers border
            itemWidth: 245 // Optional, the width of a grid item
        });
        
    }

由于.fieldset使用ajax从mysql数据库调用写入到bodyright里面,事先并不存在,所以只能在ajax的success里面加上pbl();,现在出现一个问题,从mysql调出数据是需要时间的,执行pbl()函数的时候有时候数据尚未全部加载完成,造成部分图片排版重叠,只有改写成setTimeout(pbl,1000);延迟执行才能解决,但是不同网络下延迟时间不同,影响显示效果。
   我的问题是:对这种完全依靠ajax加载数据的页面,要实现瀑布流效果有没有适用的插件,wookmark是我找到的可以居中并根据窗口大小自动调节列数的,有没有其他插件可以达到这种效果?有没有判断数据完全加载完才执行函数的代码?

------解决方案--------------------
ajax async参数 (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。

------解决方案--------------------
ajax同步加载,window.onload中执行pbl函数

要不异步加载如果网速快有可能window.onload执行完毕后ajax才返回,就不会再出发window.onload事件了,你得自己写逻辑判断所有图片是否加载完毕,全部加载完毕后在执行pbl
------解决方案--------------------
引用:
ajax里面加上async:false后,结果没什么改变。加载进去的是多个class='fiedlset'的div,里面包含很多div,span,img,p,后面总是有div覆盖到上一个div一半的部分。

这个和ajax的同步异步关系不大,因为ajax只是取到图片src而已,有地址后再载入图片才是问题。
此时不同的网络和浏览器对图片加载影响很大,你只能自己写方法判定图片是否加载完。
比如:图片的onload方法里对已加载的图片进行统计,并且要设置个定时时间判定图片是否全部加载完成,超时的则从dom中移除。如果全部加载好了就放入你的.fieldset容器中后再执行pbl。