リクエスト分散バッチ処理【シンプル版】 | ReqBatchSmp.js
Demo
HTML
<script src="ReqBatchSmp.js"></script>
<script src="req_batch_smp.js"></script>
~ 略 ~
JavaScript(req_batch_smp.js)
var reqBatch; // ReqBatch.js | リクエスト分散バッチ処理【シンプル版】
$(()=>{
reqBatch = new ReqBatchSmp();
var param = {
div_xid:'req_batch_div',
interval:300,
fail_limit:5,
ajax_url:'req_batch_smp.php',
data:{
index:0,
name:'catdog',
}
}
var callbacks = {
thread_cb:thread1,
complete_cb:allEnd,
}
reqBatch.init(param, callbacks)
});
function thread1(param){
var data = param.data;
console.log(param.main_index);
jQuery('#res').append(data.name + '<br>');
if(param.main_index == 10){
reqBatch.stopThread();
}
return param;
}
function allEnd(param){
jQuery('#res').append("<div class='text-success'>処理が終わった</div>");
}
/**
* リクエスト分散バッチ処理【シンプル版】
*
*
* @date 2019-5-19
* @version 1.0.0
*/
class ReqBatchSmp{
/**
* 初期化
* @param object param
* - div_xid 当機能埋込先区分のid属性
* - data データ
* - ajax_url AJAX通信先URL
* - main_index メインインデックス
* - data_num データ数
* - asyn_cb 非同期コールバック
* - interval インターバル(ミリ秒) デフォルト1000ms
* - fail_limit 失敗限界数 失敗数が失敗限界数を超えると強制停止
* - asyn_param 非同期コールバックに付加するパラメータ
*
* @param object callbacks コールバック情報
* - thread_cb function スレッドコールバック
* - complete_cb 完了コールバック
*
*/
init(param, callbacks){
param = this._setParamIfEmpty(param);
this.callbacks = callbacks;
this.tDiv = jQuery('#' + param.div_xid); // This division
// 当機能のHTMLを作成および埋込
var html = this._createHtml();
this.tDiv.html(html);
this.tDiv.show();
// ▼機能や区分の要素を取得
this.startBtn = jQuery('.req_batch_start_btn'); // バッチ処理・スタートボタン
this.handlers = []; // スレッドのハンドラーリスト
this.successDiv = this.tDiv.find('.req_batch_success'); // 成功メッセージ
this.reloadBtn = this.tDiv.find('.req_batch_reload'); // リロードボタン
this.errDiv = this.tDiv.find('.req_batch_err'); // 一般エラーメッセージ
this.prog = this.tDiv.find('.req_batch_prog'); // 進捗バー
this.btnsA = this.tDiv.find('.req_batch_btns_a'); // ボタングループA
this.stopBtn = this.tDiv.find('.req_batch_stop_btn'); // 停止ボタン
this.failBtn = this.tDiv.find('.req_batch_fail_btn'); // 失敗表示ボタン
this.consoleDiv = this.tDiv.find('.req_batch_console'); // コンソール区分
this.cCountDiv = this.tDiv.find('.req_batch_c_count'); // 処理数
this.cSuccessDiv = this.tDiv.find('.req_batch_c_success_count'); // 成功数
this.cFailDiv = this.tDiv.find('.req_batch_c_fail_count'); // 失敗数
this.cMemDiv = this.tDiv.find('.req_batch_c_mem'); // メモリ
this.failDiv = this.tDiv.find('.req_batch_fail'); // 失敗区分
this._addStartClickEvent(this.startBtn); // スタートボタンのクリックイベントを追加
this._addReloadClickEvent(this.reloadBtn); // リロードボタンクリックイベントを追加
this._addStopClickEvent(this.stopBtn); // 停止ボタンクリックイベントを追加
this._addFailBtnClickEvent(this.failBtn); // 失敗ボタンのクリックイベントを追加
this.prog.hide(); // 進捗バーを隠す
this.btnsA.hide();
this.consoleDiv.hide(); // コンソール区分を隠す
this.param = param;
}
/**
* If Param property is empty, set a value.
*/
_setParamIfEmpty(param){
if(param == null) param = {};
if(param['div_xid'] == null) param['div_xid'] = 'req_batch_div';
if(param['interval'] == null) param['interval'] = 1000;
if(param['ajax_url'] == null && param['asyn_cb'] == null) throw new Error("Empty 'ajax_url' and 'asyn_cb' !");
if(param['fail_limit'] == null) param['fail_limit'] = 5;
if(param['asyn_param'] == null) param['asyn_param'] = null;
if(param['main_index'] == null) param['main_index'] = 0;
if(param['data_num'] == null) param['data_num'] = 100;
return param;
}
/**
* 当機能のHTMLを作成および埋込
* @return string 当機能のHTML
*/
_createHtml(){
var html = `
<div><input type="button" value="スタート" class="req_batch_start_btn btn btn-success"></div>
<div>
<div class="req_batch_success text-success"></div>
<input type="button" class="req_batch_reload btn btn-success btn-xs" value="リロード" style="display:none">
</div>
<div class="req_batch_err text-danger"></div>
<div><progress class="req_batch_prog" max="100" style="display:none">■</progress></div>
<div class="req_batch_btns_a" class="btn-group">
<input type="button" value="停止" class="req_batch_stop_btn btn btn-default btn-xs"/>
<input type="button" value="失敗(0)" class="req_batch_fail_btn btn btn-default btn-xs"/>
</div>
<br>
<div class="req_batch_console console">
<div><span>処理数:</span><span class="req_batch_c_count"></span></div>
<div><span>成功:</span><span class="req_batch_c_success_count">0</span></div>
<div><span>失敗:</span><span class="req_batch_c_fail_count">0</span></div>
<div style="width:100%;font-size:0.8em"><span>JSメモリチェック:</span><span class="req_batch_c_mem"></span></div>
</div>
<div class="req_batch_fail text-danger" style="display:none"></div>
`;
return html;
}
/**
* バッチ処理開始
*/
start(){
// 各種要素の表示切替
this.startBtn.hide();
this.prog.show();
this.btnsA.show();
this.consoleDiv.show();
this.prog.val(0);
this.asyn_flg = 0; // 非同期処理フラグ 0:非同期処理終わり, 1:非同期処理の実行中
this.success_count = 0; // 成功数
this.fail_count = 0; // 失敗数
this.ic_start_time = Math.floor($.now()); // 間隔制御・スタートタイム
this.mems = this._resetMemoryData(); // メモリデータをリセット
// ★ スレッド開始。スレッドにする関数と間隔(ミリ秒)を指定する。
var h = setInterval(()=>{this.thread();}, this.param.interval);
this.handlers.push(h); // ハンドラをリストに追加
}
/**
* スタートボタンのクリックイベントを追加
* @param jQuery startBtn スタートボタンの要素
*/
_addStartClickEvent(reloadBtn){
reloadBtn.click((evt)=>{
this.start(); // バッチ処理開始
});
}
/**
* リロードボタンクリックイベントを追加
* @param jQuery reloadBtn リロードボタンの要素
*/
_addReloadClickEvent(reloadBtn){
reloadBtn.click((evt)=>{
location.reload(true); // ブラウザをリロード
});
}
/**
* 停止ボタンクリックイベントを追加
* @param jQuery stopBtn 停止ボタンの要素
*/
_addStopClickEvent(stopBtn){
stopBtn.click((evt)=>{
this.stopThread(); // スレッド停止
this.startBtn.show(); // スタートボタンを再表示
});
}
/**
* 失敗ボタンクリックイベントを追加
* @param jQuery failBtn 失敗ボタンの要素
*/
_addFailBtnClickEvent(failBtn){
failBtn.click((evt)=>{
this.failDiv.toggle(300);
});
}
/**
* スレッド | 定期的に呼び出される関数
*/
thread(){
// 非同期処理が終わっている状態(非同期フラグ=0)である場合
if(this.asyn_flg == 0){
this._showCCount(); // 処理数を表示
this._advanceProg(); // 進捗バーを進める
this.ic_start_time = Math.floor($.now()); // 間隔制御・スタートタイム Interval control start time
// スレッド終了処理
// すべての処理が終わったら、終了処理を行う
if(this.param.data_num <= this.param.main_index){
this._endProcessing(); // 終了処理
return;
}
this.asyn_flg = 1; // 非同期処理フラグを非同期処理中にする。
// 外・非同期処理が設定されていれば実行
if(this.param.asyn_cb){
this.param.asyn_cb(this.param);
}else{
this._asynForInner(); // 内・非同期処理を実行
}
this.param.main_index ++; // メインインデックスを進める
this._showMemory(); // メモリ情報を表示する
}else{
// 非同期処理がまだ終わっていないなら何もしない
}
}
/**
* 処理数を表示
*/
_showCCount(){
var msg = this.param.main_index + '/' + this.param.data_num;
this.cCountDiv.html(msg);
}
/**
* 進捗バーを進める
*/
_advanceProg(){
var v = (this.param.main_index / this.param.data_num) * 100;
this.prog.val(v);
}
/**
* 終了処理
*/
_endProcessing(){
this.prog.hide(); // 進捗バーを隠す
this.successDiv.html('すべての処理が終わりました。');
this._showCCount(); // 処理数を表示
this.stopThread(); // スレッドを停止する
this.reloadBtn.show(); // リロードボタンを表示する
// 完了コールバックの呼び出し
if(this.callbacks.complete_cb){
this.callbacks.complete_cb(this.param);
}
}
/**
* 内・非同期処理を開始
*/
_asynForInner(){
var sendData = this.param.data;
var send_json = JSON.stringify(sendData);//データをJSON文字列にする。
// AJAX
jQuery.ajax({
type: "POST",
url: this.param.ajax_url,
data: "key1=" + send_json,
cache: false,
dataType: "text",
})
.done((res_json, type) => {
var res;
try{
res =jQuery.parseJSON(res_json);//パース
}catch(e){
this.asynFail(res_json); // 非同期処理・失敗
return;
}
this.param.data = res;
this.asynSuccess(this.param); // 非同期処理・成功
})
.fail((jqXHR, statusText, errorThrown) => {
this.errDiv.html(jqXHR.responseText);
alert(statusText);
});
}
/**
* 非同期処理・失敗
* @param string res_json レスポンス・JSON
*/
asynFail(res_json){
this.asyn_flg = 0; // 非同期処理を終了にする
this._addFail(this.param.main_index, res_json); // 失敗情報を追加
this._showFailCount(); // 失敗数のカウントと表示
this._checkFailLimit(); // 失敗数が失敗限界数を超えたら強制停止
}
/**
* 非同期処理・成功
*/
asynSuccess(param){
// 非同期処理レスポンスコールバック
if(this.callbacks.thread_cb){
var index = this.param.main_index - 1;
this.callbacks.thread_cb(param);
}
this._successCountAndShow(); // 成功数えと表示
this.asyn_flg = 0; // 非同期処理を終了にする
}
/**
* 成功数えと表示
*/
_successCountAndShow(){
// 成功数を加算し、成功要素へセットして表示する
this.success_count ++;
this.cSuccessDiv.html(this.success_count);
}
/**
* 失敗情報を失敗区分に追加
* @param string fail_text 失敗テキスト
*/
_addFail(main_index, fail_text){
var html = `
<div style="display:inline-block">
<input type="button" class="btn btn-default btn-xs" value="失敗 ${main_index}" onclick="jQuery('#req_batch_fail${main_index}').toggle(300)">
<div id="req_batch_fail${main_index}" style="display:none">${fail_text}</div>
</div>
`;
this.failDiv.append(html);
}
/**
* 失敗数のカウントと表示
*/
_showFailCount(){
this.fail_count ++;
this.cFailDiv.html(this.fail_count);
// 失敗ボタン名の失敗カウントを更新
var btn_name = "失敗(" + this.fail_count + ")";
this.failBtn.attr('value', btn_name);
}
/**
* 失敗数が失敗限界数を超えたら強制停止
*/
_checkFailLimit(){
if(this.fail_count > this.param.fail_limit){
this.stopThread();
var err_msg = `失敗数が${this.param.fail_limit}回を超えたので処理を中断します。`;
this.errDiv.html(err_msg);
}
}
/**
* スレッドを停止する。
*/
stopThread(){
for(var i in this.handlers){
var h = this.handlers[i];
clearInterval(h); // スレッド停止
}
}
/**
* メモリ情報を表示する
*/
_showMemory(){
if(this.mems == null) return;
var memory = performance.memory;
var m3 = memory.usedJSHeapSize - this.mems.usedJSHeapSize1;
this.cMemDiv.html(m3);
}
/**
* メモリデータのリセット
* @note Chrome系のみ対応
*/
_resetMemoryData(){
var memory = performance.memory;
if(memory==null) return null;
var mems = {
'jsHeapSizeLimit1':memory['jsHeapSizeLimit'],
'totalJSHeapSize1':memory['totalJSHeapSize'],
'usedJSHeapSize1':memory['usedJSHeapSize'],
}
return mems;
}
}
2019-5-19
リクエスト分散バッチ処理
Demo
HTML
<script src="ReqBatch.js"></script>
<script src="batch_processing.js"></script>
~略~
<input id="req_batch_start_btn" type="button" value="start" onclick="start()" class="btn btn-success" />
<!-- リクエスト型バッチ処理・ReqBatch.js -->
<div id="req_batch_div"></div>
JavaScript | batch_processing.js
var reqBatch; // ReqBatch.js | リクエストを1件ずつ、実行するバッチ処理
$(()=>{
reqBatch = new ReqBatch();
reqBatch.init({
div_xid:'req_batch_div',
interval:300,
fail_limit:5,
ajax_url:'ajax_req_batch_exe.php',
asyn_res_cb:response1,
complete_cb:allEnd
})
});
function start(){
var data = _getSampleData(); // サンプルデータを取得する
// バッチ処理開始
reqBatch.start(data);
}
function _getSampleData(){
var data = []
for(var i=0;i<40;i++){
var ent = {id:i+1};
data.push(ent);
}
return data;
}
function response1(param){
jQuery('#res').append(param.name + '<br>');
}
function allEnd(){
jQuery('#res').append("<div class='text-success'>処理が終わった</div>");
}
/**
* リクエスト分散バッチ処理
*
* @note リクエストを1件ずつ、実行するバッチ処理
*
* @date 2019-4-23 | 2019-4-27
* @version 1.0.1
*/
class ReqBatch{
/**
* 初期化
* @param object param
* - div_xid 当機能埋込先区分のid属性
* - start_btn_xid スタートボタンのid属性
* - ajax_url AJAX通信先URL
* - interval インターバル(ミリ秒) デフォルト1000ms
* - fail_limit 失敗限界数 失敗数が失敗限界数を超えると強制停止
* - asyn_res_cb function 非同期処理レスポンスコールバック
* - complete_cb 完了コールバック
*/
init(param){
param = this._setParamIfEmpty(param);
this.tDiv = jQuery('#' + param.div_xid); // This division
this.startBtn = jQuery('#' + param.start_btn_xid); // バッチ処理・スタートボタン
this.handlers = []; // スレッドのハンドラーリスト
this.param = param;
}
/**
* If Param property is empty, set a value.
*/
_setParamIfEmpty(param){
if(param == null) param = {};
if(param['div_xid'] == null) param['div_xid'] = 'req_batch_div';
if(param['start_btn_xid'] == null) param['start_btn_xid'] = 'req_batch_start_btn';
if(param['interval'] == null) param['interval'] = 1000;
if(param['ajax_url'] == null) throw new Error("Empty 'ajax_url' !");
if(param['fail_limit'] == null) param['fail_limit'] = 5;
return param;
}
/**
* バッチ処理開始
* @param data 処理対象のデータ
*/
start(data){
this.data = data;
// 当機能のHTMLを作成および埋込
var html = this._createHtml();
this.tDiv.html(html);
// ▼機能や区分の要素を取得
this.successDiv = this.tDiv.find('.req_batch_success'); // 成功メッセージ
this.reloadBtn = this.tDiv.find('.req_batch_reload'); // リロードボタン
this.errDiv = this.tDiv.find('.req_batch_err'); // 一般エラーメッセージ
this.prog = this.tDiv.find('.req_batch_prog'); // 進捗バー
this.stopBtn = this.tDiv.find('.req_batch_stop_btn'); // 停止ボタン
this.failBtn = this.tDiv.find('.req_batch_fail_btn'); // 失敗表示ボタン
this.consoleDiv = this.tDiv.find('.req_batch_console'); // コンソール区分
this.cCountDiv = this.tDiv.find('.req_batch_c_count'); // 処理数
this.cSuccessDiv = this.tDiv.find('.req_batch_c_success_count'); // 成功数
this.cFailDiv = this.tDiv.find('.req_batch_c_fail_count'); // 失敗数
this.cMemDiv = this.tDiv.find('.req_batch_c_mem'); // メモリ
this.failDiv = this.tDiv.find('.req_batch_fail'); // 失敗区分
this._addReloadClickEvent(this.reloadBtn); // リロードボタンクリックイベントを追加
this._addStopClickEvent(this.stopBtn); // 停止ボタンクリックイベントを追加
this._addFailBtnClickEvent(this.failBtn); // 失敗ボタンのクリックイベントを追加
this.mems = this._resetMemoryData(); // メモリデータをリセット
this.prog.show(); // 進捗バーを表示
this.prog.val(0);
this.startBtn.hide(); // スタートボタンを隠す
this.main_index = 0; // メインインデックス
this.asyn_flg = 0; // 非同期処理フラグ 0:非同期処理終わり, 1:非同期処理の実行中
this.data_num = this.data.length; // データ数
this.success_count = 0; // 成功数
this.fail_count = 0; // 失敗数
this.ic_start_time = Math.floor($.now()); // 間隔制御・スタートタイム
// ★ スレッド開始。スレッドにする関数と間隔(ミリ秒)を指定する。
var h = setInterval(()=>{this.thread();}, this.param.interval);
this.handlers.push(h); // ハンドラをリストに追加
}
/**
* 当機能のHTMLを作成および埋込
* @return string 当機能のHTML
*/
_createHtml(){
var html = `
<div>
<div class="req_batch_success text-success"></div>
<input type="button" class="req_batch_reload btn btn-success btn-xs" value="リロード" style="display:none">
</div>
<div class="req_batch_err text-danger"></div>
<div><progress class="req_batch_prog" max="100" style="display:none">■</progress></div>
<div class="btn-group">
<input type="button" value="停止" class="req_batch_stop_btn btn btn-default btn-xs"/>
<input type="button" value="失敗(0)" class="req_batch_fail_btn btn btn-default btn-xs"/>
</div>
<br>
<div class="req_batch_console console">
<div><span>処理数:</span><span class="req_batch_c_count"></span></div>
<div><span>成功:</span><span class="req_batch_c_success_count">0</span></div>
<div><span>失敗:</span><span class="req_batch_c_fail_count">0</span></div>
<div style="width:100%;font-size:0.8em"><span>メモリチェック:</span><span class="req_batch_c_mem"></span></div>
</div>
<div class="req_batch_fail text-danger" style="display:none"></div>
`;
return html;
}
/**
* リロードボタンクリックイベントを追加
* @param jQuery reloadBtn リロードボタンの要素
*/
_addReloadClickEvent(reloadBtn){
reloadBtn.click((evt)=>{
location.reload(true); // ブラウザをリロード
});
}
/**
* 停止ボタンクリックイベントを追加
* @param jQuery stopBtn 停止ボタンの要素
*/
_addStopClickEvent(stopBtn){
stopBtn.click((evt)=>{
this.stopThread(); // スレッド停止
this.startBtn.show(); // スタートボタンを再表示
});
}
/**
* 失敗ボタンクリックイベントを追加
* @param jQuery failBtn 失敗ボタンの要素
*/
_addFailBtnClickEvent(failBtn){
failBtn.click((evt)=>{
this.failDiv.toggle(300);
});
}
/**
* スレッド | 定期的に呼び出される関数
*/
thread(){
// 非同期処理が終わっている状態(非同期フラグ=0)である場合
if(this.asyn_flg == 0){
this._showCCount(); // 処理数を表示
this._advanceProg(); // 進捗バーを進める
this.ic_start_time = Math.floor($.now()); // 間隔制御・スタートタイム Interval control start time
// すべての処理が終わったら、終了処理を行う
if(this.data_num == this.main_index){
this._endProcessing(); // 終了処理
return;
}
this.asyn_flg = 1; // 非同期処理フラグを非同期処理中にする。
this._asynExe(this.main_index); // 非同期処理を開始
this.main_index ++; // メインインデックスを進める
this._showMemory(); // メモリ情報を表示する
}else{
// 非同期処理がまだ終わっていないなら何もしない
}
}
/**
* 処理数を表示
*/
_showCCount(){
var msg = this.main_index + '/' + this.data_num;
this.cCountDiv.html(msg);
}
/**
* 進捗バーを進める
*/
_advanceProg(){
var v = (this.main_index / this.data_num) * 100;
this.prog.val(v);
}
/**
* 終了処理
*/
_endProcessing(){
this.prog.hide(); // 進捗バーを隠す
this.successDiv.html('すべての処理が終わりました。');
this._showCCount(); // 処理数を表示
this.stopThread(); // スレッドを停止する
this.reloadBtn.show(); // リロードボタンを表示する
// 完了コールバックの呼び出し
if(this.param.complete_cb){
this.param.complete_cb();
}
}
/**
* 非同期処理を開始
* @param int main_index
*/
_asynExe(main_index){
var ent = this.data[main_index];
var sendData = ent;
var send_json = JSON.stringify(sendData);//データをJSON文字列にする。
// AJAX
jQuery.ajax({
type: "POST",
url: this.param.ajax_url,
data: "key1=" + send_json,
cache: false,
dataType: "text",
})
.done((res_json, type) => {
var res;
try{
res =jQuery.parseJSON(res_json);//パース
}catch(e){
this.asyn_flg = 0; // 非同期処理を終了にする
this._addFail(main_index, res_json); // 失敗情報を追加
this._showFailCount(); // 失敗数のカウントと表示
this._checkFailLimit(); // 失敗数が失敗限界数を超えたら強制停止
return;
}
// 非同期処理レスポンスコールバック
if(this.param.asyn_res_cb){
this.param.asyn_res_cb(res);
}
this._successCountAndShow(); // 成功数えと表示
this.asyn_flg = 0; // 非同期処理を終了にする
})
.fail((jqXHR, statusText, errorThrown) => {
this.errDiv.html(jqXHR.responseText);
alert(statusText);
});
}
/**
* 成功数えと表示
*/
_successCountAndShow(){
// 成功数を加算し、成功要素へセットして表示する
this.success_count ++;
this.cSuccessDiv.html(this.success_count);
}
/**
* 失敗情報を失敗区分に追加
* @param string fail_text 失敗テキスト
*/
_addFail(main_index, fail_text){
var html = `
<div style="display:inline-block">
<input type="button" class="btn btn-default btn-xs" value="失敗 ${main_index}" onclick="jQuery('#req_batch_fail${main_index}').toggle(300)">
<div id="req_batch_fail${main_index}" style="display:none">${fail_text}</div>
</div>
`;
this.failDiv.append(html);
}
/**
* 失敗数のカウントと表示
*/
_showFailCount(){
this.fail_count ++;
this.cFailDiv.html(this.fail_count);
// 失敗ボタン名の失敗カウントを更新
var btn_name = "失敗(" + this.fail_count + ")";
this.failBtn.attr('value', btn_name);
}
/**
* 失敗数が失敗限界数を超えたら強制停止
*/
_checkFailLimit(){
if(this.fail_count > this.param.fail_limit){
this.stopThread();
var err_msg = `失敗数が${this.param.fail_limit}回を超えたので処理を中断します。`;
this.errDiv.html(err_msg);
}
}
/**
* スレッドを停止する。
*/
stopThread(){
for(var i in this.handlers){
var h = this.handlers[i];
clearInterval(h); // スレッド停止
}
}
/**
* メモリ情報を表示する
*/
_showMemory(){
if(this.mems == null) return;
var memory = performance.memory;
// var m1 = memory.jsHeapSizeLimit - this.mems.jsHeapSizeLimit1;
// var m2 = memory.totalJSHeapSize - this.mems.totalJSHeapSize1;
var m3 = memory.usedJSHeapSize - this.mems.usedJSHeapSize1;
this.cMemDiv.html(m3);
}
/**
* メモリデータのリセット
* @note Chrome系のみ対応
*/
_resetMemoryData(){
var memory = performance.memory;
if(memory==null) return null;
var mems = {
'jsHeapSizeLimit1':memory['jsHeapSizeLimit'],
'totalJSHeapSize1':memory['totalJSHeapSize'],
'usedJSHeapSize1':memory['usedJSHeapSize'],
}
return mems;
}
}
2019-3-12
画面間におけるローカルストレージの値共有を検証する
ローカルストレージはキーが同じなら複数画面で共有される。
複数ページで共有したくない場合、URLをキーすると良い。
参考:ローカルストレージのキーにURLを用いる
Demo
HTML
<input id="text1" type="text" /><br>
<input type="button" value="ローカルストレージに保存" onclick="save()" class="btn btn-success btn-xs" />
<input type="button" value="ローカルストレージから読取" onclick="read()" class="btn btn-primary btn-xs" />
<div id="res" class="text-success"></div>
<a href="page2.html">ページ2へ(値共有の確認)</a><br>
<br>
JavaScript
function save(){
var text = $('#text1').val();
localStorage.setItem("key1", text);
$('#res').append('ローカルストレージに保存しました。<br>');
}
function read(){
var text = localStorage.getItem("key1");
$('#text1').val(text);
$('#res').append('ローカルストレージから読み取りました。<br>');
}
2019-5-11
ローカルストレージのキーにURLを用いる
Demo
function save2(){
var text = $('#text1').val();
var url = location.href; // 現在ページのURLを取得
var url = url.split(/[?#]/)[0]; // クエリ部分を除去
localStorage.setItem(url, text);
$('#res').append('ローカルストレージに保存しました。【検証2】<br>');
}
function read2(){
var url = location.href; // 現在ページのURLを取得
var url = url.split(/[?#]/)[0]; // クエリ部分を除去
var text = localStorage.getItem(url);
$('#text1').val(text);
$('#res').append('ローカルストレージから読み取りました。【検証2】<br>');
}
2019-5-11
全角を半角に変換する
/**
* 全角を半角に変換する
* @param string str 全角文字
* @return string 半角文字
*/
_toHalfWidth(str) {
return str.replace(/[A-Za-z0-9!-~]/g, (s) => {
return String.fromCharCode(s.charCodeAt(0)-0xFEE0);
});
}
2019-7-27
手入力数値の数値化および入力チェック | 全角数値を半角数値に変換
Demo
/**
* 手入力数値の数値化および入力チェック | 全角数値を半角数値に変換
*
* @note
* 負数にも対応するが全角ハイフン「-」には対応しない。半角ハイフンのみ。
* 小数値にも対応。
*
* @param mixed num_text 数値テキスト
* @param bool req 必須チェックフラグ true(デフォ):必須
* @return int 数値 or エラー文字列
*/
function _numericizeAndCheck(num_text, req){
if(req==null) req = true; // 必須チェックフラグ
// 空文字判定
if(num_text == null || num_text === '' || num_text === false){
if(req == true){
return "必須入力です。";
}else{
return 0;
}
}
num_text += ''; // 文字列扱いにする
// 全角を半角にする
num_text = num_text.replace(/[A-Za-z0-9!-~]/g, (s) => {
return String.fromCharCode(s.charCodeAt(0)-0xFEE0);
});
num_text = num_text.trim();
// 整形後の空文字判定
if(num_text === ''){
if(req == true){
return "必須入力です。";
}else{
return 0;
}
}
if(isNaN(num_text)){
return "数値を入力してください。";
return;
}
num_text = num_text * 1; // 数値化する
return num_text;
}
2019-8-8
移動範囲を要素内に限定したドラッグ | jQuery UI Draggable
Demo
HTML
<div id="test1" style="width:640px;height:480px;background-color:#BECDA9">
<div id="test2" style="width:64px;height:48px;background-color:#DC8490">Drag</div>
</div>
JavaScript
jQuery( ()=> {
jQuery( '#test2' ).draggable( {
containment: '#test1',
scroll: false,
} );
} );
2019-9-17
小数点以下の桁数を固定する | n.toFixed(4)
「n.toFixed(x)」で取得される値は
文字列 になるので注意すること。
let n = 123.456;
let str = n.toFixed(4); // →123.4560
let n2 = 123;
let str2 = n2.toFixed(4); //→ 123.0000
let n3 = 123.456789;
let str3 = n3.toFixed(4); //→ 123.4568 (四捨五入で丸められる)
2019-12-1
金額3桁カンマ区切り | Number(value).toLocaleString();
let value = 1000;
value = Number(value).toLocaleString(); // 1,000
2020-2-21
QRコード作成 | jQuery.qrcode.js
「jQuery.qrcode.js」ライブラリによりQRコードの作成が可能。
GitHub⇒jQuery.qrcode.jsの入手先
ソースコード
HTML
<div id="output"></div>
JavaScript
jQuery('#output').qrcode({
width:100,
height:100,
text: "http://amaraimusi.sakura.ne.jp/",
});
Demo
2020-8-11
Div要素内のコンテンツを画像化する | html2canvas.js
Demo
公式
html2canvas.jsはDIV要素のコンテンツをキャプチャーして画像化することができる。
2020年の8月のバージョンでは、ブラウザのスクロールによってキャプチャー範囲がずれこむという問題がある。
なのでスクロールをリセットしたり、scrollX,scrollYで細かな位置調整を施す必要がある。
HTML
<script src="html2canvas.min.js"></script>
~ 略 ~
<input type="botton" value="TEST0" class="btn btn-success" onclick="test0()"/>
<input type="botton" value="画像化する" class="btn btn-success" onclick="test1()"/>
<div id="div1" style="display:block;border:1px solid #19a15f;width:600px;" >
<p>サンプルDiv要素</p><br>
<img src="imori.jpg" alt="" style="width:550px"/>
<div style="padding:20px;">
では,当時生み出していたのはどんな実でしたか。
皆さんが今では恥じている事柄です。それらの行き着く先は死です。
しかし,今や皆さんは罪から自由にされて神の奴隷になったので,神聖な生き方という実を生み出しています。
行き着く先は永遠の命です。 23 罪の代償は死ですが,神が与える贈り物は,私たちの主であるキリスト・イエスによる永遠の命なのです。
</div>
<br><time>2020-1-1</time>
</div>
<div style="padding:20px;background-color:#e2e1e0">
画像<br>
<img id="img1" />
</div>
JavaScript
// 検証0
function test0(){
window.scrollTo(0, 0); // スクロールをリセット
html2canvas(document.querySelector("#div1")).then(canvas => {
document.body.appendChild(canvas)
});
}
// 検証1
function test1(){
window.scrollTo(0, 0); // スクロールをリセットする必要がある。
let targetElm = jQuery("#div1");
let w = targetElm.outerWidth();
let h = targetElm.outerHeight();
html2canvas(targetElm[0],{width:w,height:h,scrollX:-8.5,scrollY:0}).then(canvas => {
let imgElm = jQuery('#img1');
imgElm.width(w);
imgElm.height(h);
imgElm[0].src = canvas.toDataURL("image/png");
});
}
2020-8-21
xxx
2019-3-12
ホーム
プログラミングの覚書
JavaScriptの覚書
JavaScriptの覚書