|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
也许唯一可以让世人留恋Java的理由就剩下它的王牌——跨平台。</p>程序申明
【upload】
程序中最主要的办法就是upload了,挪用它就能够举行无革新上传。upload的历程是如许的,起首用stop办法中断上一次上传,并判别是不是选择文件。然后分离挪用_setIframe,_setForm和_setInput,天生必要的iframe,form和input。假如设置了timeout属性的话,会主动设置计时器:
以下为援用的内容:
if(this.timeout>0){
this._timer=setTimeout($$F.bind(this._timeout,this),this.timeout*1000);
}
ps:经测试,小于0的延不时间,ie会作废实行,而其他扫瞄器会当做0实行。
程序有一个_sending属性用来判别上传形态。在stop(中断),remove(移除),_finis(完成),_timeout(超时)中会把它设为false。而在上传入手下手前要把它设置为true。最初提交表单就入手下手上传了。
【iframe】
程序利用_setIframe函数来创立无革新必要的iframe。因为ie中iframe的name不克不及修正的成绩,要如许创立iframe:
以下为援用的内容:
variframename="QUICKUPLOAD_"+QuickUpload._counter++,
iframe=document.createElement($$B.ie?"<iframename=""+iframename+"">":"iframe");
iframe.name=iframename;
iframe.style.display="none";
ps:关于iframe的name的成绩参考这里的iframe部分。ie8已能够修正name了,但在非尺度(怪辟)形式下仍是不克不及修正。个中利用了一个QuickUpload函数本身的_counter属性做盘算器,这就可以包管各个实例的iframe的name就不会反复。
为了能在文件上传完成后实行回调函数,会在iframe的onload中实行_finish函数:
以下为援用的内容:
varfinish=this._fFINISH=$$F.bind(this._finish,this);
if($$B.ie){
iframe.attachEvent("onload",finish);
}else{
iframe.onload=$$B.opera?function(){this.onload=finish;}:finish;
}
在ie必要用attachEvent来绑定onload,由于在ie中间接设置onload是有效的。除用attachEvent还能够用onreadystatechange取代。至于缘故原由我也不分明,具体参考“判别iframe是不是加载完成的完善办法”。
iframe的加载另有一个成绩,测试以下代码:
以下为援用的内容:
<body><divid="msg">形态:</div></body>
<script>
varmsg=document.getElementById("msg");
variframe=document.createElement("iframe");
iframe.onload=function(){msg.innerHTML+="onload,";}
document.body.appendChild(iframe);
iframe.src="http://cloudgamer.cnblogs.com/"
</script>
了局safari,chrome城市触发onload两次,而opera,ff和ie(请自行兼容)都是1次。
估量在safari和chrome在appendChild以后就举行第一次加载,而且在设置src之前加载终了,以是触发了两次。假如在拔出body之前给iframe任意设置一个src(除空值),直接加长第一次加载,那末也只触发一次了。ps:不设置或空值的src相称于链接到“about:blank”(空缺页)。
那末opera,ff和ie多是第一次加载太慢,第二次掩盖了第一次的,以是只触发了一次onload。ps:也多是其他缘故原由,比方扫瞄器优化之类的,我也不断定。
针对加载过快的成绩,能够在onload的时分依据_sending断定之前是不是上传形态来办理。固然没测试出来,会不会有_sending设置以后submit之前恰好触发第一次onload的情形呢?
针对这个成绩,在upload办法中会把_sending放在submit以后设置。那假如在submit以后_sending设置之前就触发了onload呢?(...澹┱飧銮榭龌静换岢鱿郑绻娴某鱿郑桶_sending设置放到submit后面吧。
opera另有一个贫苦的成绩,测试上面代码:
以下为援用的内容:
<body>
<divid="msg">形态:</div>
<formaction="http://cloudgamer.cnblogs.com/"target="ifr">
</form>
</body>
<script>
varmsg=document.getElementById("msg");
variframe=document.createElement("iframe");
iframe.name="ifr";
iframe.onload=function(){msg.innerHTML+="onload,";}
document.body.appendChild(iframe);
msg.innerHTML+="submit,";
document.forms[0].submit();
</script>
ie和ff显现submit,onload,safari和chrome显现的是onload,submit,onload,跟下面的剖析分歧。而opera却显现submit,onload,onload,两次onload都是在submit以后触发的。这个情形就不克不及纯真用_sending来办理了。是否是submit不克不及使iframe作废加载呢?在appendChild之前设一个src,了局一般的只触发onload一次,看来是能够的啊。
固然不晓得缘故原由,举措仍是有的,一个是appendChild前设一个src,还能够在第一次onload中从头设置onload,像程序那样。但这两个办法都存在不断定性,不克不及完整办理成绩,但也找不到更好的办法了。
ff的onload另有一个成绩,在呈现ERROR_INTERNET_CONNECTION_RESET(文件巨细凌驾服务器限定)之类的服务器毛病时,即便加载完成也不会触发onload,临时找不到办理举措。
iframe有一个缺点是只能用onload判别加载完成,但没有举措判别是不是加载乐成。没有相似XMLHTTP的status的器材,赶上404之类的毛病也没举措辨别出来。在利用时要做好这方面的处置,比方申明同意上传文件巨细,超不时间,怎样处置长工夫无呼应等。
<p>你觉得学习.NET怎么样,我懂的少,问的可能很幼稚,见笑了啊:) |
|