两种信息提示方式的对比:
在2009年12月13日,我写了篇博文《无干扰模式的信息提示》,其中有文件 mfMessage.js,今天对它进行了一些小的改进,在这里将它贴出来。
以下是mfMessage.js的源代码,你可以复制到自己的网页应用中,不用作任何修改它就会工作得很好。如果你将它改进得更好,也请慷慨地与我(admin@myfootprints.cn)分享。谢谢!
//
// mfMessage 对象
//
function mfMessage(sMessageWindowId) {
this.message = '';
if (sMessageWindowId) {
this.messageWindowId = sMessageWindowId;
} else {
this.messageWindowId = 'mfMessageWindow';
}
this._init_ = false;
// 通知window对象,在HTML文档加载完成后告诉我(mfMessage对象)一声
if (!window.document.body) {
this.addEventHandler(window, 'load', function() {
window.isReady = true;
});
} else {
window.isReady = true;
}
}
//
// 初始化工作
// 注意:此过程应该在HTML文档加载完成后再调用
//
mfMessage.prototype.init = function() {
if (this._init_) { return; }
if (!window.isReady) { return; }
var sMessageWindowId = this.messageWindowId;
function hideMessage() {
var oWin = document.getElementById(sMessageWindowId);
oWin.style.display = 'none';
}
// 如果发现有未销毁的mfMessage对象留下的信息窗口,则删掉它先
var oOldWin = document.getElementById(sMessageWindowId);
if (oOldWin != null) {
oOldWin.parentNode.removeChild(oOldWin);
}
var oDocFragment = document.createDocumentFragment();
var oWin = document.createElement('div');
oWin.setAttribute('id', this.messageWindowId);
oWin.style.display = 'none';
// 其他CSS属性
oWin.style.position = 'fixed';
oWin.style.left = '0';
oWin.style.top = '0';
oWin.style.width = '100%';
oWin.style.zIndex = '1001';
oWin.style.textAlign = 'center';
oDocFragment.appendChild(oWin);
// 将文档碎片加入到页面的body中
try {
var oBody = document.body;
oBody.insertBefore(oDocFragment, oBody.firstChild);
} catch (oError) {
// 如果在这里碰到了错误,一般是由于HTML文档未加载完成,所以造成 document.body 对象是 null
// 应该等到文档加载完成后再来做此操作
// this.addEventHandler(window, 'load', function() {
// var oBody = document.body;
// oBody.insertBefore(oDocFragment, oBody.firstChild);
// });
}
this.addEventHandler(oWin, 'click', hideMessage);
this._init_ = true;
};
//
// 显示信息
// 注意:此过程应该在HTML文档加载完成后再调用
//
mfMessage.prototype.showMessage = function(vMsg, bNonIntrusive, lDelay) {
if (vMsg.length <= 0) { return; }
if (window.isReady) {
if (!this._init_) {
this.init();
}
var sMessageWindowId = this.messageWindowId;
function hideMessage() {
var oWin = document.getElementById(sMessageWindowId);
oWin.style.display = 'none';
}
var oWin = document.getElementById(this.messageWindowId);
try {
oWin.removeChild(oWin.firstChild);
} catch (oError) {
}
var oMessage;
if (vMsg.constructor == window.Array && vMsg.length > 1) {
oMessage = document.createElement('ul');
for (var i = 0; i < vMsg.length; i++) {
var oMessageLI = document.createElement('li');
var oMessageText = document.createTextNode(vMsg[i]);
oMessage.appendChild(oMessageLI);
oMessageLI.appendChild(oMessageText);
}
} else {
oMessage = document.createTextNode(vMsg);
}
var oMessageWrapper = document.createElement('div');
// 设置 oMessageWrapper 的CSS属性
oMessageWrapper.style.padding = '5px';
oMessageWrapper.style.color = 'black';
oMessageWrapper.style.fontWeight = 'bold';
oMessageWrapper.style.backgroundColor = '#FFF1A8';
oMessageWrapper.style.cursor = 'pointer';
oMessageWrapper.style.display = 'inline-block';
oMessageWrapper.style.width = 'auto';
oMessageWrapper.style.height = 'auto';
oMessageWrapper.style.textAlign = 'left';
oMessageWrapper.style.fontSize = '16px';
oMessageWrapper.appendChild(oMessage);
oWin.appendChild(oMessageWrapper);
oWin.style.display = 'block';
if (bNonIntrusive) {
// 无干扰模式,启动计时器
var lD;
if (lDelay) {
lD = lDelay;
} else {
lD = 2000;
}
window.setTimeout(hideMessage, lD);
}
} else {
}
};
//
// 显示信息,参数为HTML代码
// 注意:此过程应该在HTML文档加载完成后再调用
//
mfMessage.prototype.showHTMLMessage = function(sMsg, bNonIntrusive, lDelay) {
if (sMsg.length <= 0) { return; }
if (window.isReady) {
if (!this._init_) {
this.init();
}
var sMessageWindowId = this.messageWindowId;
function hideMessage() {
var oWin = document.getElementById(sMessageWindowId);
oWin.style.display = 'none';
}
var oWin = document.getElementById(this.messageWindowId);
try {
oWin.removeChild(oWin.firstChild);
} catch (oError) {
}
var oMessageWrapper = document.createElement('div');
// 设置 oMessageWrapper 的CSS属性
oMessageWrapper.style.padding = '5px';
oMessageWrapper.style.color = 'black';
oMessageWrapper.style.fontWeight = 'bold';
oMessageWrapper.style.backgroundColor = '#FFF1A8';
oMessageWrapper.style.cursor = 'pointer';
oMessageWrapper.style.display = 'inline-block';
oMessageWrapper.style.width = 'auto';
oMessageWrapper.style.height = 'auto';
oMessageWrapper.style.textAlign = 'left';
oMessageWrapper.style.fontSize = '16px';
oMessageWrapper.innerHTML = sMsg;
oWin.appendChild(oMessageWrapper);
oWin.style.display = 'block';
if (bNonIntrusive) {
// 无干扰模式,启动计时器
var lD;
if (lDelay) {
lD = lDelay;
} else {
lD = 2000;
}
window.setTimeout(hideMessage, lD);
}
} else {
}
};
// 获取浏览器客户窗口的左端位置
mfMessage.prototype.getClientLeft = function() {
return typeof self.pageXOffset != 'undefined' ? self.pageXOffset : document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ? document.body.scrollLeft : 0;
};
// 获取浏览器客户窗口的顶端位置
mfMessage.prototype.getClientTop = function() {
return typeof self.pageYOffset != 'undefined' ? self.pageYOffset : document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ? document.body.scrollTop : 0;
};
// 获取浏览器客户端窗口的宽度
mfMessage.prototype.getClientWidth = function() {
return self.innerWidth ? self.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body ? document.body.clientWidth : 0;
};
// 获取浏览器客户端窗口的高度
mfMessage.prototype.getClientHeight = function() {
return self.innerHeight ? self.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body ? document.body.clientHeight : 0;
};
// 添加事件监听
mfMessage.prototype.addEventHandler = function(oTarget, sEventType, fnHandler, vArgument /* optional */) {
//# 生成handler函数
var handler;
if (typeof (vArgument) == 'undefined') {
handler = fnHandler;
} else {
handler = function() {
fnHandler(vArgument);
};
}
if (oTarget.addEventListener) { // for DOM-compliant browsers
oTarget.addEventListener(sEventType, handler, false);
} else if (oTarget.attachEvent) { // for IE
oTarget.attachEvent("on" + sEventType, handler);
} else { // for all others
oTarget["on" + sEventType] = handler;
}
};
// 移除事件监听
mfMessage.prototype.removeEventHandler = function(oTarget, sEventType, fnHandler) {
if (oTarget.removeEventListener) { // for DOM-compliant browsers
oTarget.removeEventListener(sEventType, fnHandler, false);
} else if (oTarget.detachEvent) { // for IE
oTarget.detachEvent("on" + sEventType, fnHandler);
} else { // for all others
oTarget["on" + sEventType] = null;
}
};
// 格式化事件对象
mfMessage.prototype.formatEvent = function(oEvent) {
var sUserAgent = navigator.userAgent;
var isOpera = sUserAgent.indexOf("Opera") > -1;
var isIE = sUserAgent.indexOf("compatible") > -1
&& sUserAgent.indexOf("MSIE") > -1
&& !isOpera;
var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
// 检测是否为Google公司开发的Chrome浏览器 - jie.tian@myfootprints.cn, 2009-11-13
var isChrome = sUserAgent.indexOf('Chrome') > -1;
// - jie.tian@myfootprints.cn
if ((isIE && isWin) || (isChrome)) {
// 下面这句程序对Chrome浏览器无效。你调用时请用 oEvent.keyCode,否则在Chrome浏览器可能总是出现 oEvent.charCode = 0 的现象,让你的程序失常 - jie.tian@myfootprints.cn, 2009-11-13
oEvent.charCode = (oEvent.type == "keypress" || oEvent.type == 'keyup' || oEvent.type == 'keydown') ? oEvent.keyCode : 0;
oEvent.eventPhase = 2;
oEvent.isChar = (oEvent.charcode > 0);
oEvent.pageX = oEvent.clientX + document.body.scrollLeft;
oEvent.pageY = oEvent.clientY + document.body.scrollTop;
oEvent.preventDefault = function() {
this.returnValue = false;
};
if (oEvent.type == "mouseout") {
oEvent.relatedTarget = oEvent.toElement;
} else if (oEvent.type == "mouseover") {
oEvent.relatedTarget = oEvent.fromElement;
}
oEvent.stopPropagation = function() {
this.cancelBubble = true;
};
oEvent.target = oEvent.srcElement;
oEvent.time = (new Date()).getTime();
} else {
// 由于对于Chrome浏览器,event对象的charCode属性不可写,所以,不如统一成keyCode - jie.tian@myfootprints.cn, 2009-11-13
oEvent.keyCode = (oEvent.type == "keypress" || oEvent.type == 'keyup' || oEvent.type == 'keydown') ? oEvent.charCode : 0;
}
return oEvent;
};
mfMessage.prototype.getEvent = function() {
if (window.event) {
return this.formatEvent(window.event);
} else {
return EventUtil.getEvent.caller.arguments[0];
}
};
mfMessage.prototype.focusOnFirstFormElement = function() {
if (document.forms.length > 0) {
for (var i = 0; i < document.forms[0].elements.length; i++) {
var oField = document.forms[0].elements[i];
// 如果表单的某个元素是隐藏字段,这个字段是不支持focus()方法的。
// 另外在载入很慢的页面中,在页面完全载入完之前用户可能就开始进行输入了。这时如果再把焦点设置到第一个字段上,就会中断用户当前的输入。为处理这个问题,应该先检查是在第一个字段中已经有值。
// 如果有,则不改变焦点
if (oField.type != "hidden") {
try {
if (oField.value == '') {
oField.focus();
}
return;
} catch (e) {
// do nothing
}
}
}
}
};
mfMessage.prototype.showCookie = function() {
var s;
s = 'Cookie长度: ' + document.cookie.length + '
';
s += '- ' + document.cookie + '
';
s += '';
this.showHTMLMessage(s);
};
// 获取Cookie值
mfMessage.prototype.getCookieValue = function (sCookieName) {
var sSearch = sCookieName + '=';
var sReturn = '';
if (document.cookie.length > 0) {
var lOffset = document.cookie.indexOf(sSearch);
var lEnd;
if (lOffset != -1) {
lOffset += sSearch.length;
lEnd = document.cookie.indexOf(';', lOffset);
if (lEnd == -1) {
length = document.cookie.length;
}
sReturn = unescape(document.cookie.substring(lOffset, lEnd));
} else {
sReturn = '';
}
} else {
sReturn = '';
}
return sReturn;
};