一段实现页面上的图片延时加载的js代码

JavaScript082

一段实现页面上的图片延时加载的js代码,第1张

相关地址:

http://list.taobao.com/browse/30-50029375/n-1----------------------0---------yes-------g,ge3denzxhazdumzsgy3tsnzq-----------------------42-grid-commend-0-all-50029375.htm?TBG=14153.14.7&ssid=r18-s18

http://shop.qq.com/shopList.html

大家如果使用firebug去查看的话就会发现,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对于比较长的页面来说,这个方案是比较好的。

实现原理

把所有需要延时加载的图片改成如下的格式:

<img

lazy_src="图片路径"

border="0"/>

然后在页面加载时,把所有使用了lazy_src的图片都保存到数组里,然后在滚动时计算可视区域的top,然后把延时加载的图片中top小于当前可视区域(即图片出现在可视区域内)的图片的src的值用lazy_src的来替换(加载图片)

代码

复制代码

代码如下:

lazyLoad=(function()

{

var

map_element

=

{}

var

element_obj

=

[]

var

download_count

=

0

var

last_offset

=

-1

var

doc_body

var

doc_element

var

lazy_load_tag

function

initVar(tags)

{

doc_body

=

document.body

doc_element

=

document.compatMode

==

'BackCompat'

?

doc_body:

document.documentElement

lazy_load_tag

=

tags

||

["img",

"iframe"]

}

function

initElementMap()

{

var

all_element

=

[]

//从所有相关元素中找出需要延时加载的元素

for

(var

i

=

0,

len

=

lazy_load_tag.length

i

<

len

i++)

{

var

el

=

document.getElementsByTagName(lazy_load_tag[i])

for

(var

j

=

0,

len2

=

el.length

j

<

len2

j++)

{

if

(typeof(el[j])

==

"object"

&&

el[j].getAttribute("lazy_src"))

{

element_obj.push(all_element[key])

}

}

}

for

(var

i

=

0,

len

=

element_obj.length

i

<

len

i++)

{

var

o_img

=

element_obj[i]

var

t_index

=

getAbsoluteTop(o_img)//得到图片相对document的距上距离

if

(map_element[t_index])

{

map_element[t_index].push(i)

}

else

{

//按距上距离保存一个队列

var

t_array

=

[]

t_array[0]

=

i

map_element[t_index]

=

t_array

download_count++//需要延时加载的图片数量

}

}

}

function

initDownloadListen()

{

if

(!download_count)

return

var

offset

=

(window.MessageEvent

&&

!document.getBoxObjectFor)

?

doc_body.scrollTop:

doc_element.scrollTop

//可视化区域的offtset=document的高+

var

visio_offset

=

offset

+

doc_element.clientHeight

if

(last_offset

==

visio_offset)

{

setTimeout(initDownloadListen,

200)

return

}

last_offset

=

visio_offset

var

visio_height

=

doc_element.clientHeight

var

img_show_height

=

visio_height

+

offset

for

(var

key

in

map_element)

{

if

(img_show_height

>

key)

{

var

t_o

=

map_element[key]

var

img_vl

=

t_o.length

for

(var

l

=

0

l

<

img_vl

l++)

{

element_obj[t_o[l]].src

=

element_obj[t_o[l]].getAttribute("lazy_src")

}

delete

map_element[key]

download_count--

}

}

setTimeout(initDownloadListen,

200)

}

function

getAbsoluteTop(element)

{

if

(arguments.length

!=

1

||

element

==

null)

{

return

null

}

var

offsetTop

=

element.offsetTop

while

(element

=

element.offsetParent)

{

offsetTop

+=

element.offsetTop

}

return

offsetTop

}

function

init(tags)

{

initVar(tags)

initElementMap()

initDownloadListen()

}

return

{

init:

init

}

})()

使用方法:把页面上需要延时加载的图片src改成为lazy_src,然后把上面的js放到body最后面,然后调用:lazyLoad.init()

调戏的方法可以使用firebug来查看一时图片是否是延时加载。

另外:

如果你的页面上存在有内容切换的栏目的话,可能在切换时切换的内容里的图片可能会不显示,处理的方法是在内容时单独图片加载处理,如:

复制代码

代码如下:

///切换内容的代码...

chlid.find("img[init_src]").each(function(){

$(this).attr("src",$(this).attr("init_src"))

$(this).removeAttr("init_src")

})

您好:您看插件的名字应该知道,是滚动条动的时候才会延时加载。所以scrollLoading中肯定加了滚动条事件,在滚动事件中加的加载的方法。这样就只能改动他的js插件才可以了。找到加滚动事件的方法。看他里面怎么实现滚动加载的,然后把加到你的图片滚动事件中就可以了。目测只有这一个方法。