无干扰模式的信息提示

两种信息提示方式的对比:


在Web开发中,交互性地向用户作出一些提示,是一个不可缺少的开发需求。

最早的信息提示是使用警告对话框,如:

alert('信息提示。');

点击这里运行

这样的方式实现起来很简单,但有时会显得非常讨厌,因为你不得不对它进行回应。所以这种方式渐渐被抛弃,除非是向你询问“是否真的要删除它?”之类的信息时才会继续用它。

作为用户,在浏览网页希望得到一些提示,但除非是重要的提示,否则请不要让提示打扰到我。如果将信息放在一个安静的角落显示出来,停留一会儿后自行消失,那将是一个不错的解决方案。

如果你使用过Google文档或者Gmail,就会明白我说的无干扰信息模式的信息提示是什么意思。

本文后面所附的javascript代码正实现了以上需求,它的用法很简单,如下:

<script type="text/javascript" src="http://www.myfootprints.cn/jsLib/mfMessage.js"></script>
var oInfo = new mfMessage();
oInfo.showMessage('无干扰的信息提示。', true);

点击这里运行

以上代码中,var oInfo = new mfMessage(); 创建了一个信息显示对象,通过调用showMessage()方法即可在网页顶部显示指定的信息内容,而参数true,说明信息提示2秒钟后将自动消失。如果省略它,或者指定为false,那么,信息显示出来后,不会自行消失,而需要用户点击一下它才会消失(如果是重要的信息可以使用指定false,即使用户不点击信息,也不会对他/她造成干扰,因为它只占了一小块地方,而且是非模态的)。

如果你希望信息提示显示5秒钟(即5000毫秒)后再消失,可以指定显示时间为5秒,方法为:

<script type="text/javascript" src="http://www.myfootprints.cn/jsLib/mfMessage.js"></script>
var oInfo = new mfMessage();
oInfo.showMessage('无干扰的信息提示。', true, 5000);

点击这里运行

以下是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对象)一声
    this.addEventHandler(window, 'load', function() {
        window.isReady = true;
    });
}

mfMessage.prototype.init = function() {
    if (this._init_) { return; }
    // 只有在HTML文档加载完成后,本信息显示器才可以正常工作
    if(!window.isReady) {return;}
    var sMessageWindowId = this.messageWindowId;
    function hideMessage() {
        var oWin = document.getElementById(sMessageWindowId);
        oWin.style.display = 'none';
    }

    var oDocFragment = document.createDocumentFragment();
    var oWin = document.createElement('div');
    oWin.setAttribute('id', this.messageWindowId);
    oWin.style.display = 'none';
    // 其他CSS属性
    oWin.style.position = 'absolute';
    oWin.style.left = '0';
    oWin.style.top = '0';
    oWin.style.width = '100%';
    oWin.style.zIndex = '1001';
    oWin.style.textAlign = 'center';
    
    oDocFragment.appendChild(oWin);
    // 将文档碎片加入到页面的body中
    var oBody = document.getElementsByTagName('body')[0];
    oBody.insertBefore(oDocFragment, oBody.firstChild);
    this.addEventHandler(oWin, 'click', hideMessage);
    this._init_ = true;
};

mfMessage.prototype.showMessage = function(vMsg, bNonIntrusive, lDelay) {
    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);
    }
};

// 添加事件监听
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;
    }
};

Add comment

Loading