动态加载图片与脚本

动态加载图片与脚本
本文介绍了使用JavaScript动态加载图片的多种方法,并探讨了如何判断图片加载成功及自动调整图片大小的技术。此外,还讨论了动态加载脚本的方法及其加载状态的判断。

动态加载图片许多方法。第一种方法,随便创建一个块状元素如DIV,把它加入DOM树,然后用CSS设置背景图片。第二种前半部分同第一种,只不过这次用innerHTML加一张图片变成它的子元素。第三种,利用createElement("img"),然后加入DOM与指定它的src属性。第四种,new Image对象,然后加入DOM与指定它的src属性。


  window.onload = function(){
    var image = document.createElement("div");
    document.body.appendChild(image)
    image.style.cssText = "width:400px;height:300px;background:url(http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s001.jpg)"
  }

    window.onload = function(){
    var image = document.createElement("div");
    document.body.appendChild(image)
    image.innerHTML = "<img src='http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s001.jpg'>";
  }

  window.onload = function(){
    var image = document.createElement("img");
    document.body.appendChild(image)
    image.src='http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s001.jpg';
  }

  window.onload = function(){
    var image = new Image;
    document.body.appendChild(image)
    image.src='http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s001.jpg';
  }

从代码量来看,首选最后一种。后两种起码很容易就得到图片对象的引用,我们可以用complete属性来判断其是否加载成功。不同于后面将讲述的script标签,在IE中,图片对象只要一加入src属性就开始下载图片,不管它是否已加入DOM树中。

<!doctype html> <title>javascript图片加载 by 司徒正美</title> <meta charset="utf-8"/> <meta name="keywords" content="javascript图片加载 by 司徒正美" /> <meta name="description" content="javascript图片加载 by 司徒正美" /> <script type="text/javascript"> window.onload = function(){ var image = new Image; //document.body.appendChild(image) image.src='http://dx.78land.com/images/new.jpg'; var i = 0; (function(){ alert(image.complete); i++; if(i<4){ setTimeout(arguments.callee,1); } })() } </script> <h1 id="text">javascript图片加载 by 司徒正美</h1>

运行代码

<!doctype html> <title>javascript图片加载 by 司徒正美</title> <meta charset="utf-8"/> <meta name="keywords" content="javascript图片加载 by 司徒正美" /> <meta name="description" content="javascript图片加载 by 司徒正美" /> <script type="text/javascript"> window.onload = function(){ var image = new Image; image.src='http://dx.78land.com/images/new.jpg'; var i = 0; (function(){ alert(image.complete); i++; if(i<4){ setTimeout(arguments.callee,1); } })() document.body.appendChild(image); } </script> <h1 id="text">javascript图片加载 by 司徒正美</h1>

运行代码

来一个有用的应用,自动调整图片的大小。

<!doctype html> <title>javascript自动调整图片大小 by 司徒正美</title> <meta charset="utf-8"/> <meta name="keywords" content="javascript自动调整图片大小 by 司徒正美" /> <meta name="description" content="javascript自动调整图片大小 by 司徒正美" /> <script type="text/javascript"> window.onload = function(){ var image = new Image; image.src='http://dx.78land.com/images/new.jpg'; image.style.display = ""; var i = 0; (function(){ i++; if(image.complete){ (image.width>500) && (image.width = 500);/*统一设置*/ (image.height>200) && (image.height = 200);/*统一设置*/ }else{ setTimeout(arguments.callee,1); } })() document.body.appendChild(image); } </script> <h1 id="text">javascript自动调整图片大小 by 司徒正美</h1>

运行代码

至于script,不像img有专门的内置对象,我们必须用createElement来创建。判断是否加载成功,与图片很不一样,我就不明白微软为什么不统一用complete属性,这次它改用readyState属性。不过 XMLHttpReques对象,微软也是用readyState属性。为了判断readyState 是否已经改变,微软还专门提供了一个onreadystatechange事件,这样我们就不用像上面那样写定时器了。readyState 有五个可能的值,分别为:

  • uninitialized:Object is not initialized with data.
  • loading:Object is loading its data..
  • loaded:Object has finished loading its data.
  • interactive:User can interact with the object even though it is not fully loaded.
  • complete:Object is completely initialized.

很明显当readyState 为complete时,脚本就可以运作了。不过onreadystatechange 事件不局限于script标签,它还可以用于object,iframe,frame,style等标签中。但有一个问题,如果我们想刷新页面,重新执行脚本,就没有反应,这时我们就要用到loaded值。换言之,complete只个时间点,loaded是个时间段。

readyState

对于标准浏览器,它们就没有这么复杂,直接用onload事件来监听就成了。

<!doctype html> <title>javascript脚本加载 by 司徒正美</title> <meta charset="utf-8"/> <meta name="keywords" content="javascript脚本加载 by 司徒正美" /> <meta name="description" content="javascript脚本加载 by 司徒正美" /> <script type="text/javascript"> window.onload = function(){ var script = document.createElement("script") script.type = "text/javascript"; script.src = "http://files.cnblogs.com/rubylouvre/myjs.js"; document.body.appendChild(script); if (!+"\v1"){ //IE script.onreadystatechange = function(){ if (script.readyState == "complete" || script.readyState == "loaded"){ alert(getElementsByClassName("title")[0].innerHTML); } }; } else { script.onload = function(){ alert(getElementsByClassName("title")[0].innerHTML); }; } } </script> <h1 class="title">javascript脚本加载 by 司徒正美</h1>

运行代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值