您的当前位置:首页正文

网页图片延时加载的js代码_javascript技巧

2023-12-02 来源:布克知识网
实现原理

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

然后在页面加载时,把所有使用了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"); });

小编还为您整理了以下内容,可能对您也有帮助:

怎么用 javascript 做网页中的图片定时刷新

做网页定时刷新图片的方法:

Javascript 返回上一页

1. Javascript 返回上一页 history.go(-1), 返回两个页面: history.go(-2);

2. history.back().

3. window.history.forward()返回下一页

4. window.history.go(返回第几页,也可以使用访问过的URL)

例:

<a href="javascript:history.go(-1);">向上一页</a>

response.Write("<script language=javascript>")

response.Write("if(!confirm('完成任务?')){history.back();}")

response.Write("</script>")

response.Write("<script language=javascript>history.go(-1);</script>")

<a href="javascript:history.go(-1);">向上一页</a>

页面跳转:onclick="window.location.href='list.aspx'"

P.S.

小技巧(JS引用JS):

<script type=text/javascript>

<!--

if (typeof SWFObject == "undefined") {

document.write('<scr' + 'ipt type="text/javascript" src="/scripts/swfobject-1.5.js"></scr' + 'ipt>');}

//-->

</script>

Javascript刷新页面的几种方法:

1 history.go(0)

2 location.reload()

3 location=location

4 location.assign(location)

5 document.execCommand('Refresh')

6 window.navigate(location)

7 location.replace(location)

8 document.URL=location.href

自动刷新页面的方法:

1.页面自动刷新:把如下代码加入<head>区域中

<meta http-equiv="refresh" content="20">

其中20指每隔20秒刷新一次页面.

2.页面自动跳转:把如下代码加入<head>区域中

<meta http-equiv="refresh" content="20;url=http://www.javaeye.com">

其中20指隔20秒后跳转到http://www.javaeye.com/页面

3.页面自动刷新js版

<script language="JavaScript">

function myrefresh()

{

window.location.reload();

}

setTimeout('myrefresh()',1000); //指定1秒刷新一次

</script>

ASP.NET如何输出刷新父窗口脚本语句

1. this.response.write("<script>opener.location.reload();</script>");

2. this.response.write("<script>opener.window.location.href = opener.window.location.href;</script>");

3. Response.Write("<script language=javascript>opener.window.navigate(''你要刷新的页.asp'');</script>")

JS刷新框架的脚本语句

//如何刷新包含该框架的页面用

<script language=JavaScript>

parent.location.reload();

</script>

//子窗口刷新父窗口

<script language=JavaScript>

self.opener.location.reload();

</script>

( 或 <a href="javascript:opener.location.reload()">刷新</a> )

//如何刷新另一个框架的页面用

<script language=JavaScript>

parent.另一FrameID.location.reload();

</script>

如果想关闭窗口时刷新或者想开窗时刷新的话,在<body>中调用以下语句即可。

<body onload="opener.location.reload()"> 开窗时刷新

<body onUnload="opener.location.reload()"> 关闭时刷新

<script language="javascript">

window.opener.document.location.reload()

</script>

js实现延迟加载的几种方法详解

这是一个面试经常问到的问题:js的延迟加载方法 (js的延迟加载有助于提高页面的加载速度)

主要考察对程序的性能方面是否有研究,程序的性能是一个项目不断地追求的,通常也是项目完成后需要长期做的一件事情,像腾讯QQ依然对程序的性能不断地做优化,让用户的体验更好,性能优化的核心思想就是快,可以预先准备数据(如缓存的使用),可以按需获取,可以分段获取等都是常见的优化手段。

解题思路 :

1.defer属性

<script src="file.js" defer> </script>

浏览器会并行下载 file.js和其它有 defer 属性的script,而不会阻塞页面后续处理。defer属性在IE 4.0中就实现了,超过10多年了!Firefox从 3.5 开始支持defer属性 。

注:所有的defer脚本保证是按顺序依次执行的。

2.async属性

<script src="file.js" async> </script>

async属性是HTML5新增的。作用和defer类似,但是它将在下载后尽快执行,不能保证脚本会按顺序执行。它们将在onload 事件之前完成。

Firefox3.6、Opera 10.5、IE 9和 最新的Chrome 和 Safari 都支持 async 属性。可以同时使用 async 和 defer,这样IE 4之后的所有IE 都支持异步加载。

3.动态创建DOM方式 (使用的最多)

<script type="text/javascript">

function downloadJSAtOnload() {

var element = document.createElement("script");

element.src = "defer.js";

document.body.appendChild(element);

}

if (window.addEventListener) //添加监听事件

window.addEventListener("load",downloadJSAtOnload, false); //事件在冒泡阶段执行

else if (window.attachEvent)

window.attachEvent("onload",downloadJSAtOnload);

else

window.onload = downloadJSAtOnload;

</script>

PS: 这里插一句addEventListener() 也是常考的知识点之一:

addEventListener() 方法用于向指定元素添加事件句柄。

使用 removeEventListener() 方法来移除 addEventListener() 方法添加的事件句柄。

语法:element.addEventListener(event, function, useCapture)

event (必须)字符串,指定事件名。注意: 不要使用 “on” 前缀。 例如,使用 “click” ,而不是使用 “onclick”。

function (必须)指定要事件触发时执行的函数。当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, “click” 事件属于 MouseEvent(鼠标事件) 对象。

useCapture (可选)布尔值,指定事件是否在捕获或冒泡阶段执行。【true:事件句柄在捕获阶段执行; false:默认,事件句柄在冒泡阶段执行】

<p>该实例使用 addEventListener() 方法来向按钮添加点击事件。</p>

<button id="myBtn">点我</button>

<p id="demo"></p>

<script>

document.getElementById("myBtn").addEventListener("click", function(){

document.getElementById("demo").innerHTML = "Hello World";

});

</script>

效果如图:

4.使用Jquery的getScript()方法

$.getScript("outer.js",function(){//回调函数,成功获取文件后执行的函数

console.log("脚本加载完成")

});

从源码可以看出,这个方法最后还是调用了jQuery.ajax()来请求了js文件的。

5.使用setTimeout延迟方法的加载时间

延迟加载js代码,给网页加载留出时间

<script type="text/javascript">

function A(){

$.post("/lord/login",{name:username,pwd:password},function(){

alert("Hello World!");

})

}

$(function (){

setTimeout("A()",1000); //延迟1秒

})

</script>

6.让js最后加载

例如引入外部js脚本文件时,如果放入html的head中,则页面加载前该js脚本就会被加载入页面,而放入body中,则会按照页面从上倒下的加载顺序来运行javascript的代码~~~ 所以我们可以把js外部引入的文件放到页面底部,来让js最后引入,从而加快页面加载速度。

上述方法5,6也会偶尔让你收到Google页面速度测试工具的“延迟加载javascript”警告。所以这里的解决方案将是来自Google帮助页面的推荐方案。

//这些代码应被放置在</body>标签前(接近HTML文件底部) <script type="text/javascript">

function downloadJSAtOnload() {

var element = document.createElement("script");

element.src = "defer.js";

document.body.appendChild(element);

}

if (window.addEventListener)

window.addEventListener("load", downloadJSAtOnload, false);

else if (window.attachEvent)

window.attachEvent("onload", downloadJSAtOnload);

else window.onload = downloadJSAtOnload;

</script>

这段代码意思是等到整个文档加载完后,再加载外部文件“defer.js”。

使用此段代码的步骤:

复制上面代码

粘贴代码到HTML的标签前 (靠近HTML文件底部)

修改“defer.js”为你的外部JS文件名

确保你文件路径是正确的。例如:如果你仅输入“defer.js”,那么“defer.js”文件一定与HTML文件在同一文件夹下。

注意:这段代码直到文档加载完才会加载指定的外部js文件。因此,不应该把那些页面正常加载需要依赖的javascript代码放在这里。而应该将JavaScript代码分成两组。一组是因页面需要而立即加载的javascript代码,另外一组是在页面加载后进行操作的javascript代码(例如添加click事件或其他东西)。这些需等到页面加载后再执行的JavaScript代码,应放在一个外部文件,然后再引进来。

若有不足请多多指教!希望给您带来帮助!

总结

几种延迟加载JS代码的方法加快网页的访问速度

本文介绍了如何延迟javascript代码的加载,加快网页的访问速度。
当一个网站有很多js代码要加载,js代码放置的位置在一定程度上将会影像网页的加载速度,为了让我们的网页加载速度更快,本文总结了一下几个注意点:
1、延迟加载js代码
复制代码
代码如下:
<script
type=”text/javascript”
src=”"
id=”my”></script>
<script
type=”text/javascript”>
setTimeout(“document.getElementById(‘my').src='include/php100.php';
“,3000);//延时3秒
</script>
这样通过延迟加载js代码,给网页加载留出更多的时间!
2、js最后加载方案一
在需要插入JS的地方插入以下代码:
程序代码
复制代码
代码如下:
<span
id=”L4EVER”>LOADING…</span>
当然,那个LOADING…你可以换成自己喜欢的小图片.看起来很有AJAX效果呢.
然后在页面最底端插入:
程序代码
复制代码
代码如下:
<span
id=”AD_L4EVER”>你的JS代码在这里!</span
>
<script>L4EVER.innerHTML=AD_L4EVER.innerHTML;AD_L4EVER.innerHTML=”";</script>
3、让JS最后加载方案二
这个牵涉到网页的加载顺序问题,例如引入外部js脚本文件时,如果放入html的head中,则页面加载前该js脚本就会被加载入页面,而放入body中,则会按照页面从上倒下的加载顺序来运行javascript的代码~~~
所以我们可以把js外部引入的文件放到页面底部,来让js最后引入,从而加快页面加载速度。

几种延迟加载JS代码的方法加快网页的访问速度

本文介绍了如何延迟javascript代码的加载,加快网页的访问速度。
当一个网站有很多js代码要加载,js代码放置的位置在一定程度上将会影像网页的加载速度,为了让我们的网页加载速度更快,本文总结了一下几个注意点:
1、延迟加载js代码
复制代码
代码如下:
<script
type=”text/javascript”
src=”"
id=”my”></script>
<script
type=”text/javascript”>
setTimeout(“document.getElementById(‘my').src='include/php100.php';
“,3000);//延时3秒
</script>
这样通过延迟加载js代码,给网页加载留出更多的时间!
2、js最后加载方案一
在需要插入JS的地方插入以下代码:
程序代码
复制代码
代码如下:
<span
id=”L4EVER”>LOADING…</span>
当然,那个LOADING…你可以换成自己喜欢的小图片.看起来很有AJAX效果呢.
然后在页面最底端插入:
程序代码
复制代码
代码如下:
<span
id=”AD_L4EVER”>你的JS代码在这里!</span
>
<script>L4EVER.innerHTML=AD_L4EVER.innerHTML;AD_L4EVER.innerHTML=”";</script>
3、让JS最后加载方案二
这个牵涉到网页的加载顺序问题,例如引入外部js脚本文件时,如果放入html的head中,则页面加载前该js脚本就会被加载入页面,而放入body中,则会按照页面从上倒下的加载顺序来运行javascript的代码~~~
所以我们可以把js外部引入的文件放到页面底部,来让js最后引入,从而加快页面加载速度。

怎么实现JS同步、异步、延迟加载

这次给大家带来怎么实现JS同步、异步、延迟加载,实现JS同步、异步、延迟加载的注意事项有哪些,下面就是实战案例,一起来看一下。

一:同步加载

我们平时使用的最多的一种方式。

<script src="http://yourdomain.com/script.js"></script>

同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前加载完成,才能进行下一步操作。所以默认同步执行才是安全的。但这样如果js中有输出document内容、修改dom、重定向等行为,就会造成页面堵塞。所以一般建议把<script>标签放在<body>结尾处,这样尽可能减少页面阻塞。

二:异步加载

异步加载又叫非阻塞加载,浏览器在下载执行js的同时,还会继续进行后续页面的处理。主要有三种方式。

方法一:也叫Script DOM Element

(function(){

var scriptEle = document.createElement("script");

scriptEle.type = "text/javasctipt";

scriptEle.async = true;

scriptEle.src = "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js";

var x = document.getElementsByTagName("head")[0];

x.insertBefore(scriptEle, x.firstChild);

})();<async>属性是HTML5中新增的异步支持。此方法被称为Script DOM Element 方法。Google Analytics 和 Google+ Badge 都使用了这种异步加载代码。

(function(){;

var ga = document.createElement('script');

ga.type = 'text/javascript';

ga.async = true;

ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

var s = document.getElementsByTagName('script')[0];

s.parentNode.insertBefore(ga, s);

})();但是这种加载方式执行完之前会阻止onload事件的触发,而现在很多页面的代码都在onload时还执行额外的渲染工作,所以还是会阻塞部分页面的初始化处理。

方法二:onload时的异步加载

(function(){

if(window.attachEvent){

window.attachEvent("load", asyncLoad);

}else{

window.addEventListener("load", asyncLoad);

}

var asyncLoad = function(){

var ga = document.createElement('script');

ga.type = 'text/javascript';

ga.async = true;

ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

var s = document.getElementsByTagName('script')[0];

s.parentNode.insertBefore(ga, s);

}

)();这种方法只是把插入script的方法放在一个函数里面,然后放在window的onload方法里面执行,这样就解决了阻塞onload事件触发的问题。

注:DOMContentLoaded与load的区别。前者是在document已经解析完成,页面中的dom元素可用,但是页面中的图片,视频,音频等资源未加载完,作用同jQuery中的ready事件;后者的区别在于页面所有资源全部加载完毕。

方法三:其他方法

由于JavaScript的动态性,还有很多异步加载方法: XHR Injection、 XHR Eval、 Script In Iframe、 Script defer属性、 document.write(script tag)。

XHR Injection(XHR 注入):通过XMLHttpRequest来获取javascript,然后创建一个script元素插入到DOM结构中。ajax请求成功后设置script.text为请求成功后返回的responseText。

//获取XMLHttpRequest对象,考虑兼容性。

var getXmlHttp = function(){

var obj;

if (window.XMLHttpRequest)

obj = new XMLHttpRequest();

else

obj = new ActiveXObject("Microsoft.XMLHTTP");

return obj;

};

//采用Http请求get方式;open()方法的第三个参数表示采用异步(true)还是同步(false)处理

var xmlHttp = getXmlHttp();

xmlHttp.open("GET", "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js", true);

xmlHttp.send();

xmlHttp.onreadystatechange = function(){

if (xmlHttp.readyState == 4 && xmlHttp.status == 200){

var script = document.createElement("script");

script.text = xmlHttp.responseText;

document.getElementsByTagName("head")[0].appendChild(script);

}

}XHR Eval:与XHR Injection对responseText的执行方式不同,直接把responseText放在eval()函数里面执行。

//获取XMLHttpRequest对象,考虑兼容性。

var getXmlHttp = function(){

var obj;

if (window.XMLHttpRequest)

obj = new XMLHttpRequest();

else

obj = new ActiveXObject("Microsoft.XMLHTTP");

return obj;

};

//采用Http请求get方式;open()方法的第三个参数表示采用异步(true)还是同步(false)处理

var xmlHttp = getXmlHttp();

xmlHttp.open("GET", "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js", true);

xmlHttp.send();

xmlHttp.onreadystatechange = function(){

if (xmlHttp.readyState == 4 && xmlHttp.status == 200){

eval(xmlHttp.responseText);

//alert($);//可以弹出$,表明JS已经加载进来。click事件放在其它出会出问题,应该是还没加载进来

$("#btn1").click(function(){

alert($(this).text());

});

}

}Script In Irame:在父窗口插入一个iframe元素,然后再iframe中执行加载JS的操作。

var insertJS = function(){alert(2)};

var iframe = document.createElement("iframe");

document.body.appendChild(iframe);

var doc = iframe.contentWindow.document;//获取iframe中的window要用contentWindow属性。

doc.open();

doc.write("<script>var insertJS = function(){};</script><body onload='insertJS()'></body>");

doc.close();GMail Mobile:业内JS内容被注释,所以不会执行,在需要的时候,获取script中的text内容去掉注释,调用eval()执行。

<script type="text/javascript">

/*

var ...

*/

</script>HTML5新属性:async和defer属性

defer属性:IE4.0就出现。defer属声明脚本中将不会有document.write和dom修改。浏览器会并行下载其他有defer属性的script。而不会阻塞页面后续处理。注:所有的defer脚本必须保证按顺序执行的。

<script type="text/javascript" defer></script>

async属性:HTML5新属性。脚本将在下载后尽快执行,作用同defer,但是不能保证脚本按顺序执行。他们将在onload事件之前完成。

<script type="text/javascript" defer></script>

Firefox 3.6、Opera 10.5、IE 9和最新的Chrome和Safari都支持async属性。可以同时使用async和defer,这样IE 4之后的所有IE都支持异步加载。

没有async属性,script将立即获取(下载)并执行,期间阻塞了浏览器的后续处理。如果有async属性,那么script将被异步下载并执行,同时浏览器继续后续的处理。

总结: 对于支持HTML5的浏览器,实现JS的异步加载只需要在script元素中加上async属性,为了兼容老版本的IE还需加上defer属性;对于不支持HTML5的浏览器(IE可以用defer实现),可以采用以上几种方法实现。原理基本上都是向DOM中写入script或者通过eval函数执行JS代码,你可以把它放在匿名函数中执行,也可以在onload中执行,也可以通过XHR注入实现,也可以创建一个iframe元素,然后在iframe中执行插入JS代码。

三:延迟加载

有些JS代码在某些情况在需要使用,并不是页面初始化的时候就要用到。延迟加载就是为了解决这个问题。将JS切分成许多模块,页面初始化时只加载需要立即执行的JS,然后其它JS的加载延迟到第一次需要用到的时候再加载。类似图片的延迟加载。

JS的加载分为两个部分:下载和执行。异步加载只是解决了下载的问题,但是代码在下载完成后就会立即执行,在执行过程中浏览器处于阻塞状态,响应不了任何需求。

解决思路:为了解决JS延迟加载的问题,可以利用异步加载缓存起来,但不立即执行,需要的时候在执行。如何进行缓存呢?将JS内容作为Image或者Object对象加载缓存起来,所以不会立即执行,然后在第一次需要的时候在执行。

1:模拟较长的下载时间:

利用thread让其sleep一段时间在执行下载操作。

2:模拟较长的JS代码执行时间

var start = Number(new Date());

while(start + 5000 > Number(new Date())){//执行JS}这段代码将使JS执行5秒才完成!

JS延迟加载机制(LazyLoad):简单来说,就是在浏览器滚动到某个位置在触发相关的函数,实现页面元素的加载或者某些动作的执行。如何实现浏览器滚动位置的检测呢?可以通过一个定时器来实现,通过比较某一时刻页面目标节点位置和浏览器滚动条高度来判断是否需要执行函数。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

vue自动化表单有哪几种方式

vue-element怎么做出音乐播放器

求教JS控制网页图片延时或随滚动条加载代码

这个是lazyload

这里有一个类似的效果

里面有教程和源码

参考资料:http://www.blueidea.com/common/shoutbox/redir.asp?8=u&id=11641

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

Top