IE7 Image对象的readyState属性问题

zoutuo 2009-10-29 08:56:16
我写了一个上传图片的js,在IE6和火狐的IE TAB里都好用,可是到了IE7里就不行了,检查了一下原因:是我声明的这个Image对象的readyState属性问题,我在下面是这么判断的:

if(ImgObj.readyState!="complete"){
setTimeout("CheckProperty(FileObj)",500);
return false;
}

也就是说,如果readyState不是complete的话,会一直加载。为什么IE7Image对象的readyState属性永远都是uninitialized?
...全文
813 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyuboaijava 2010-05-28
  • 打赏
  • 举报
回复
BUG!!!
img objects created using createElement fail to trigger the onreadystatechange event if the source file is already stored on the browser's cache. Only if the file is downloaded form the web server you can expect the event to fire up. This ocurrs on IE7, but it probably also happens in IE8. The bad news is that the onload event also has the same problem.
这是我在国外网站上找到的信息,有可能就是一个bug,还是尝试其它加载方法吧
liuyuboaijava 2010-05-28
  • 打赏
  • 举报
回复
大家看看有没有更好的解决办法,用纯html运行很正常,但在服务器中页面就会readyState属性是uninitialized,我觉得还是用ajax异步请求open的时候才不会为uninitialized,但这又有点改动太大
liuyuboaijava 2010-05-28
  • 打赏
  • 举报
回复
恩,我也遇到这个问题了,郁闷
zoutuo 2009-10-30
  • 打赏
  • 举报
回复
应该是:走了控制器后,就不能获取文件的大小了。如果直接写在HTML页面上一点问题都没有。
我这里测试过了,用IE6什么问题都没有,IE7的问题是,首先是无法加载为“complete”,其次即使加载为“complete”,也不能每次都正确获取图片文件大小。有可能这次获取的大小是上一次的图片大小。真是一个很郁闷的问题!!!!!
happy664618843 2009-10-29
  • 打赏
  • 举报
回复

function loadImage(url, callback) {
var img = new Image(); //创建一个Image对象,实现图片的预下载
img.src = url;

if (img.complete) { // 如果图片已经存在于浏览器缓存,直接调用回调函数
callback.call(img);
return; // 直接返回,不用再处理onload事件
}

img.onload = function () { //图片下载完毕时异步调用callback函数。
callback.call(img);//将回调函数的this替换为Image对象
};
};


function checkimage(ImgObj,srcId,fileId)
{
//alert(fileId);
if(ImgObj.readyState!="complete") //如果图像是未加载完成进行循环检测
{
setTimeout("checkimage(ImgObj,"+srcId+",fileId)",500);
return false;
}

var ImgFileSize=Math.round(ImgObj.fileSize/1024);
if (ImgFileSize<=10 || ImgFileSize>=1024)
{
alert("您上传的图片必须大于10K小于1024K.");
$("img"+srcId).src = "../../img pic.jpg";
var tt=$("FileUpload"+srcId);
tt.outerHTML="<input type='file' name=FileUpload"+srcId+" id=FileUpload"+srcId+" onpropertychange=createimg(this,"+srcId+") />";
return false;
}
else
{
$("img"+srcId).src=ImgObj.src;
}
}
function createimg(fileId,srcId)
{
ImgObj=new Image(); //建立一个图像对象
var imagefile=fileId;
ImgObj.src=imagefile.value;
checkimage(ImgObj,srcId,fileId);
}
hitlcyu19 2009-10-29
  • 打赏
  • 举报
回复
你看看他加载完毕之后的的结果是啥啊 loaded?
zoutuo 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sohighthesky 的回复:]
以下代码,IE tester v.0.4 for IE7下测试通过
HTML code<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><metahttp-equiv="Content-Type" content="text/html; charset=gb2312"/><title>无标题文档</title></head><body><scripttype="text/javascript">var imgSize=1024*100;//最大100Kfunction checkImgSize(){var file= document.getElementById("fuPhoto");if(file.value!=""){//检测类型var val= file.value;if(/^.*?\.(gif|png|jpg|JPG|JPEG|jpeg|bmp)$/.test(val)){
}else{
alert("只能上传gif, png, jpg, bmp格式的图片");// return false; }var img=new Image();
img.onreadystatechange=function(){if(img.readyState=="complete"){if(img.fileSize<=0|| img.fileSize> imgSize){
alert("当前文件大小"+ img.fileSize/1024+"KB, 超出最大限制"+ imgSize/1024+"KB");
}else{
alert("OK");returntrue;
}
}
}

img.src= val;
}else{
alert("请选择上传的文件!");returnfalse;
}
}</script><inputtype="file" id="fuPhoto"/><inputtype="submit" value="上传" onclick="return checkImgSize()"/></body></html>
[/Quote]
你好,你给的方法在静态HTML页面可以,但是放在JSP里就不行了。我刚才试了好久。无法执行img.onreadystatechange = function()方法。在这个方法后面加“()”就提示我“尚未实现”,还有什么好的解决办法吗?
sohighthesky 2009-10-29
  • 打赏
  • 举报
回复
以下代码,IE tester v.0.4 for IE7下测试通过

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档 </title>
</head>

<body>
<script type="text/javascript">
var imgSize = 1024 * 100; //最大100K
function checkImgSize(){
var file = document.getElementById("fuPhoto");
if(file.value != ""){

//检测类型
var val = file.value;
if(/^.*?\.(gif|png|jpg|JPG|JPEG|jpeg|bmp)$/.test(val)){
}else{
alert("只能上传gif, png, jpg, bmp格式的图片");
// return false;
}

var img = new Image();
img.onreadystatechange = function(){
if(img.readyState == "complete"){
if(img.fileSize <=0 || img.fileSize > imgSize){
alert("当前文件大小" + img.fileSize / 1024 + "KB, 超出最大限制 " + imgSize / 1024 + "KB");
}else{
alert("OK");
return true;
}
}
}

img.src = val;
}else{
alert("请选择上传的文件!");
return false;
}
}
</script>
<input type="file" id="fuPhoto" />
<input type="submit" value="上传" onclick="return checkImgSize()" />
</body>
</html>
JavaAlpha 2009-10-29
  • 打赏
  • 举报
回复
zoutuo 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hitlcyu19 的回复:]
你看看他加载完毕之后的的结果是啥啊 loaded?
[/Quote]
加载后的结果是 complete
zoutuo 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hitlcyu19 的回复:]
你看看他加载完毕之后的的结果是啥啊 loaded?
[/Quote]
呵呵,我用的就是你这个例子,不行的。IE7你测试了吗?根本就不行。

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧