JSは5つ星の賞賛効果を達成

JSは5つ星の賞賛効果を達成

JS を使用してオブジェクト指向メソッドを実装し、JD.com の 5 つ星レビュー効果を実現します。

マウスを移動したときに表示する:

評価が完了したら、ブラウザを閉じてページを再度開くと、最後の評価結果が引き続き表示されます。これはクッキーを使用して行われます。

具体的な実装は以下のとおりです。

「./Component.js」からコンポーネントをインポートします。
 
エクスポートデフォルトクラスStarsはComponenetを拡張します{
 
    ラベル;
    STARS_NUM = 5;
    スターArr = [];
    スコア = 0;
    スターコン;
    顔アイコン;
    スコアコン;
    インデックス = -1;
    名前;
    
    static STARS_LIST={}; // 現在のページに、グループごとに 1 つの製品ずつ、5 つ星のレビュー結果をすべて保存します。製品 ID をキーとして使用し、製品レビューを値として使用して配列を形成します。
    date=新しい日付();
 
    コンストラクター(_label,_name) {
        スーパー("div");
        this.name=_name;
        this.label = _label;
        オブジェクト.assign(this.elem.style, {
            幅:"200px",
            高さ: "16px",
            フロート: "左",
            右余白: "20px",
            marginBottom: "10px",
            フォントサイズ: "12px",
            色: "#666",
            行の高さ: "16px",
            ユーザー選択: "なし",
            位置: "相対的"、
            上: "20px",
            左: "20px",
        })
        // クッキーに保存されているレビュー結果を解析し、各レビューを作成するときにスコア値を初期化します。
        スコアを初期化します。
        // 評価ラベル部分を作成します this.createLabel();
        // 星の部分を作成します this.createStars();
        // スコア部分を作成します this.createScore();
        // 星のスタイルを初期化します。
        this.changeStarStyle(this.score-1);
        // スコアを初期化します this.changeScore(this.score);
        // マウスのロールオーバーとクリック イベントを追加します。
        this.starsCon.addEventListener("mouseenter", e => this.mouseHandler(e));
        this.starsCon.addEventListener("mouseleave", e => this.mouseHandler(e));
        this.starsCon.addEventListener("mouseover", e => this.mouseHandler(e));
        this.starsCon.addEventListener("click", e => this.clickHandler(e));
        2021年をフルイヤーに設定します。
    }
    _parent に付加する{
        super.appendTo(_parent);
        if(!Stars.STARS_LIST[this.name]) Stars.STARS_LIST[this.name]=[];
        Stars.STARS_LIST[this.name].push(this.label+"="+this.score);
    }
    クリックハンドラ(e){
        if(e.target.constructor!==HTMLLIElement) 戻り値
        this.index = this.starArr.indexOf(e.target);
        this.score = this.index+1;
        this.changeStarStyle(this.index);
        this.changeScore(this.index+1);
        // クリックするたびにコメントの結果が Cookie に保存され、次回ページを開いたときに読み取ることができるようになります。 STARS_LIST は、ラベルをキー、スコアを値としてデータを保存します。
        this.storageScore();
    }
    ストレージスコア(){
        for(let prop in Stars.STARS_LIST){
            if(prop === this.name){
                Stars.STARS_LIST[prop].forEach((item,index)=>{
                    if(item.includes(this.label)) Stars.STARS_LIST[prop][index] = this.label+"="+this.score;
                });
            }
        }
        document.cookie="comment="+ JSON.stringify(Stars.STARS_LIST)+";expires="+this.date.toUTCString();
    }
    マウスハンドラ(e) {
        スイッチ (e.type) {
            ケース「マウス入力」:
                this.faceIcon.style.display = "ブロック";
                壊す;
            ケース「マウスリーブ」:
                this.faceIcon.style.display = "なし";
                this.changeStarStyle(this.index);
                this.changeScore(this.score);
                壊す;
            ケース「マウスオーバー」:
                index = this.starArr.indexOf(e.target); とします。
                this.changeStarStyle(インデックス);
                this.changeScore(インデックス + 1);
                this.changeFaceStyle(インデックス);
                壊す;
        }
    }
    星のスタイルを変更します(_i) {
        (n = 0; n < this.starArr.length; n++ とします) {
            n <= _i || n < this.score の場合 {
                this.starArr[n].style.backgroundPositionY = "-16px";
            } それ以外 {
                this.starArr[n].style.backgroundPositionY = "0px";
            }
        }
    }
    フェイススタイルを変更する(_i) {
        this.faceIcon.style.left = _i * 16 + "px";
        this.faceIcon.style.backgroundPositionX = (_i + 1) * 20 + "px";
    }
    スコア変更(_i) {
        this.scoreCon.textContent = _i + "ポイント";
    }
    ラベルを作成します(){
        label = document.createElement("span"); とします。
        オブジェクト.assign(ラベル.style, {
            フロート: "左",
            パディング: "0 5px",
        })
        ラベルのテキストコンテンツ = this.label;
        this.elem.appendChild(ラベル);
    }
    スターを作成します(){
        this.starsCon = document.createElement("ul");
        オブジェクト.assign(this.starsCon.style, {
            マージン: 0,
            パディング: 0,
            リストスタイル: "なし",
            幅: "80px",
            高さ: "16px",
            フロート: "左",
            位置: "相対的"、
        })
        (i = 0 とします; i < this.STARS_NUM; i++) {
            li = document.createElement("li"); とします。
            オブジェクト.assign(li.style, {
                幅: "16px",
                高さ: "16px",
                フロート: "左",
                背景画像: "url(./star_img/commstar.png)",
            })
            this.starArr.push(li);
            this.starsCon.appendChild(li);
        }
        this.faceIcon = document.createElement("div");
        オブジェクト.assign(this.faceIcon.style, {
            幅: "16px",
            高さ: "16px",
            背景画像: "url(./star_img/face-red.png)",
            背景位置X: "-80px",
            位置: "絶対"、
            左: "0",
            上: "-16px",
            表示: "なし",
        })
        this.starsCon.appendChild(this.faceIcon);
        this.elem.appendChild(this.starsCon);
    }
    スコアを作成する() {
        this.scoreCon = document.createElement("div");
        オブジェクト.assign(this.scoreCon.style, {
            高さ: "16px",
            幅:"20px",
            フロート: "左",
            パディング: "0 5px",
        })
        this.scoreCon.textContent = this.score + "分",
        this.elem.appendChild(this.scoreCon);
    }
    初期化スコア(){
        // クッキーを直接読み取って次のように表示します // comment={"1001":["製品の適合性=5","ショップのサービス態度=0","速達速度=0","宅配便サービス=0","速達梱包=0"],"1002":["製品の適合性=0","ショップのサービス態度=0","速達速度=0","宅配便サービス=0","速達梱包=0"]}
 
        // クッキーに保存されたコメント結果を解析します。
        if(!document.cookie.includes("comment=")) 戻り値
        o = JSON.parse(document.cookie.match(/(\{.*?\})/)[1]); とします。
        if(!o) 戻り値
        // 解析された o は次のようになります // ["製品の適合性=1", "ショップのサービス態度=0", "速達速度=0", "宅配便サービス=0", "速達梱包=0"]
        for(let prop in o){
            if(this.name===prop){
                this.score=o[prop].reduce((値,項目,インデックス)=>{
                    arr = item.split("="); とします。
                    arr[0]にthis.labelが含まれている場合、値はarr[1]のparseIntになります。
                    戻り値;
                },0)
            }
        }
    }
}

使用するときは、タグを渡して新しいインスタンスを作成します。

'./js/Stars.js' から Stars をインポートします。
let list=["製品の適合性","店主のサービス態度","速達スピード","宅配便サービス","速達梱包"];
 
        // star = new Stars(list[0]);
        // star.appendTo("body");
 
        リスト.forEach(item=>{
            // ラベルと対応する商品IDを渡す
            スター = new Stars(item,"1001");
            星を追加します。(".div1");
        })
        リスト.forEach(item=>{
            スター = new Stars(item,"1002");
            star.appendTo(".div2");
        })

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JSが5つ星の賞賛を獲得
  • JavaScript で 5 つ星の製品評価を実装
  • jQuery に基づいて 5 つ星のレビューを実装する
  • jQueryで実装した5つ星レビュー機能【事例】
  • jQuery によるレイヤーベースの 5 つ星評価機能を模倣する方法
  • jsは5つ星評価機能を実現する
  • 5つ星評価機能を実現するJavaScript
  • 5 つ星評価コードを実装する JavaScript (ソース コードのダウンロード)
  • JSとJQueryはそれぞれ淘宝網の五つ星賞賛の特殊効果を実現

<<:  MySQL インデックス最適化の説明

>>:  Linux におけるゼロコピー技術の使用に関する簡単な分析

推薦する

Nginx rtmp モジュールのコンパイル ARM バージョンの問題

目次1. 準備: 2. ソースコードのコンパイル1. 設定する2. コンパイルエラー3. ターゲット...

シンプルなデータ応答システムを実装する

目次1. デップ2. 観察者を理解する3. 監視と観察者を理解する4. トリガーの依存性5. プロセ...

vscode で Prettier Code プラグインを使用する詳細なチュートリアル

なぜprettierを使うのですか?大企業では、フロントエンド開発コードに独自のコード標準がある場合...

Presto をインストールし、Docker で Hive を接続する詳細なプロセス

1. はじめにPresto は、ギガバイトからペタバイトに及ぶデータ ソースに対してインタラクティブ...

Spring環境を構成するためのDocker-composeの手順

最近、メンバーがテストできるようにプロジェクトをパッケージ化する必要がありますが、パッケージ化された...

CSS の読み込みによってブロックが発生しますか?

おそらく誰もが js の実行によって DOM ツリーの解析とレンダリングがブロックされることを知って...

CSS でデフォルトのスタイルをクリアし、共通のスタイルを設定する方法

CSS デフォルトスタイルをクリア通常の明確なデフォルト スタイル: *{ マージン:0; パディン...

favico.ico---ウェブサイトicoアイコン設定手順

1. 正常に生成されたアイコン ファイルをダウンロードし、名前を favico.ico に変更して、...

CentOS 7.3 で Nginx 仮想ホストを設定する方法

実験環境最小限にインストールされた CentOS 7.3 仮想マシン基本環境を構成する1. ngin...

Vue が値を返してフォームを動的に生成し、データを送信する仕組みの詳細な説明

目次解決された主な問題1. バックエンドから返され、バックエンドに送信されるデータは、次の形式になり...

Websocket+Vuexはリアルタイムチャットソフトウェアを実装します

目次序文1. 効果は図の通りです2. 具体的な実施手順1. Vuexの紹介2.webscoked実装...

MySQL数千万の大規模データに対する30のSQLクエリ最適化テクニックの詳細な説明

1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...

HTML と CSS を使用して絵文字付きのコメント ボックスを作成する方法のチュートリアル

絵文字付きの HTML コメント ボックス。絵文字は Json データを通じて読み込まれ、好みに応じ...

Reactはconetxtを通じてマルチコンポーネント値転送関数を実装します

この関数の効果はvue的provide/injectに似ています。 contextを通じて反応できる...

MySQL DDLステートメントの使用

序文SQL の言語分類には主に以下の種類があります。 DDLデータ定義言語作成、削除、変更データ定義...