カレンダーウィジェットのネイティブJS実装

カレンダーウィジェットのネイティブJS実装

この記事の例では、カレンダーウィジェットを実装するためのjsの具体的なコードを参考までに共有しています。具体的な内容は次のとおりです。

CSSコード

/********************************
 * カレンダー スタイル対応テーブル* #date カレンダー ブロック* テーブル テーブル* th ヘッダー* td 本文* a.now 今月* a.non-arrival その他の月* a.day today* a.href リンク* #date_diglogs ダイアログを記憶****************************/
 
#日付 {
 幅: 220ピクセル;
 パディング下部: 5px;
 ボックスシャドウ: 0 1px 3px #ccc;
 境界線: 1px 実線 #EDEDED;
}
 
#日付テーブル{
 幅: 継承;
 ユーザー選択: なし;
 フォントサイズ: 12px;
 境界線の折りたたみ: 折りたたみ;
 境界線の間隔: 0px;
}
 
#日付テーブル tr th {
 背景色: #f8f8f8;
 色: #5e5f63;
}
 
#日付テーブル tr:nth-of-type(2) th {
 フォントの太さ: 300;
}
 
#日付テーブル tr td {
 テキスト配置: 中央;
 フォントファミリ: "Comic Sans MS";
 パディング: 2px 0;
}
 
#日付テーブル tr td a {
 テキスト装飾: なし;
}
 
#日付テーブル tr td a.now {
 色: #757575;
}
 
#日付テーブル tr td a.day {
 背景: 中青;
 テキスト装飾: 下線;
 色: #fff;
}
 
#日付テーブル tr td a.href {
 境界線: 1px 実線 #ccc;
 遷移: すべて 1 線形;
}
 
#日付テーブル tr td a.href:hover {
 境界線: 1px 点線 #5E5F63;
 背景:ゴールド;
}
 
#日付テーブル tr td a.非到着 {
 色: #ccc;
} 
 
.date_diglogs {
 フォントサイズ: 10px;
 背景: #fff;
 パディング: 2px 5px;
 境界線の半径: 3px;
 ボックスシャドウ: 0 1px 3px #ccc;
 境界線: 1px 実線 #EDEDED;
 色: #757575;
}

Jsコード

/* 2021/2/26
 * 機能: カレンダーペンダント* 清遠妙山*/
 
関数 BlogDate(nowDate) {
 /* 変数データ */
 this.year = nowDate.getFullYear(); // 年を取得しますthis.month = nowDate.getMonth(); // 月を取得しますthis.day = nowDate.getDate(); // 今日が何曜日かを取得しますthis.week = new Date(this.year, this.month, 1).getDay(); // 各月の初めの空き日数を取得しますthis.days = new Date(this.year, this.month + 1, -1).getDate() + 1; // 合計日数を取得しますthis.last_month = new Date(this.year, this.month, -1).getDate() + 1; // 先月の日数を保存します/* 変更されていないデータ*/
 this.now_year = nowDate.getFullYear(); // 今年の年を保存します this.now_month = nowDate.getMonth(); // 今年の月を保存します }
 
BlogDate.prototype.createDate = 関数(名前) {
 // ブロックを取得してテーブルを作成します。let date_div = document.getElementById('date');
 date_table を document.createElement('table') とします。
 date_div.appendChild(date_table);
 
 // すべてのtrタグを作成します。let date_all_tr = new Array();
 (n = 0、n < 8、n++ とします) {
 date_all_tr[n] = document.createElement('tr');
 date_table.appendChild(date_all_tr[n]);
 }
 
 // head 番目のタグを作成します。let date_head_th = new Array();
 (n = 0; n < 3; n++ とします) {
 date_head_th[n] = document.createElement('th');
 date_all_tr[0].appendChild(date_head_th[n]);
 }
 
 // 特別な要素属性を設定する date_head_th[0].setAttribute('id', 'prev');
 date_head_th[1].setAttribute('colspan', '5');
 date_head_th[1].setAttribute('title', `${name}`);
 date_head_th[2].setAttribute('id', 'next');
 
 // 週番目のラベルを作成します。let date_week_th = new Array();
 (n = 0、n < 7、n++ とします) {
 date_week_th[n] = document.createElement('th');
 date_all_tr[1].appendChild(date_week_th[n]);
 }
 
 // タグ配列 body td を作成します。let date_body_td = new Array();
 date_body_td_a を新しい配列()にします。
 
 // タグエンティティであるボディtdを作成する for (let n = 2, i = 0; n < 8; n++, i++) {
 日付本体td[i] = [];
 日付本体td_a[i] = [];
 
 (m = 0、m < 7、m++ とします) {
 date_body_td[i][m] = document.createElement('td');
 date_body_td_a[i][m] = document.createElement('a');
 date_body_td[i][m].appendChild(date_body_td_a[i][m]);
 date_all_tr[n].append(date_body_td[i][m]);
 }
 }
}
 
BlogDate.prototype.setBlogDate = function(newDate) {
 /* データを更新 */
 this.year = newDate.getFullYear(); // 年を取得しますthis.month = newDate.getMonth(); // 月を取得しますthis.day = newDate.getDate(); // 今日の日付を取得しますthis.week = new Date(this.year, this.month, 1).getDay(); // 各月の初めの空き日数を取得しますthis.days = new Date(this.year, this.month + 1, -1).getDate() + 1; // 合計日数を取得しますthis.last_month = new Date(this.year, this.month, -1).getDate() + 1; // 先月の日数を取得します}
 
BlogDate.prototype.updateTime = function(blogs_date) {
 // カレンダー オブジェクトを取得します。let date_div = document.getElementById('date');
 date_table = date_div.getElementsByTagName('table')[0] とします。
 
 // カレンダーヘッダー tr, th を作成
 date_head_tr = date_table.getElementsByTagName('tr')[0] とします。
 date_head_th = date_head_tr.getElementsByTagName('th'); とします。
 
 // ヘッダーデータを作成する let date_head_arr = [
 '<'、`${this.year} 年 ${this.month + 1} か月`、'>'
 ];
 
 // ヘッダーデータを更新 for (let n = 0; n < date_head_th.length; n++) {
 date_head_th[n].textContent = date_head_arr[n];
 }
 
 // 週の部分を作成する tr, th
 date_week_tr = date_table.getElementsByTagName('tr')[1] とします。
 date_week_th = date_week_tr.getElementsByTagName('th'); とします。
 
 // 週データを作成する let date_week_arr = [
 「日」、「月」、「火」、「水」、「木」、「金」、「土」
 ];
 
 // 週データを更新 for (let n = 0; n < date_week_th.length; n++) {
 date_week_th[n].textContent = date_week_arr[n];
 }
 
 // body td の a タグを取得します。let date_body_td_a = date_table.getElementsByTagName('a');
 
 // 他の月の日数を設定する(前)
 (n = this.week - 1、last_month = this.last_month、n >= 0、n--、last_month--) {
 date_body_td_a[n].textContent = 先月;
 date_body_td_a[n].setAttribute('class', '未到着');
 }
 
 // 現在の月の日数を設定します(現在)
 (n = this.week、i = 1、i <= this.days、n++、i++) {
 date_body_td_a[n].textContent = i;
 // 今月のこの日であれば、日のスタイルを設定し、そうでない場合は、現在のスタイルを設定します。if ((i == this.day) &&
 (新しい日付(this.year, this.month, 1).getMonth() == this.now_month) &&
 (新しい日付(this.year、this.month、1).getFullYear() == this.now_year)) {
 date_body_td_a[n].setAttribute('class', 'day');
 } それ以外 {
 date_body_td_a[n].setAttribute('class', 'now');
 }
 }
 
 // 他の月の日数を設定する(後ほど)
 (n = this.week + this.days、i = 1、n < date_body_td_a.length、n++、i++) {
 date_body_td_a[n].textContent = i;
 date_body_td_a[n].setAttribute('class', '未到着');
 }
 
 // リンク部分の日付データが同じ場合は、対応するスタイルを設定します for (let n = 0; n < date_body_td_a.length; n++) {
 (m = 0 とします; m < blogs_date.href_num; m++) {
 if ((this.year == blogs_date.href_year[m]) &&
 (今月 + 1 == blogs_date.href_month[m]) &&
 (n == blogs_date.href_day[m])) {
 date_body_td_a[n].setAttribute('href', blogs_date.href_url[m]);
 date_body_td_a[n].classList.add('href');
 date_body_td_a[n].setAttribute('target', '_blank');
 } それ以外 {
 // そうでない場合は、冗長な属性があるかどうかを判定します if (Boolean(date_body_td_a[n].getAttribute('target')) &&
 ブール値(date_body_td_a[n].getAttribute('href')) &&
 (date_body_td_a[n].getAttribute('class') == 'now' ||
 date_body_td_a[n].getAttribute('class') == '非到着')) {
 date_body_td_a[n].removeAttribute('href');
 date_body_td_a[n].removeAttribute('ターゲット');
 }
 }
 }
 }
}
 
関数initDate(
 // デフォルトのカレンダーパラメータテーブル blogs_date = {
 blogs_name: 'マイカレンダー',
 href_year: [2021],
 href_month: [2],
 href_day: [26],
 href_url: ['http://www.4399.com/'],
 href_prompt: ['これは私が書いたカレンダーウィジェットです'],
 href_dialog: 偽、
 href_num: 未定義
 }
){
 // パラメータの長さは等しいか if ((blogs_date.href_day.length != blogs_date.href_month.length) ||
 (blogs_date.href_month.length != blogs_date.href_year.length) ||
 (blogs_date.href_year.length != blogs_date.href_url.length)) {
 console.info('カレンダーパラメータの長さが等しくありません');
 false を返します。
 }
 // パラメータの長さが同じ場合は対応する長さを設定します。そうでない場合は{
 blogs_date.href_num = blogs_date.href_day.length;
 }
 
 // カレンダーデータを作成する let timeDate = new Date();
 blogDate = new BlogDate(timeDate); とします。
 
 // カレンダーエンティティを作成します blogDate.createDate(blogs_date.blogs_name);
 blogDate.updateTime(blogs_date);
 
 // 前のイベントを追加 document.getElementById('prev').onclick = function() {
 timeDate.setMonth(timeDate.getMonth() - 1);
 blogDate.setBlogDate(timeDate);
 blogDate.updateTime(blogs_date);
 }
 
 // 次のイベントを追加 document.getElementById('next').onclick = function() {
 timeDate.setMonth(timeDate.getMonth() + 1);
 blogDate.setBlogDate(timeDate);
 blogDate.updateTime(blogs_date);
 }
 
 ダイアログを開きます(blogs_date);
 
 ブログデータを表示します(blogs_date、timeDate);
}
 
関数 showBlogsData(blogs_date, 現在) {
 (blogs_date に k を入れる) {
 console.info(`[${k}] : ${blogs_date[k]}`);
 }
 console.info(`BlogsDate Ok ${now}`);
}
 
関数 openDialogs(blogs_date) {
 // ダイアログを開くかどうかのスイッチ (blogs_date.href_dialog) {
 真の場合:
 hrefId = document.getElementsByClassName('href'); とします。
 (n = 0; n < hrefId.length; n++) の場合 {
 hrefId[n].onmouseover = function(e) {
 if (this.getAttribute('class') != 'now' &&
 this.getAttribute('class') != '非到着') {
 
 var e = e || window.event;
 
 x = e.clientX とします。
 y = e.clientY とします。
 
 prompt = blogs_date.href_prompt[n]とします。
 ダイアログを document.createElement('div') にします。
 
 ダイアログのクラスリストに「date_diglogs」を追加します。
 dialogs.textContent = プロンプト;
 dialogs.style.cssText = `位置: 絶対;
 左: ${x-20}px;
 上: ${y+20}px`;
 
 document.body.appendChild(ダイアログ);
 }
 }
 hrefId[n].onmouseout = 関数() {
 if (this.getAttribute('class') != 'now' &&
 this.getAttribute('class') != '非到着') {
 
 diglogs = document.getElementsByClassName('date_diglogs')[0] とします。
 document.body.removeChild(diglogs);
 }
 }
 }
 壊す;
 偽の場合:
 壊す;
 }
}

HTMLコード

<!DOCTYPE html>
<html>
 <ヘッド>
 <メタ文字セット="utf-8">
 <title>日付 html</title>
 <link rel="スタイルシート" href="date.css" media="screen">
 </head>
 <本文>
 <h3>こんにちは</h3>
 <div id="日付"></div>
 <script src="date.js"></script>
 <スクリプト>
 initDate(blogs_date = {
 blogs_name : 'マイカレンダー',
 href_year : [2021, 2021], 
 href_月: [2, 2], 
 href_day : [27, 3], 
 href_url : ['http://www.4399.com/', 'http://www.baidu.com/'],
 href_prompt: [「今日は家族に会いに出かけなければならない」、「今日は早く寝なければならない」]、
 href_dialog: 真
 });
 </スクリプト>
 </本文>
</html>

効果

参考リンク: jQuery カレンダー効果

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

以下もご興味があるかもしれません:
  • 軽量ネイティブ js カレンダー プラグイン、calendar.js の使用ガイド
  • シンプルなカレンダーコントロールを学ぶJS
  • js カレンダー コントロール (分単位の精度)
  • PHP+JavaScript カレンダーコントロール
  • シンプルな JS カレンダー コントロールのサンプル コード
  • js カレンダー コントロールを IE9/Google/Firefox と互換性があるように変更します。
  • ASP.NET でカレンダー コントロールとカレンダー コントロールの JS バージョンを使用する方法 (セクション 5)
  • JavaScript ブログ スタイルのカレンダー コントロールの新しいアルゴリズム
  • IE、FirefoxのJavaScriptカレンダーコントロールをサポート
  • ネイティブ JS でカレンダー コンポーネントを実装するためのサンプル コード

<<:  Dockerイメージの作成、保存、読み込み方法

>>:  Macにmysql5.7.18をインストールする詳細な手順

推薦する

VantフレームワークをWeChatアプレットに導入するプロセス全体の記録

序文WeChat ミニプログラムのネイティブ UI が少し物足りないと感じることがあるので、サードパ...

CSS を使用して 3 列のアダプティブ レイアウト (両側は固定幅、中央はアダプティブ) を実現します。

いわゆる 3 列適応レイアウトとは、両側の幅が固定され、中央のブロックの幅が適応されることを意味しま...

CSSはletter-spacingプロパティを通じて単語間の間隔を制御します。

letter-spacing プロパティ: 文字間のスペース (文字間隔) を増減します。このプロ...

UbuntuはSSHサービスのリモートログイン操作を開始します

ssh-secure シェルは、安全なリモート ログインを提供します。組み込みシステムを開発し、Li...

この記事ではJavaScriptのガベージコレクションの仕組みを説明します

目次1. 概要2. メモリ管理3. ガベージコレクション4. GCアルゴリズムの紹介5. 参照カウン...

MySQL データベースでよく使用される SQL ステートメントの詳細と概要

この記事では、MySQL データベースでよく使用される SQL ステートメントを例を使用して説明しま...

mysql 8.0.15 winx64 解凍バージョン グラフィック インストール チュートリアル

システムをインストールした後、毎回いくつかのソフトウェアを再インストールする必要があります。ソフトウ...

MySQL カーソルの原理と使用例の分析

この記事では、例を使用して MySQL カーソルの原理と使用方法を説明します。ご参考までに、詳細は以...

MySQLのファジークエリのような遅い速度を解決する方法

質問: インデックスは作成されているのに、Like ファジー クエリがまだ遅いのはなぜですか?インデ...

Linux での JDK と Tomcat のアップロードと設定に関する詳細なチュートリアル

準備1. 仮想マシンを起動する2. gitツールルートアカウントでログインルートアカウントを使用して...

MySQL の最適化: InnoDB の最適化

勉強の計画は簡単に中断され、継続するのが困難です。先日、社内で事業の方向性を調整するための会議があり...

水平スクロールバーを実装する2つの方法の例

序文:プロジェクトの開発中に、1 行にナビゲーション バーが多すぎる場合に水平スクロール バーを実装...

MySQLは文字列の連結、インターセプション、置換、位置検索操作を実装しています

MySQL 文字列の連結、インターセプト、置換、および検索位置。よく使用される文字列関数:関数例示す...

VueはAmapを使用して都市の位置特定を実現

この記事では、Amapを使用して都市の位置特定を実現するVueの具体的なコードを参考までに共有します...

Centos7 で NIS を構成する詳細な手順

目次原理ネットワーク環境の準備インストール前の準備NIS サーバー操作NIS クライアント操作原理N...