用Angular操作favicon的讨论

关于如何在Angular中优雅地操作favicon的故事。

Untitled 4.png

favicon是什么?

网站图标(favicon)是指网站运营者放置在网站或网页上的符号标志或图像,是俗称的图标。这个词是由英文短语“favorite icon”(喜爱的图标)缩写而来。

现在的ico图标真麻烦啊。
现在有很多apple-touch-icon之类的。
要是能用svg就好了,但目前只有Firefox支持。→ http://caniuse.com/#feat=link-icon-svg

说到别的话题

听说有一个叫做 favicon一括生成サイト 的网站 → http://realfavicongenerator.net/
这个网站超级方便,可以一次性生成 favicon,还可以生成适用于 iPhone、android、windows8 等等的图标,非常不错。

Untitled.png

引言

简介

绪论

Untitled.png

听说可以在Chrome、Firefox、Opera和IE11+上运行。
我正在尝试制作一个聊天工具,想找一个好的方法来显示未读消息数量。后来我听说了favicon.js,于是尝试去使用它。

引入

请阅读以下关于检测未读消息的方法的说明。
http://qiita.com/shinsukeimai/items/dd1e96456b7b51e32cce
我将根据此处的脚本进行编写。

初始阶段

<!DOCTYPE html>
<head>
    <link rel="stylesheet" href="app.css">
</head>
<body>
<div ng-app="myApp">
    <div ng-controller="MainCtrl as main">
        <ul ng-repeat="message in main.messages">
            <li msg content=message ng-class="{message: message.read }">{{message.text}}</li>
        </ul>
    </div>
</div>
<script src="./angular.min.js"></script>
<script src="./favico.js"></script>
<script src="app.js"></script>
</body>
"use strict";

angular.module("myApp", []);

angular.module("myApp").directive("msg", ["$window", function($window){
  return {
    restrict: "A",
    scope: {
      content: "="
    },
    link: function(scope, element){
      angular.element($window).bind('scroll', function () {
        var elementY = element[0].offsetTop;
        var pageTop = this.pageYOffset;
        var pageBottom = this.pageYOffset + this.innerHeight - 50;
        if(elementY > pageTop && elementY < pageBottom){
          scope.content.read = true;
          scope.$apply();
        }
      });
    }
  }
}]);

angular.module("myApp").controller("MainCtrl", function(){
  this.messages = [];
  for(var i = 0; i < 100; i++){
    this.messages[i] = {
      text: "message" + i,
      read: false
    }
  }
});

.message{
    color: red;
}

我将从这里开始

自然界所存在的一切物質、能量和生物,以及它們之間的相互作用的結合,被稱為「環境」。

    • faviconを用意します。

 

    • angularを用意します。

 

    favico.jsを用意します。(githubから落として下さい。)

实施

我要写index.html文件。
我要为链接设置favicon图标。

<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <!-- ここ!!!-->
    <link rel="shortcut icon" href="favicon32.ico">
    <link rel="stylesheet" href="app.css">
</head>
<body>
<div ng-app="myApp">
    <div ng-controller="MainCtrl">
        <ul ng-repeat="message in messages">
            <li msg content=message ng-class="{message: message.read }">{{message.text}}</li>
        </ul>
    </div>
</div>
<script src="./angular.min.js"></script>
<script src="./favico.js"></script>
<script src="app.js"></script>
</body>

我們將為favico.js編寫一個Service(工廠),以便設置詳細的動作。如果您想要進一步設定,請參考http://lab.ejci.net/favico.js/。

angular.module("myApp").factory("faviconService", function(){
  var favicon = new Favico({
    //animationを切る
    animation: "none"
  });
  var badge = function(num){
    favicon.badge(num);
  };

  return {
    badge: badge
  };
});

我会添加一个控制器。
当滚动时,我将通过更改favicon的标记值来实现。


angular.module("myApp").controller("MainCtrl", ["$scope", "$window", "$timeout", "faviconService", function($scope, $window, $timeout, faviconService){
  //初期値設定
  var num, scrollTimer;
  scrollTimer = false;
  $scope.messages = [];

  for(var i = 0; i < 100; i++){
    $scope.messages[i] = {
      text: "message" + i,
      read: false
    }
  }
  num = $scope.messages.length;
  faviconService.badge(num);
  //スクロール時の動き
  angular.element($window).bind('scroll', function () {
    //スクロール中の時の動きで100msの間を空けます。
    if(scrollTimer){
      $timeout.cancel(scrollTimer);
    }
    scrollTimer = $timeout(function(){
      var newNum = 0;
      //メッセージの既読を確認します。
      $scope.messages.forEach(function(message){
        if(!message.read){newNum++; }
      });
      if(num !== newNum){
        faviconService.badge(newNum);
        num = newNum;
      }
    },100);
  });
}]);

总结一下。

"use strict";

angular.module("myApp", []);

angular.module("myApp").directive("msg", ["$window", function($window){
  return {
    restrict: "A",
    scope: {
      content: "="
    },
    link: function(scope, element){
      angular.element($window).bind('scroll', function () {
        var elementY = element[0].offsetTop;
        var pageTop = this.pageYOffset;
        var pageBottom = this.pageYOffset + this.innerHeight - 30;
        if(elementY > pageTop && elementY < pageBottom){
          scope.content.read = true;
          scope.$apply();
        }
      });
    }
  }
}]);

angular.module("myApp").controller("MainCtrl", ["$scope", "$window", "$timeout", "faviconService", function($scope, $window, $timeout, faviconService){
  //初期値設定
  var num, scrollTimer;
  scrollTimer = false;
  $scope.messages = [];

  for(var i = 0; i < 100; i++){
    $scope.messages[i] = {
      text: "message" + i,
      read: false
    }
  }
  num = $scope.messages.length;
  faviconService.badge(num);
  //スクロール時の動き
  angular.element($window).bind('scroll', function () {
    //スクロール中の時の動きで100msの間を空けます。
    if(scrollTimer){
      $timeout.cancel(scrollTimer);
    }
    scrollTimer = $timeout(function(){
      var newNum = 0;
      $scope.messages.forEach(function(message){
        if(!message.read){newNum++; }
      });
      if(num !== newNum){
        faviconService.badge(newNum);
        num = newNum;
      }
    },100);
  });
}]);

angular.module("myApp").factory("faviconService", function(){
  var favicon = new Favico({
    animation: "none"
  });
  var badge = function(num){
    favicon.badge(num);
  };

  return {
    badge: badge
  };
});

大概就是这个样子。

成果

最初的状态 de

Untitled.png

当您滚动时

Untitled 2.png

以下以中国母语为基础的释义,只需要一种选择:

favicon (网站图标)

Untitled 3.png

印象

Untitled 4.png
广告
将在 10 秒后关闭
bannerAds