问答详情
源自:1-2 BUG解决IE下致命错误

IE 8-10 图片加载不出来

为什吗我的IE10——IE8图片都加载不出来,只有转圈圈的背景图?

提问者:Sweet_Gao 2016-04-27 18:03

个回答

  • Ateem
    2016-05-09 21:11:29
    已采纳

    (-。-;)额这个怎么调试?一大堆看着犯晕。。。代码看过去好像没啥问题,readystate中”S“应该大写,不过应该不是这个问题,你看一下报错信息,自己调试一下,如果没有报错信息,可能跟图片的先后加载浏览器的渲染有关,解决了望告知下,菜鸟能力有限没帮上忙,不好意思啦,哦,还有提个小建议:把自己这些代码放在github或者codepen这类代码托管上,方便大家帮忙调试吧

  • 一只帅蚂蚁
    2016-05-10 18:34:33

    对认真学习,认真做笔记的同学点赞,即使看视频的时候,看不懂,也希望硬着头皮看下去,一遍一遍其意自现!!

  • Sweet_Gao
    2016-05-09 09:53:48

    /*
    	2016-4-27  gaot
    
    	renderDom(): 渲染剩余的DOM(弹出层里面的内容),并且插入到BODY
    
    	getGroup(): 根据当前组名获取同一组数据
    
    	init(currentObject): 初始化弹出:获取当前点击对象currentObj的data-source、data-id,调用showMaskAndPop()显示遮罩层和弹出层
    	
    	showMaskAndPop(sourceSrc, currentId):显示遮罩层和弹出层:根据当前元素的id和src加载图片、显示图片描述、设置左右切换按钮是否disabled
    	
    	getIndexOf(currentId):根据当前点击的元素ID获取在当前组别里面的索引
    	
    	loadPicSize(sourceSrc):加载图片: 调用preLoadImg(src, callback)、changePic(picWidth, picHeight)
    	preLoadImg(src, callback):预加载图片,设置src
    	changePic(picWidth, picHeight):根据图片宽高和视口比例设置弹出层尺寸并过渡动画、获取图片描述内容
    	
    	goto(dir):左右切换上一张或下一张。dir可为"next"或"prev"
    
    */
    
    
    ;(function(){
    	var LightBox = function(settings){
    		var _this_ = this;	// this指的是LightBox
    
    		//默认配置参数
    		this.settings = {
    			speed: 500
    		};
    		$.extend(this.settings, settings||{});
    
    		//创建遮罩和弹出框
    		this.popMask = $('<div id="G-lightbox-mask">');
    		this.popWin = $('<div id="G-lightbox-pop">');
    
    		//保存BODY
    		this.bodyNode = $(document.body);
    
    		//渲染剩余的DOM,并且插入到BODY
    		this.renderDom();
    
    		this.picViewArea = this.popWin.find("div.lightbox-pic-view"); // 图片预览区域
    		this.popPic = this.popWin.find("img.lightbox-img"); // 图片
    		this.picCaptionArea = this.popWin.find("div.lightbox-pic-caption"); // 图片描述区域
    		this.nextBtn = this.popWin.find("span.lightbox-next-btn"); // "下一张"按钮
    		this.prevBtn = this.popWin.find("span.lightbox-prev-btn"); // "上一张"按钮
    
    		this.captionText = this.popWin.find("p.lightbox-pic-desc"); // 图片描述
    		this.currentIndex = this.popWin.find("span.lightbox-of-index"); // 图片索引
    		this.closeBtn = this.popWin.find("span.lightbox-close-btn"); // 关闭按钮
    
    		//准备开发事件委托,获取组数据
    		this.groupName = null; //组名
    		this.groupData = []; //防止同一组数据
    		this.bodyNode.delegate(".js-lightbox,*[data-role=lightbox]","click",function(e){
    			//阻止事件冒泡
    			e.stopPropagation();
    
    			var currentGroupname = $(this).attr("data-group");
    			if (currentGroupname != _this_.groupName) {
    				_this_.groupName = currentGroupname;
    
    				//根据当前组名获取同一组数据
    				_this_.getGroup();
    			}
    
    			//初始化弹出
    			_this_.initPop($(this));
    		});
    
    		//关闭弹出
    		this.popMask.click(function(){
    			$(this).fadeOut();
    			_this_.popWin.fadeOut();
    			_this_.clear = false; //关闭弹出,则清掉窗口调整事件
    		});
    		this.closeBtn.click(function(){
    			_this_.popMask.fadeOut();
    			_this_.popWin.fadeOut();
    			_this_.clear = false; //关闭弹出,则清掉窗口调整事件
    		});
    
    		//绑定上下切换按钮事件
    		this.flag = true; // 切换标识,用来表示一次切换是否完成,防止多次快速点击出错
    
    		this.nextBtn.hover(function(){
    			if (!$(this).hasClass("disabled") && _this_.groupData.length>1) {
    				$(this).addClass("lightbox-next-btn-show");
    			}
    		}, function(){
    			if (!$(this).hasClass("disabled") && _this_.groupData.length>1) {
    				$(this).removeClass("lightbox-next-btn-show");
    			}
    		}).click(function(e){
    			if (!$(this).hasClass("disabled") && _this_.flag) {
    				_this_.flag = false; // 一次切换动画过程中,flag设为false
    				e.stopPropagation();
    				_this_.goto("next"); // nextBtn: 切换到下一张
    			}
    		});
    
    		this.prevBtn.hover(function(){
    			if (!$(this).hasClass("disabled") && _this_.groupData.length>1) {
    				$(this).addClass("lightbox-prev-btn-show");
    			}
    		}, function(){
    			if (!$(this).hasClass("disabled") && _this_.groupData.length>1) {
    				$(this).removeClass("lightbox-prev-btn-show");
    			}
    		}).click(function(e){
    			if (!$(this).hasClass("disabled") && _this_.flag) {
    				_this_.flag = false; // 一次切换动画过程中,flag设为false
    				e.stopPropagation();
    				_this_.goto("prev"); // prevBtn: 切换到上一张
    			}
    		});
    
    		//判断是不是IE6
    		//this.isIE6 = /MSIE 6.0/gi.test(window.navigator.userAgent);
    
    		//绑定窗口调整事件
    		var timer = null;
    		this.clear = false; // 窗口调整事件标识,用来表示是否监听窗口调整事件。false表示不监听
    
    		$(window).resize(function(){
    			if (_this_.clear) {
    				window.clearTimeout(timer);
    				timer = window.setTimeout(function(){
    					_this_.loadPicSize(_this_.groupData[_this_.index].src);
    				}, 500);
    
    				if (_this_.isIE6) {
    					_this_.popMask.css({
    						width: $(window).width(),
    						height: $(window).height()
    					});
    				}
    			}
    			
    		}).keyup(function(e){
    			var keyValue = e.which;
    			if (_this_.clear) {
    				if (keyValue==37 || keyValue==38) {	//37:←方向键,38:↑方向键
    					_this_.prevBtn.click();
    				}else if (keyValue==39 || keyValue==40) { //39:→方向键,40:↓方向键
    					_this_.nextBtn.click();
    				}
    			}
    		});
    
    	};
    
    
    	LightBox.prototype = {
    		//渲染剩余的DOM,并且插入到BODY
    		renderDom: function(){
    			var strDom = '<div class="lightbox-pic-view">'
    					   +	'<span class="lightbox-btn lightbox-prev-btn"></span>'
    					   +	'<img class="lightbox-img" src="img/2-2.jpg">'
    					   +	'<span class="lightbox-btn lightbox-next-btn"></span>'
    					   + '</div>'
    					   + '<div class="lightbox-pic-caption">'
    					   +	 '<div class="lightbox-caption-area">'
    					   +		 '<p class="lightbox-pic-desc">标题</p>'
    					   +		 '<span class="lightbox-of-index">当前索引:0 of 0</span>'
    					   +	 '</div>'
    					   +	 '<span class="lightbox-close-btn"></span>'
    					   + '</div>';
    			
    			//插入到this.popWin
    			this.popWin.html(strDom);
    
    			//把遮罩和弹出框插入到BODY
    			this.bodyNode.append(this.popMask);
    			this.bodyNode.append(this.popWin);
    		},
    
    
    		//获取同一组数据
    		getGroup: function(){
    			var _this_ = this;	// this指的是LightBox
    
    			//根据当前组别名称获取页面中所有相同组别的对象
    			var groupList = this.bodyNode.find("*[data-group="+this.groupName+"]");
    			
    			//清空数组数据
    			_this_.groupData.length = 0;
    
    			groupList.each(function(){
    				_this_.groupData.push({
    					src: $(this).attr("data-source"), // this指的是当前遍历的data-group=_this_.groupName的元素
    					id: $(this).attr("data-id"),
    					caption: $(this).attr("data-caption")
    				});
    
    			});
    
    			//console.log(_this_.groupData);
    		},
    
    
    		//初始化弹出
    		initPop: function(currentObj){
    			var _this_ = this;	// this指的是LightBox
    
    			var sourceSrc = currentObj.attr("data-source"),
    				currentId = currentObj.attr("data-id");
    
    			//console.log(sourceSrc+"  "+currentId);
    
    			//显示遮罩层和弹框
    			this.showMaskAndPop(sourceSrc, currentId);
    		},
    
    
    		//点击图片显示遮罩层和弹框
    		showMaskAndPop: function(sourceSrc, currentId){
    			var _this_ = this;	// this指的是LightBox
    
    			//图片和图片描述区域影藏
    			this.popPic.hide();
    			this.picCaptionArea.hide();
    
    			var winWidth = $(window).width(), // 当前视口宽度、高度
    				winHeight = $(window).height();
    
    			//图片预览区域宽、高
    			this.picViewArea.css({  
    				width: winWidth/2,
    				height: winHeight/2
    			});
    
    
    			//遮罩层淡出
    			this.popMask.fadeIn(); 
    
    			//弹框淡出
    			this.popWin.fadeIn();
    
    			var viewHeight = winHeight/2+10;
    
    			//弹框宽、高和位置
    			this.popWin.css({
    				width: winWidth/2+10,	//.lightbox-pic-view的border-width为5px
    				height: winHeight/2+10,
    				marginLeft: -(winWidth/2+10)/2,
    				top: -viewHeight
    			
    			}).animate({
    				top: (winHeight-viewHeight)/2
    			}, _this_.settings.speed, function(){
    				//加载图片
    				_this_.loadPicSize(sourceSrc);
    			});
    
    			//根据当前点击的元素ID获取在当前组别里面的索引
    			this.index = this.getIndexOf(currentId);
    
    			var groupDataLength = this.groupData.length;
    			if (groupDataLength > 1) {	// 如果一个组里的图片不止一张
    				if (this.index === 0) { // 点击的是第一张
    					this.prevBtn.addClass("disabled");
    					this.nextBtn.removeClass("disabled");
    				} else if (this.index === groupDataLength-1) { // 点击的是最后一张
    					this.prevBtn.removeClass("disabled");
    					this.nextBtn.addClass("disabled");
    				} else {
    					this.prevBtn.removeClass("disabled");
    					this.nextBtn.removeClass("disabled");
    				}
    			}else {
    				this.prevBtn.addClass("disabled");
    				this.nextBtn.addClass("disabled");
    			}
    		},
    		
    
    		//根据当前点击的元素ID获取在当前组别里面的索引
    		getIndexOf: function(currentId){
    			var index = 0;
    
    			$(this.groupData).each(function(i){
    				index = i;
    				if (this.id === currentId) {
    					return false; 	// 相当于break
    				}
    			});
    
    			return index;
    		},
    
    
    		//加载图片
    		loadPicSize: function(sourceSrc){
    			var _this_ = this;
    
    			//每次加载之前先把上一次打开的图片的宽高清除掉,保证下一次加载的宽高是新打开的图片的宽高
    			this.popPic.css({width: "auto", height: "auto"}).hide();
    
    			this.picCaptionArea.hide();
    
    			// 预加载图片,设置scr
    			this.preLoadImg(sourceSrc, function(){
    				_this_.popPic.attr("src", sourceSrc);
    
    				var picWidth = _this_.popPic.width(),
    					picHeight = _this_.popPic.height();
    
    				// 根据图片宽高和视口比例设置弹出层尺寸并过渡动画、获取图片描述内容
    				_this_.changePic(picWidth, picHeight);
    
    			});
    		},
    
    
    		// 预加载图片,设置scr
    		preLoadImg: function(src, callback){
    			var img = new Image();
    			if (!!window.ActiveXObject) {
    				img.onreadystatechange = function(){
    					if (this.readystate == "complete") {
    						callback();
    					}
    				};
    			}else{
    				img.onload = function(){
    					callback();
    				};
    			}
    
    			img.src = src;
    
    			//console.log(img.src);
    		},
    
    
    		// 根据图片宽高和视口比例设置弹出层尺寸并过渡动画、获取图片描述内容
    		changePic: function(width, height){
    			var _this_ = this;
    
    			var winWidth = $(window).width(),
    				winHeight = $(window).height();
    
    			//如果图片的宽高大于浏览器视口的宽高比例,就看下是否溢出
    			var scale = Math.min(winWidth/(width+10), winHeight/(height+10), 1);
    
    			width = width*scale;
    			height = height*scale;
    
    			this.picViewArea.animate({
    				width: width-10,
    				height: height-10
    			}, _this_.settings.speed);
    
    			//弹窗动画:宽、高、位置
    			var top = (winHeight-height)/2;
    
    			if (this.isIE6) {
    				top += $(window).scrollTop();
    			}
    
    			this.popWin.animate({
    				width: width,
    				height: height,
    				marginLeft: -(width/2),
    				top: top
    			
    			}, _this_.settings.speed, function(){
    				_this_.popPic.css({
    					width: width-10,
    					height: height-10
    				}).fadeIn();
    
    				_this_.picCaptionArea.fadeIn();
    				_this_.flag = true; // 一次切换动画结束,flag设为true
    				_this_.clear = true; // clear为true:弹框出现时,加上窗口调整事件
    			});
    
    			//设置描述文字和当前索引
    			this.captionText.text(this.groupData[this.index].caption);
    			this.currentIndex.text("当前索引:" + (this.index+1) + " of " + this.groupData.length);
    		
    			//console.log(this.currentIndex.text());
    		},
    
    		//左右切换上一张或下一张
    		goto: function(dir){
    			if (dir === "next") { // 下一张:nextBtn
    				this.index++;
    				if (this.index >= this.groupData.length-1) { //如果是最后一张,影藏掉"下一张"按钮,设为不能点击
    					this.nextBtn.addClass("disabled").removeClass("lightbox-next-btn-show");
    				}
    				if (this.index !=0) { //如果不是第一张,"上一张"按钮去掉影藏样式
    					this.prevBtn.removeClass("disabled");
    				}
    
    				var src = this.groupData[this.index].src;
    				this.loadPicSize(src);
    
    			} else if (dir === "prev") { // 上一张:prevBtn
    				this.index--;
    				if (this.index <=0 ) { //如果是第一张,影藏掉"上一张"按钮,设为不能点击
    					this.prevBtn.addClass("disabled").removeClass("lightbox-prev-btn-show");
    				}
    				if (this.index != this.groupData.length-1) { //如果不是最后一张,"下一张"按钮去掉影藏样式
    					this.nextBtn.removeClass("disabled");
    				}
    
    				var src = this.groupData[this.index].src;
    				this.loadPicSize(src);
    			}
    		}
    
    
    	};
    
    	window["LightBox"] = LightBox;
    })();


  • Sweet_Gao
    2016-05-09 09:53:07

    <!doctype html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title>LightBox插件开发</title>
    
    	<link rel="stylesheet" type="text/css" href="css/lightbox.css">
    </head>
    
    <body>
    	 
    		class="js-lightbox":表示这个元素要启用lightbox<br>
    		data-role="lightbox":表示这个元素要启用lightbox<br>
    		data-source="img/1-1.jpg":原图的地址<br>
    		data-group="group-1":标识当前是否属于一个组别<br>
    		data-id="kggnnnmmm":图片的唯一标识<br>
    		data-caption="kgg111": 当前图片的描述文字<br><br>
    	
    
    	<h1>1组图片</h1>
    	<div>
    		<img class="js-lightbox" data-role="lightbox" data-source="img/1-1.jpg" src="img/1-1.jpg" 
    			 data-group="group-1" data-id="1.1" data-caption="group1:1" width="100" height="100">
    		<img class="js-lightbox" data-role="lightbox" data-source="img/1-2.jpg" src="img/1-2.jpg"
    			 data-group="group-1" data-id="1.2" data-caption="group1:2" width="100" height="100">
    		<img class="js-lightbox" data-role="lightbox" data-source="img/1-3.jpg" src="img/1-3.jpg"
    			 data-group="group-1" data-id="1.3" data-caption="group1:3" width="100" height="100">
    	</div>
    
    	<h1>2组图片</h1>
    	<div>
    		<img class="js-lightbox" data-role="lightbox" data-source="img/2-1.jpg" src="img/2-1.jpg"
    			 data-group="group-2" data-id="kggnnn2-1" data-caption="group2:1" width="100" height="100">
    	</div>
    
    
    
    	<!-- 遮罩层 -->
    	<!-- <div id="G-lightbox-mask"></div> -->
    	<!-- 弹出层 -->
    	<!-- <div id="G-lightbox-pop">
    		<div class="lightbox-pic-view">
    			<span class="lightbox-btn lightbox-prev-btn lightbox-prev-btn-show"></span>
    			<img class="lightbox-img" src="img/2-2.jpg" width="100%">
    			<span class="lightbox-btn lightbox-next-btn lightbox-next-btn-show"></span>
    		</div>
    		<div class="lightbox-pic-caption">
    			<div class="lightbox-caption-area">
    				<p class="lightbox-pic-desc">图片标题</p>
    				<span class="lightbox-of-index">当前索引:1 of 4</span>
    			</div>
    			<span class="lightbox-close-btn"></span>
    		</div>
    	</div> -->
    
    	<!-- 引入js文件 -->
    	<script type="text/javascript" src="js/jquery.js"></script>
    	<script type="text/javascript" src="js/lightbox.js"></script>
    	
    	<script type="text/javascript">
    		$(function(){
    			var lightbox = new LightBox({
    				speed: 600,
    				maxWidth: 900,
    				maxHeight: 600,
    				maskOpacity: 0.4
    			});
    		});
    	</script>
    
    </body>
    </html>


  • Ateem
    2016-05-07 13:43:03

    没遇到这个,只是在写的时候遇到在chrome下没有等图片加载完,就把结构定好了,然后图片再渲染上去的时候布局出错,这个可能跟chrome的渲染机制有关,最后加了$(window).on("load",function(){})就没事了,虽然答非所问,不过你可以放你具体代码出来,给你debug下。