ファイル存在チェック

jQueryの$.ajaxを利用してファイル存在チェックが可能である。
弱点としてファイルが存在しない場合、コンソールに警告やエラーが表示されてしまうことである。
また、HTTPリクエストを介する仕様なので当然処理には時間がかかる。

デモ

下記にコールバック型と同期型の存在チェックを用意。

存在チェック【コールバック型】


	<input type="button" value="存在チェック【コールバック型】" onclick="test1('imori.jpg')" />
	
	<script>
	function test1(fp){
		is_file(fp,function(res){
			if(res==true){
				alert('ファイルは存在します');
			}else{
				alert('ファイルは存在しません');
			}
		});
	}
	
	/**
	 * ファイル存在チェック
	 * @param fp ファイルパス
	 * @param callback チェック後に呼び出されるコールバック
	 */
	function is_file(fp,callback){
		$.ajax({
			url: fp,
			cache: false
		}).done(function(data) {
			callback(true);
		})
		.fail(function(jqXHR, textStatus, errorThrown) {
			callback(false);
		});
	}
	</script>
	

存在チェック【同期型】


	<input type="button" value="存在チェック【同期型】" onclick="test2('imori.jpg')" />
	
	<script>
	function test2(fp){
		var flg = is_file2(fp);
		if(flg==true){
			alert('ファイルは存在します');
		}else{
			alert('ファイルは存在しません');
		}
	}
	
	/**
	 * ファイル存在チェック
	 * @param fp ファイルパス
	 */
	function is_file2(fp){
		var flg=null;
		$.ajax({
			url: fp,
			cache: false,
			async:false
		}).done(function(data) {
			flg=true;
		})
		.fail(function(jqXHR, textStatus, errorThrown) {
			flg=false;
		});
		return flg;
	}
	</script>
	

文字列を末尾から置換する


	var str = "thum/x/thum/neko.png";
	str = replace_rev(str,'thum','cat');
	console.log(str);// → thum/x/cat/neko.png
	
	/**
	* 文字列を末尾から検索して置換する
	* @param $search  検索文字列
	* @param $replace 置換文字列
	* @param $subject 対象文字列
	* @return 置換後の文字列
	*/
	function replace_rev(str,substr,newSubstr){
		var lIndex  = str.lastIndexOf(substr);
		str = str.substring(0, lIndex) + newSubstr + str.substr(lIndex + substr.length);
		return str;
	}
	

一意値(ユニーク値)を取得する

	/**
	 * 一意値(ユニーク値)を取得する
	 * @param myStrong 乱数の桁(省略可)
	 * @returns 一意コード
	 */
	function _getUniqueStr(myStrong){
		 var strong = 1000;
		 if (myStrong) strong = myStrong;
		 return new Date().getTime().toString(16)  + Math.floor(strong*Math.random()).toString(16)
	}
	
解説サイト

番号版


	/**
	 * 一意番号(ユニーク値)を取得する。番号版。
	 * @param myStrong 乱数の桁(省略可)
	 * @returns 一意番号	15桁くらい
	 */
	_getUniqueNo(myStrong){
		 var strong = 1000;
		 if (myStrong) strong = myStrong;
		 let a = new Date().getTime();
		 let b = Math.floor(strong*Math.random());
		 let u = a + '' + b;
		 return u;
	}
	


関数の存在チェック


	<script>
	if(typeof func_a == 'function') {
	    console.log('関数は存在する');
	} else {
	    console.log('関数は存在しない');
	}
	function func_a(){
		// ....
	}
	</script>
	


文字列の関数名を実行する(evalを使わない)


	<script>
	function func_a(v1){
		return '猫の名前は' + v1 + 'です';
	}
	
	var neko = 'ビッグマン';
	var res = window['func_a'](neko);
	console.log(res);// → 猫の名前はビッグマンです
	</script>
	


evalを文字列の関数名を実行する


	<script>
	function func_a(v1){
		console.log(v1);
		return '猫の名前は' + v1 + 'です';
	}
	
	var neko = 'ビッグマン';
	//var res = eval("func_a('" + neko + "')");
	var res = eval("func_a(neko)");
	alert(res); // → 猫の名前はビッグマンです
	</script>
	

evalで実行する関数の引数がオブジェクトである場合


	<script>
	function func_a(v1){
		console.log(v1);
		alert(JSON.stringify(v1));
	}
	
	var data1 = {'a':123,'b':4567};
	eval("func_a(data1)");
	
	// 別の方法
	// var json_str = JSON.stringify(data1);
	// eval("func_a(" + json_str + ")");
	</script>
	

データのグループ化


	/**
	 * データのグループ化
	 *
	 * @note
	 * データをグループフィールドでグループ分けする。
	 * グループ分けすることにより最初の2次元構造から3次元構造に変換される。
	 *
	 * @param array data データ(2次元構造、エンティティの配列)
	 * @param array group_field グループフィールド
	 * @return グループ化したデータ(3次元構造)
	 */
	function _dataGrouping(data,group_field){
	
		data2 = {};
	
		for(var i in data){
			
			var ent = data[i];
			var group_value = ent[group_field];
			
			if(_empty(data2[group_value])){
				data2[group_value] = [];
			}
			data2[group_value].push(ent);
		}
	
		return data2;
	}
	
使い方はPHP版グループ化と同様である。


文字列の関数名が存在するかチェックする | evalは使わない

「 window['関数名'](引数) 」で文字列の関数名を実行可能である。

	<script>
	function func_a(v1){
		return '猫の名前は' + v1 + 'です';
	}
	
	// 関数名'func_a'が存在するかチェックする。
	if(typeof window['func_a'] == 'function'){
		var neko = 'ビッグマン';
		var res = window['func_a'](neko);
		console.log(res);// → 猫の名前はビッグマンです
	}else{
		console.log('存在しない関数です。');
	}
	</script>
	

ImportFu.js | インポートに特化したファイルアップロード

ファイル要素のデザインと機能を拡張する。
Ajaxによるファイル送信を行える。
ドラッグ&ドロップに対応している。

デモ ImportFu.js

サンプル

html/javascript


	<script src="jquery-1.11.1.min.js"></script>
	<script src="ImportFu.js"></script>
	<script>
	$(function(){
		var importFu = new ImportFu({
			'fu_slt':'#file1',
			'ajax_url':'upload.php',
		});
		
	});
	</script>

	<!-- 略 -->

	<input type="file" id="file1" />
	


SELECTにサイズ(size属性)をセットしたとき、スクロールを選択中の位置へ

セレクト要素のsize属性を変更したとき、スクロール位置が先頭に移動してしまう。
下側あたりを選択している場合、スクロールアウトが起きてしまい不便である。
下記関数である程度改善できるが、スクロールの細かな調整はできていない。

デモ

JS

	
	var select1 = $('#select1');
	_setSizeToSelect(select1,5);
	
	
	/**
	 * セレクトボックスにサイズをセット
	 * 
	 * @note
	 * スクロールの位置調整も行う
	 * 
	 * @param selElm セレクトボックス
	 * @param select_size セレクトのサイズ
	 */
	function _setSizeToSelect(selElm,select_size){
		selElm.attr('size',select_size);
	
		// 現在の選択位置へスクロールする
		selElm.each(function(){
			var elm = jQuery(this);
			elm[0].selectedIndex = elm[0].selectedIndex;// 裏ワザ的なスクロール移動。良い方法とは言えないので別の方法を検討したい。

		});

	}
	

HTML
	<select  id="select1" >
		<option value="1">ニッポンマイマイ</option>
		<option value="2">カワザンショウガイ</option>
		<option value="3">バカガイ</option>
		<option value="4">トウガタカワニナ</option>
		<option value="5">サワガニ</option>
		<option value="6">キヌタアゲマキ</option>
		<option value="7">ニッコウガイ</option>
		<option value="8">ムシオイガイ</option>
		<option value="9">オオノガイ</option>
		<option value="10">カワザンショウガイ</option>
		<option value="11">オキナガイ</option>
		<option value="12">スナガニ</option>
		<option value="13">サワガニ</option>
		<option value="14" selected>マテガイ</option>
		<option value="15">チトセノハナガイ</option>
		<option value="16">マルスダレガイ</option>
		<option value="17">カワザンショウガイ</option>
		<option value="18">オカミミガイ</option>
		<option value="19">アサジガイ</option>
		<option value="20">トウガタガイ</option>
		<option value="21">イタヤガイ</option>
		<option value="22">サワガニ</option>
		<option value="23">ベッコウマイマイ</option>
		<option value="24">サワガニ</option>
		<option value="25">ニッコウガイ</option>
		<option value="26">ゴマガイ</option>
		<option value="27">シオサザナミ</option>
		<option value="28">ヌマエビ</option>
	</select>