Skip to content
223 changes: 223 additions & 0 deletions libs/iNotify/1.0.12/iNotify.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
/*!
* iNotify.js v1.0.12
* JS achieve the browser title flashing , scrolling, voice prompts , chrome notice.
*
* Copyright (c) 2016
* https://github.com/jaywcjlove/iNotify
*
* Licensed under the license.
*/
;(function(root, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(root.iNotify = factory());
}(this, function(root, undefined) {
var repeatableEffects = ['flash', 'scroll'],iNotify,defaultNotification={
title:"通知!",
body:'您来了一条新消息',
openurl:''
},iconURL = "";

function iNotify(config){
if(config) this.init(config);
}
iNotify.prototype = {
init:function(config){
if(!config) config = {}
this.interval = config.interval || 200//响应时长
this.effect = config.effect || 'flash' //效果
this.title = config.title || document.title; //标题
this.message = config.message || this.title; //原来的标题
this.onclick = config.onclick || this.onclick; //点击事件
this.openurl = config.openurl || this.openurl; //点击事件
this.updateFavicon = config.updateFavicon || {
id: "favicon",
textColor: "#fff",
backgroundColor: "#2F9A00"
}
this.audio = config.audio || '';
this.favicon = getFavicon(this.updateFavicon)
this.favicon = this.favicon;
this.cloneFavicon = this.favicon.cloneNode(true);
defaultNotification.icon = iconURL = (config.notification &&config.notification.icon)? config.notification.icon : (config.icon?config.icon:this.favicon.href);
this.notification = config.notification || defaultNotification;
//初始化生成声音文件节点
if(this.audio && this.audio.file) this.setURL(this.audio.file);
return this;
},
render: function() {
switch (this.effect) {
case 'flash':
document.title = (this.title === document.title) ? this.message : this.title;
break;
case 'scroll':
document.title = document.title.slice(1);
if (0 === document.title.length) {
document.title = this.message
}
break;
}
},
setURL:function(url){
if(url){
if(this.audioElm) this.audioElm.remove();
this.audioElm = createAudio(url);
document.body.appendChild(this.audioElm);
}
return this
},
loopPlay:function(){
this.setURL()
this.audioElm.loop = true
this.player()
return this
},
stopPlay:function(){
this.audioElm && (this.audioElm.loop = false,this.audioElm.pause())
return this
},
//播放声音
player:function(){
var adi = this.audio.file,source = null;
if(!this.audio || !this.audio.file) return;
if(!this.audioElm){
this.audioElm = createAudio(this.audio.file);
document.body.appendChild(this.audioElm)
}
this.audioElm.play();
return this
},
notify:function(json){
var nt = this.notification;
var url = json.openurl?json.openurl:this.openurl;
var onclick = json.onclick?json.onclick:this.onclick
if(window.Notification){
if(json) nt = jsonArguments(json,nt);
else nt = defaultNotification;
var n = new Notification(nt.title, {
icon: json.icon?json.icon:iconURL,
body: nt.body
});
n.onclick = function(){
onclick&&onclick();
url&&window.open(url);
}
}
return this
},
//是否许可弹框通知
isPermission:function(){
return window.Notification && Notification.permission === "granted" ? true : false ;
},
//设置标题
setTitle:function(str){
if(str === true){
if ( 0 <= repeatableEffects.indexOf(this.effect)) return this.addTimer();
}else if(str) {
this.message = str,this.addTimer()
}else{
this.clearTimer(),
this.title = this.title
}
return this
},
//设置时间间隔
setInterval:function(num){
if(num) this.interval = num,this.addTimer()
return this
},
//设置网页Icon
setFavicon:function(num){
if(!num&&num!==0) return this.faviconClear();
var oldicon = document.getElementById('new'+this.updateFavicon.id)
if(this.favicon) this.favicon.remove();
if(oldicon) oldicon.remove();
changeFavicon(num,this.updateFavicon)
return this
},
//添加计数器
addTimer:function(){
this.clearTimer()
if ( 0 <= repeatableEffects.indexOf(this.effect)) {
this.timer = setInterval(this.render.bind(this), this.interval);
}
return this
},
//清除Icon
faviconClear:function(){
var newicon = document.getElementById('new'+this.updateFavicon.id)
head = document.getElementsByTagName('head')[0],
ficon = document.querySelectorAll('link[rel~=shortcut]')
newicon&&newicon.remove()
if(ficon.length>0) for (var i = 0; i < ficon.length; i++) {
ficon[i].remove()
};
head.appendChild(this.cloneFavicon);
iconURL = this.cloneFavicon.href;
this.favicon = this.cloneFavicon;
return this
},
//清除计数器
clearTimer:function(){
clearInterval(this.timer);
document.title = this.title;
return this
}
};
// 获取 favicon
function getFavicon(setting){
var ic = document.querySelectorAll('link[rel~=shortcut]')[0];
if(!ic) ic = changeFavicon('O',setting);
return ic;
}
function createAudio(url){
var audioElm = document.createElement('audio'),source;
if(isArray(url) && url.length>0){
for (var i = 0; i < url.length; i++) {
source = document.createElement('source')
source.src = url[i]
source.type = 'audio/'+ getExtension(url[i])
audioElm.appendChild(source)
}
}else{
audioElm.src = url
}
return audioElm
}
function isArray(value) { return Object.prototype.toString.call(value) === '[object Array]';}
function changeFavicon(num,settings){
var canvas = document.createElement('canvas'),
img = document.createElement('img'),
head = document.getElementsByTagName('head')[0],
linkTag = document.createElement('link'),
ctx;

canvas.height = canvas.width = 32;
ctx = canvas.getContext('2d');
ctx.fillStyle = settings.backgroundColor;
ctx.fillRect(0, 0, 32, 32);

ctx.textAlign = "center";
ctx.font = '22px "helvetica", sans-serif';
ctx.fillStyle = settings.textColor;
ctx.fillText(num, 16, 24);

//生成到
linkTag.setAttribute('rel','shortcut icon');
linkTag.setAttribute('type','image/x-icon');
linkTag.setAttribute('id', 'new'+settings.id);
linkTag.setAttribute('href', canvas.toDataURL('image/png'));
iconURL = canvas.toDataURL('image/png');
return head.appendChild(linkTag);
};
//获取文件后缀
function getExtension (file_name) { return file_name.match(/\.([^\.]+)$/)[1];}
function jsonArguments (news,olds) {
for (var a in olds) if(news[a]) olds[a]=news[a];
return olds
}
//提醒是否添加chrome通知
if (window.Notification&&window.Notification.permission !== "granted") window.Notification.requestPermission();
return iNotify
}));

1 change: 1 addition & 0 deletions libs/iNotify/1.0.12/iNotify.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions libs/iNotify/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"name": "iNotify",
"filename": "iNotify.js",
"version": "1.0.12",
"description": "JS 实现浏览器的 title 闪烁、滚动、声音提示、chrome、Firefox、Safari等系统通知。",
"homepage": "http://jaywcjlove.github.io/iNotify",
"keywords": [
"inotify",
"notify",
"alert",
"notice",
"notification"
],
"maintainers": [
{
"name": "kenny wang",
"web": "http://wangchujiang.com",
"mail": "wowohoo@qq.com"
}
],
"repositories": [
{
"type": "git",
"url": "https://github.com/jaywcjlove/iNotify.git"
}
]
}