return function | 無名関数を返す

無名関数を返す特殊なソースコード。
GOFのコマンドパターンで使うことがあるかもしれない。
この記述方法は海外のJSライブラリにて見かける。

	$(function(){
		test1()();

	});
	function test1(){
		return function(){
			var text = "Hello World!";
			alert(text);
		}
	}
	


CakePHPのユーザー認証状態をAjaxで取得する

CakePHPで作られたシステムの認証状態を、Ajaxで確認するサンプル。
認証中ならユーザー名と権限を取得する。

クライアント側 (JavaScript)


	
	$.ajax({
		type: "GET",
		url: "/animal/auth_check/ajax_auth_check",
		cache: false,
		dataType: "text",
		success: function(str_json, type) {

			if(str_json == 'none'){
				console.log('未認証です');
			}else{

				try{
					var data=$.parseJSON(str_json);
					console.log(data);

				}catch(e){
					alert('エラー');
				}
			}

		},
		error: function(xmlHttpRequest, textStatus, errorThrown){
			console.log(xmlHttpRequest.responseText);
			alert(textStatus);
		}
	});
	
	

サーバー側( CakePHP側)


	<?php
	App::uses('AppController', 'Controller');
	
	class AuthCheckController extends AppController {
		public $name = 'AuthCheck';
		
		public function beforeFilter() {
			$this->Auth->allow(); // 認証と未認証の両方に対応したページする。
			parent::beforeFilter();//基本クラスのメソッドを呼び出し。
		}
		
		public function ajax_auth_check() {
			$this->autoRender = false;
			
			if(!empty($this->Auth->user('id'))){
				
				$data=[
					'username'=>$this->Auth->user('username'),
					'role'=>$this->Auth->user('role'),
					];
				$json_str=json_encode($data);
				echo $json_str;
			}else{
				echo 'none';
			}
		}
	
	}
	

コンソール出力

	Object {username: "kabutomusi", role: "admin"}



編集モードと一般モードの切替関数

編集モードと一般モードに関する機能である。
この機能はedit_or_public関数として用意され、編集モードと一般モードの切替を一括管理する。
jQueryを必要とする。

サンプル

挙動

edit_or_public関数に引数を渡して呼び出すだけで、編集モードと一般モードが切り替わる。
引数はmodeである。"0"は一般モード、"1"は編集モードである。

実装について

実装は、切替対象の要素のclass属性に、edit_only,public_onlyを追加するだけである。
edit_onlyにすると編集モードのときにしか表示されない。public_onlyなら一般モードのみである。

編集モードと一般モードの切替関数


	/**
	 * 編集モードと一般モードの切替関数
	 * 
	 * @note
	 * 編集モードと一般モードに関する機能である。
	 * この機能はedit_or_public関数として用意され、編集モードと一般モードの切替を一括管理する。
	 * 
	 * @param bool flg 0:一般モード  1:編集モード
	 * @date 2016-9-9
	 * 
	 */
	function edit_or_public(flg){
		if(flg =='' || flg==null){
			$('.public_only').show();
			$('.edit_only').hide();
			
		}else{
			$('.public_only').hide();
			$('.edit_only').show();
			
		}
	}
	

使用例

	<input type="text" class="edit_only" value="Hello world" />
	<div class="public_only" style="display:none">Hello world</div>
	<hr>
	<input type="button" class="btn-primary" value="Public Mode" onclick="edit_or_public(0)" />
	<input type="button" class="btn-primary" value="Edit Mode" onclick="edit_or_public(1)" />
	



アップロードファイル要素のクリア(リセット)

ファイルアップロード要素にセットされたファイルを取り消すことができる。
方法はファイルアップロード要素の値に空文字をセットするだけである。
ただし、空文字をセットした際、changeイベントが発生することがあるので注意すること。

IEだとエラーが起こる可能性がある。(2016/10時点ではリセット可能。ただしchangeイベントが発生。)

ソースコード

	<input id="file1" type="file"  multiple />
	
	try {
		$('#file1').val("");// changeイベントが発生するので注意
	} catch (e) {
		console.log('It can not be reset in IE ');
	}	
	



class属性またはname属性からフィールド名を取得する




	/**
	* class属性またはname属性からフィールド名を取得する
	* 
	* @note
	* class属性が複数である場合、先頭のclass属性を取得する
	*
	* @parma elm 入力要素オブジェクト
	* @return フィールド名
	*/
	function getFieldByClassOrName(elm){
		
		var field = elm.attr('name');
		if(!field){
			field = elm.attr('class');
		}
		
		if(!field){
			return field;
		}
		
		field = field.trim();
		var a = field.indexOf(' ');
		if(a != -1){
			field = field.substr(0,field.length - a);
		}
	
		return field;
		
	}
	




非同期で実行する | setTimeout


	$(()=>{
		var testClass = new TestClass();
		testClass.execute("いろは");
	});
	
	
	class TestClass{
		
		execute(value){
			setTimeout(this.test1, 1000, value);
		}
		
		test1(value){
			alert(value);
		}
	}
	

旧記述

setTimeout関数で非同期処理を実現できる。

JavaScriptの非同期処理は並列処理と同じではないので注意。
参考:バックグランドの並列処理 | WebWorkerの使い方


	window.setTimeout(function(){
		console.log('非同期処理');
	}, 1);
	



setTimeoutをキャンセルする | clearTimeout

DEMO

HTML

	<input type="button" value="setTimeout 開始" class="btn btn-primary" onclick="start()" /><br>
	<input type="button" value="setTimeout キャンセル" class="btn btn-danger" onclick="cancel()" /><br>
	<div id="res1"></div>
	

JavaScript

		var handle;
		function start(){
			handle = setTimeout(()=>{
				$("#res1").append('setTimeout実行<br>');
			}, 2000);
		}
		function cancel(){
			$("#res1").append('キャンセル<br>');
			clearTimeout(handle);
		}
	



文字列を日時にパース

サンプル

ソースコード

	var str_dtm = "2016-10-18 16:28:50";
	if(str_dtm.indexOf('-') > -1){
		str_dtm = str_dtm.replace('-','/');// IEは「-」の区分に対応していないので「/」に置換
	}
	console.log(typeof str_dtm);
	
	var d = new Date(str_dtm);
	console.log(typeof d);
	console.log(d.toLocaleString());
	

コンソール出力
	string
	object
	2016/10/18 16:28:50
	



スネーク記法をキャメル記法に変換する


	/**
	 * スネーク記法をキャメル記法に変換する
	 * (例) big_cat_test → BigCatTest
	 */
	function snakeToCamel(str){
		//_+小文字を大文字にする(例:_a を A)
		str = str.replace(/_./g,
			function(s) {
				return s.charAt(1).toUpperCase();
			}
		);

		// 先頭を大文字化する
		str = str.charAt(0).toUpperCase() + str.slice(1);
		
		return str;
	};
	

参考



キャメル記法をスネーク記法に変換する


	/**
	 * キャメル記法をスネーク記法に変換する
	 (例) BigCatTest → big_cat_test
	 */
	function camelToSnake(str){
		// 先頭を小文字かする
		str = str.charAt(0).toLowerCase() + str.slice(1);
		
		//大文字を_+小文字にする(例:A を _a)
		str = str.replace(/([A-Z])/g,
			function(s) {
				return '_' + s.charAt(0).toLowerCase();
			}
		);

		return str;
	};	
	



テーブル名からモデル名を作成


	/**
	 * テーブル名からモデル名に変換する
	 * (例) big_cat_tests → BigCatTest
	 */
	_tblNameToModelName(str){
		if(str=='' || str==null) return '';
		
		//_+小文字を大文字にする(例:_a を A)
		str = str.replace(/_./g,
			function(s) {
				return s.charAt(1).toUpperCase();
			}
		);

		// 先頭を大文字化する
		str = str.charAt(0).toUpperCase() + str.slice(1);
		
		// 末尾が「s」なら削る
		var e1 = str.slice(-1);
		if(e1 == 's'){
			str =str.substr(0,str.length-1);
		}
		
		return str;
	}
	


モデル名からテーブル名を作成する


	/**
	 * モデル名からテーブル名を作成する
	 (例) BigCatTest → big_cat_tests
	 */
	_modelNameToTblName(str){
		if(str=='' || str==null) return '';
		// 先頭を小文字かする
		str = str.charAt(0).toLowerCase() + str.slice(1);
		
		//大文字を_+小文字にする(例:A を _a)
		str = str.replace(/([A-Z])/g,
			function(s) {
				return '_' + s.charAt(0).toLowerCase();
			}
		);
		
		str += 's';

		return str;
	}