ホームページにお気に入り登録機能を追加する

ポータルサイトやコミュニティサイト等で、お気に入りページを登録できることがありますね。自分が気になるページをチェックしておいて、後で確認しやすくする機能です。
今回、localStorageを利用してお気に入り登録機能を作ってみたので、方法を書きます。仕組みとしては[ホームページに最近見たページを表示する JavaScript](https://qiita.com/ounziw/items/6501502262ff33aacbbc)に似ています。

## 簡易的な実装です
今回は、訪問者が自分のお気に入りを保存できて後で確認できれば良い、という要件で、簡易的に実装しています。(このページをお気に入りした人には、このページがお勧め、といった機能までは提供しない)

htmlのボタンです。

```html
    <span class="favoritedmark fade">★</span>
    <button class="btn btn-primary addtofavorite">お気に入りに登録</button>
    <button class="btn btn-primary removefavorite hidden">お気に入りから外す</button>
```

お気に入りに登録されている場合　＝＞　★、お気に入りから外す
お気に入りに登録されていない場合　＝＞　お気に入りに登録

を表示する、という仕組みにしています。

まずは、お気に入りに登録するコードです。

```js
    $(".addtofavorite").click(function(){
        var favorite_pages_start = JSON.parse(localStorage.getItem('favorite_pages'));
        var title = $("h1.page-title").text(); // ページのタイトルを取得
        if (!title.length) { // ↑が無い場合は、<head>のタイトルを取得
            title = document.title;
        }
        var favorite_pages = [{
            url: CCM_CID, // CCM_CIDは、concrete5 が各ページに付与しているID
            title: title,
            datetime: $.now()
        }];

        if(favorite_pages_start.length >= 10) { // 最大10個まで
            alert("お気に入りの登録数の上限に達しました。");
            return;
        }
        if (favorite_pages_start) {
            for(i=0;i<10;i++) { 
                if (favorite_pages_start[i] && favorite_pages[0].url !== favorite_pages_start[i].url) {
                    favorite_pages.push(favorite_pages_start[i]);
                }
            }
        }
        localStorage.setItem('favorite_pages',JSON.stringify(favorite_pages));
        addFavorite();
    });
```

addFavoriteは自作の関数です。画面表示を切り替える、という単純な実装です。

```js
    function addFavorite() {
        $(".favoritedmark").removeClass('fade');
        $(".removefavorite").removeClass('hidden');
        $(".addtofavorite").addClass('hidden');
    }
```

お気に入りに登録されているページを外すコードです。

```js
    $(".removefavorite").click(function(){
        var favorite_pages_start = JSON.parse(localStorage.getItem('favorite_pages'));
        var favorite_pages = [];
        if (favorite_pages_start) {
            for(i=0;i<10;i++) {
                if (favorite_pages_start[i] && CCM_CID !== favorite_pages_start[i].url) {
                    favorite_pages.push(favorite_pages_start[i]);
                }
            }
        }
        localStorage.setItem('favorite_pages',JSON.stringify(favorite_pages));
        removeFavorite();
    });
```

removeFavoriteは自作の関数です。画面表示を切り替える、という単純な実装です。

```js
    function removeFavorite() {
        $(".favoritedmark").addClass('fade');
        $(".removefavorite").addClass('hidden');
        $(".addtofavorite").removeClass('hidden');
    }
```

最後になりますが、ページを表示したときに、既にお気に入りに登録されているかを判定するコードです。

```js
    var favorite_pages = JSON.parse(localStorage.getItem('favorite_pages'));
    var selected = false;
    if (favorite_pages) {
        for(i=0;i<10;i++) {
            if (!selected && favorite_pages[i] && !isNaN(favorite_pages[i]['url'])) {
                if (CCM_CID == favorite_pages[i]['url']){
                    selected = true;
                }
            }
        }
    }
    if(selected) {
        addFavorite();
    }
```

以上で、個別ページの設定は完了です。
お気に入りに登録したページを一覧表示する設定は、後日書きますので、しばらくお待ちください。

実際に活用している事例は、[石神井町：街ぶらインフォメーション](http://machibura.info/)や[計算フォーム](https://calculator.jp/)をごらんください。