前段时间有个朋友说弹出框关闭的时候在ie7上是关闭弹出来,在ie9上是关闭整个页面,于是进行测试分析发现是jquery.messager.js的问题
于是我进行的测试...在jquery.messager.js中关闭弹出框调用的方法是this.close
于是我自己写了个html测试
<html>
<script>
function a(){
this.close();
}
this.close=function(){
alert(1);
}
</script>
<body><input type="button" value="测试" onclick="a();"></body>
</html>
结果在ie7上是弹出了alert,但在ie9上却是关闭窗口。于是这印证了一件事....ie7是先查询js脚本...看看有没有叫this.close的方法再执行,ie9是先看看浏览器内置的方法里面有没有close方法想当于调用了window.close()
所以ie7之前可以自己写和浏览器内置方法同名的方法,去覆盖此方法,强制想调用浏览器方法必须用window.方法名
但ie9却不能,只要出现和浏览器内置方法同名的方法...就直接走浏览器内置方法,我们自定义的方法是不会执行的。所以编程的时候要注意
因此jquery.messager.js会造成这种错误主要就是方法名...于是我对使用this和浏览器冲突的地方进行了修改
修改后在本机项目测试...已经没问题,可以直接替代原本的jquery.messager.js而且不会出现兼容性错误
修改后代码如下
( function() {
var ua = navigator.userAgent.toLowerCase();
var is = (ua.match(/\b(chrome|opera|safari|msie|firefox)\b/) || [ '',
'mozilla' ])[1];
var r = '(?:' + is + '|version)[\\/: ]([\\d.]+)';
var v = (ua.match(new RegExp(r)) || [])[1];
//jQuery.browser.is = is;
//jQuery.browser.ver = v;
//jQuery.browser[is] = true;
})();
//信息变量
var messagerjs={};
( function(jQuery) {
/*
*
* jQuery Plugin - Messager
*
* Author: corrie Mail: [email protected] Homepage: www.corrie.net.cn
*
* Copyright (c) 2008 corrie.net.cn
*
* @license http://www.gnu.org/licenses/gpl.html [GNU General Public
* License]
*
*
*
* $Date: 2008-12-26
*
* $Vesion: 1.5 @ how to use and example: Please Open index.html
*
*/
this.version = '@1.5';
this.layer = {
'width' :200,
'height' :100
};
this.title = '信息提示';
this.time = 4000;
this.anims = {
'type' :'slide',
'speed' :400
};
//不使用this,用animss代替anims
var animss= {
'type' :'slide',
'speed' :400
};
this.timer1 = null;
this.inits = function(title, text) {
if ($("#message").is("div")) {
return;
}
$(document.body)
.prepend(
'<div id="message" style="border:#b9c9ef 1px solid;z-index:100;width:'
+ this.layer.width
+ 'px;height:'
+ this.layer.height
+ 'px;position:absolute; display:none;background:#cfdef4; bottom:0; right:0; overflow:hidden;"><div style="border:1px solid #fff;border-bottom:none;width:100%;height:25px;font-size:12px;overflow:hidden;color:#1f336b;"><span id="message_close" style="float:right;padding:5px 0 5px 0;width:16px;line-height:auto;color:red;font-size:12px;font-weight:bold;text-align:center;cursor:pointer;overflow:hidden;">×</span><div style="padding:5px 0 5px 5px;width:100px;line-height:18px;text-align:left;overflow:hidden;">'
+ title
+ '</div><div style="clear:both;"></div></div> <div style="padding-bottom:5px;border:1px solid #fff;border-top:none;width:100%;height:auto;font-size:12px;"><div id="message_content" style="margin:0 5px 0 5px;border:#b9c9ef 1px solid;padding:10px 0 10px 5px;font-size:12px;width:'
+ (this.layer.width - 17)
+ 'px;height:'
+ (this.layer.height - 50)
+ 'px;color:#1f336b;text-align:left;overflow:hidden;">'
+ text + '</div></div></div>');
$("#message_close").click( function() {
// setTimeout('this.close()',1);
setTimeout('messagerjs.close()', 1);
});
$("#message").hover( function() {
clearTimeout(timer1);
timer1 = null;
}, function() {
if (time > 0)
// timer1 = setTimeout('this.close()', time);
timer1 = setTimeout('messagerjs.close()', time);
});
$(window).scroll(
function() {
var bottomHeight = "-"+document.documentElement.scrollTop;
$("#message").css("bottom", bottomHeight + "px");
});
};
this.show = function(title, text, time) {
if ($("#message").is("div")) {
return;
}
if (title == 0 || !title)
title = this.title;
this.inits(title, text);
if (time >= 0)
this.time = time;
//赋给变量,不使用this
animss=this.anims;
switch (this.anims.type) {
case 'slide':
$("#message").slideDown(this.anims.speed);
break;
case 'fade':
$("#message").fadeIn(this.anims.speed);
break;
case 'show':
$("#message").show(this.anims.speed);
break;
default:
$("#message").slideDown(this.anims.speed);
break;
}
var bottomHeight = "-"+document.documentElement.scrollTop;
$("#message").css("bottom", bottomHeight + "px");
/**
if ($.browser.is == 'chrome') {
setTimeout( function() {
$("#message").remove();
this.inits(title, text);
$("#message").css("display", "block");
}, this.anims.speed - (this.anims.speed / 5));
}*/
this.rmmessage(this.time);
};
this.lays = function(width, height) {
if ($("#message").is("div")) {
return;
}
if (width != 0 && width)
this.layer.width = width;
if (height != 0 && height)
this.layer.height = height;
}
this.anim = function(type, speed) {
if ($("#message").is("div")) {
return;
}
if (type != 0 && type)
this.anims.type = type;
if (speed != 0 && speed) {
switch (speed) {
case 'slow':
;
break;
case 'fast':
this.anims.speed = 200;
break;
case 'normal':
this.anims.speed = 400;
break;
default:
this.anims.speed = speed;
}
}
}
this.rmmessage = function(time) {
if (time > 0) {
// timer1 = setTimeout('this.close()', time);
timer1 = setTimeout('messagerjs.close()', time);
}
};
//this.close=function(){
messagerjs.close = function() {
switch (animss.type) {
case 'slide':
$("#message").slideUp(animss.speed);
break;
case 'fade':
$("#message").fadeOut(animss.speed);
break;
case 'show':
$("#message").hide(animss.speed);
break;
default:
$("#message").slideUp(animss.speed);
break;
}
;
setTimeout('$("#message").remove();', this.anims.speed);
this.original();
}
this.original = function() {
this.layer = {
'width' :200,
'height' :100
};
this.title = '信息提示';
this.time = 4000;
this.anims = {
'type' :'slide',
'speed' :600
};
};
jQuery.messager = this;
return jQuery;
})(jQuery);