[实例] 浏览器标签栏滚动消息提示
需求: 在当前页面onblur(不是聚焦状态)时, 通过浏览器标签滚动文字来提示有新信息.
先给两个直接能在本地运行的版本, 主要代码是scrollTitle函数, 使用了不同方式进行了封装
第一个版本:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>OK Computer</title>
<script language="javascript">
var docTitle = function() {
var homeTitle = "OK Computer";
var isWinFocus = true;
var title = document.title;
var scrollTitle = function() {
document.title = title;
title = title.substring(1, title.length) + title.substring(0, 1);
if (!isWinFocus)
setTimeout("docTitle.scroll()", 100);
else {
document.title = homeTitle;
return true;
}
};
return {
scroll: function() {
scrollTitle();
},
init: function(newTitle) {
window.onblur = function() {
isWinFocus = false;
title = newTitle;
scrollTitle();
};
window.onfocus = function() {
isWinFocus = true;
document.title = homeTitle;
};
}
};
}();
</script>
</head>
<body onload="docTitle.init('...您有新的消息...')">
</body>
</html>
第二个版本:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>OK Computer</title>
<script language="javascript">
var docTitle = {
homeTitle: "OK Computer",
newTitle: "...您有新消息...",
isWinFocus: true,
title: document.title,
scrollTitle: function() {
document.title = this.title;
this.title = this.title.substring(1, this.title.length) + this.title.substring(0, 1);
if (!this.isWinFocus)
setTimeout("docTitle.scrollTitle()", 100);
else {
document.title = this.homeTitle;
return true;
}
}
};
var init = function() {
window.onblur = function() {
docTitle.isWinFocus = false;
docTitle.title = docTitle.newTitle;
docTitle.scrollTitle();
};
window.onfocus = function() {
docTitle.isWinFocus = true;
document.title = docTitle.homeTitle;
};
}
</script>
</head>
<body onload="init()">
</body>
</html>
第二种方式存在点问题, 还没理解, 就是把init函数放入docTitle里面, 使用docTitle.init()
初始化并不能滚动文字, 所以把init()
单独了出来
在程序中的使用方式:
/**
* 浏览器标签标题滚动,对于使用iframe的地方会存在问题
* @namespace IM
* @class util.scrollTitle
*/
IM.util.scrollTitle = function() {
// 编写窗口聚焦与离开状态
$(window).bind('blur', function() {
isWinFocus = false;
}).bind('focus', function() {
isWinFocus = true, document.title = IM.constant.HOME_TITLE;
});
var isWinFocus = true, title = document.title;
var scroll = function() {
document.title = title, title = title.substring(1, title.length) + title.substring(0, 1);
isWinFocus ? document.title = IM.constant.HOME_TITLE : setTimeout(IM.util.scrollTitle.scroll, 200);
};
return {
setTitle: function(newTitle) {
if (!isWinFocus) { title = newTitle, scroll(); }
},
getIsWinFocus: function() {
return isWinFocus;
},
setIsWinFocus: function(v) {
isWinFocus = v;
},
scroll: function() {
scroll();
}
};
}();
使用IM.util.scrollTitle.setTitle( '.XXX...来消息了...');
进行调用.
这里在写时犯了个愚蠢的错误, 导致调试了很久, 那就是在scroll中设置标题, 结果在循环调用时一直重设了标题, 然后想不明白为啥不滚动, 最后才发现了问题, 把设置标题的函数另外提取了出来, 因为循环调用的是return里面的scroll而不是第一个scroll, 应该把两个东西取不同名称比较不会弄混(刚开始搞了同一个名字).
OK, 先整理到这, 有些东西还需要理解, 写得不熟练导致绕了点弯, 刚开始代码是分散开的, 初始化和变量定义都放在主程序中, 后来想想应该封装起来, 在主程序中直接调用, 而不是直接在主程序中定义, 所以就有了现在的代码. 放到其它程序中也应该好用的.