_$if.fn(関数)(引数)を渡して実行
//関数かどうかをチェックして実行
_$if.fn(関数)(引数);

let $newfunc = _$if.fn(関数);
$newfunc(引数);

/* 関数と配列入れて実行  */
_$if.fn(function(x,y){return x + y})([1,2]);

/* 関数と引数を入れて実行  */
_$if.fn(function(ary){return ary.join(' ');})(1,2);

/* 関数と配列入れて実行  */
_$if.fn(function(){return console.log('no arguments!');})();


//関数型プログラミング 2-3p の両方を合体したもの!


htmlToNode(str):html文字列をElementに変換
htmlToNode('html文字列') = $_('html文字列')でも動作
htmlToNodes(str):html文字列をNodeListに変換(使い道ある?)

余計なdivを生成してしまう。。

//CODE
htmlToNode('<div style="width: 300px;"></div>');

//
if (!str || typeof str !== 'string') return;
let $new = document.createElement('div');
$new.innerHTML = str;
return $new.firstElementChild;

//これだとNodeListを返すので使いものにならない
return $new.childNodes;

//これも使える:.firstElementChildとの違いがよくわからない。
//入れ子htmlタグの文字列で試してみたけど、どちらでも機能した!
return $new.firstChild;

//注意点:以下のように並列的なNODE文字列だと最初のNODEしか反映されない
let $html = '<div id="hogege" class="red"><p>レッド</p></div><div id="fugafuga" class="blue"><p>ブルー</p></div>';

//並列的な文字列を使う必要がある場合は、htmlToNodesを使ってループ利用する
return $new.childNodes;


nodToHTML:Elementをhtml文字列に変換

html文字列 -> ノードに変換 -> class等追加 ->html文字列に戻す

テンプレート文字列に動的にclass等を追加するケースを想定

//CODE
function nodToHTML(node) {
	if (!node || !node.nodeName) return;
	let $new = document.createElement('div');
	$new.appendChild(node);
 return $new.innerHTML;
};

//isNode:Nodeかどうか
//Nodeかどうかの確認
function isNode(node) {
  return !!(node && node.nodeName);
}
//isNodes:NodeListかどうか
//Node Listかどうかの確認
function isNodes(node) {
  return !!(node && Object.prototype.toString.call(node) === "[object NodeList]");
}
//以下では判定できないケースがあった。selectタグ
return !!(node && typeof node.item === 'function');

isTpl(tpl)//templateかどうか
//変数がtemplateかどうかの確認
function isTpl(tpl) {
  return !!(tpl && typeof tpl === 'string' && tpl.includes('<%=') && (tpl.match(/<%=/g) || []).length == (tpl.match(/%>/g) || []).length);
}
//特定文字が含まれているかどうか
tpl.includes('<%=')

//特定文字の回数
(tpl.match(/<%=/g)||[]).length

//isMatch(arr1, arr2): 二つの配列を比較して 一致したものがあるかどうか?
//CODE


MatchAry(arr1, arr2):// 二つの配列を比較して 一致したものを新しい配列にする
//CODE


$x$(連想配列,連想配列,連想配列) -> :連想配列をひとつにまとめる
.concatメソッド:配列をひとつにまとめる

//連想配列(Associative array)->擬似的な連想配列:オブジェクト
var hoge = {}; または var hoge = new Object();
//連想配列に値を追加する
hoge ['フー'] = 'foo';
hoge ['バー'] = 'bar';
hoge ['ピヨ'] = 'piyo';

var nja_mrg = function () {
	// Variables
	var extended = {};
	var deep = false;
	var i = 0;
	var length = arguments.length;
	// Check if a deep merge
	if ( Object.prototype.toString.call( arguments[0] ) === '[object Boolean]' ) {
		deep = arguments[0];
		i++;
	}
	// Merge the object into the extended object
	var merge = function (obj) {
		for ( var prop in obj ) {
			if ( Object.prototype.hasOwnProperty.call( obj, prop ) ) {
				// If deep merge and property is an object, merge properties
				if ( deep && Object.prototype.toString.call(obj[prop]) === '[object Object]' ) {
					extended[prop] = extend( true, extended[prop], obj[prop] );
				} else {
					extended[prop] = obj[prop];
				}
			}
		}
	};
	// Loop through each object and conduct a merge
	for ( ; i < length; i++ ) {
		var obj = arguments[i];
		merge(obj);
	}
	return extended;
};
window.$x$ = nja_mrg;


//
var $hogeaary = {'ringo':'りんご','banana':'ばなな'}
var $fugaaary = {'ringo':'リンゴ','chary':'さくらんぼ'}

console.log($x$($hogeaary,$fugaaary));


throttle:イベント間引き処理

throttleは、連続した処理の中で、指定した間隔(今回のプラグインだと遅延ミリ秒ごと)の最初に1回実行し,指定の間引き時間を上回るときと、最後の1回が実行されます。


var r = document.getElementById('r')

function insertHello() {
  r.textContent += 'hello! '
}

function throttle(fn, delay) {
  let timerId;
  let lastExecTime = 0;
  return () => {
    const context = this;
    const args = arguments;
    let elapsedTime = performance.now() - lastExecTime;
    const execute = () => {
      fn.apply(context, args);
      lastExecTime = performance.now();
    }
    if (!timerId) {
      execute();
    }
    if (timerId) {
      clearTimeout(timerId);
    }
    if (elapsedTime > delay) {
      execute();
    } else {
      timerId = setTimeout(execute, delay);
    }
  }
}
var hello = throttle(insertHello, 1000)
window.addEventListener('scroll', hello)

debounce:イベント間引き処理

debounceは、イベントなどが繰り返し呼び出されると、呼び出しの「束(指定した時間)」内の最後に1回だけイベントハンドラー(コールバック処理)を実行します。


var l = document.getElementById('l')

function insertMorning() {
  l.textContent += 'Morning! '
}

function debounce(fn, interval) {
  let timerId;
  return () => {
    clearTimeout(timerId);
    const context = this;
    const args = arguments;
    timerId = setTimeout(() => {
      fn.apply(context, args);
    }, interval);
  }
}

var hello = debounce(insertHello, 1000)
window.addEventListener('scroll', hello)

ノード位置までスクロール:_$fn.scroll(ノード)
//CODE
_$fn.scroll = function(el,op) {
  if(!op) op = -(window.innerHeight/5);
  el.scrollIntoView(true);
  window.scrollBy({ top: op, behavior: 'smooth'});
}

//オプションには、-(window.innerHeight/2) とかで位置をコントロールする。


以下、未整理
要素の位置情報・制御


//要素を画面の中央に配置
//要素が画面より大きい場合は?
$.fn.mannaka()

//配列に要素の位置データを追加
//optionsは、利用する配列データがあれば、それにデータを追加する
$(要素).getGrid(options)

//これを都度、計測するのは負荷じゃね?
op.ww //windows幅
op.wh //windows高さ
op.wl //windows座標:左上X
op.wt //windows座標:左上Y
op.wr //windows座標:右上X
op.wb //windows座標:右下Y
op.wx //windows中央座標:X
op.wy //windows中央座標:Y

//以下が出ればいいよな気が・・。
op.l //要素座標:l X
op.r //要素座標:r X
op.t //要素座標:t Y
op.b //要素座標:b Y

op.h //要素の高さ
op.w //要素の幅
op.x //要素の中央X
op.y //要素の中央Y

//getGridで取得した要素を指定した余白で囲う
//opにgetGridで得たデータが入っていることが必須
$.fn.paddingGrid(op,$padding)

//最適な位置を得る。
$.fn.setposi(op,mode)



ここからヘルパー関数
JSON: nja_.helper_json.js


isJSON(item) //json判定
cntJSON($json) //json個数
//movabletypeのjson処理をサポート
repJSON(s)

//json判定BOXを生成
$(任意要素).jsonCHK {
  debug: false,
  done: null,
  error: null
};
//jsonからバーを生成
$(任意要素).jsonBar(json);


コードの自動エスケープ

$(親要素).codeESCAPE();で指定する。

//bodyで指定済
$(body).codeESCAPE();


ここにコード記述
でエスケープされる。 //htmlの場合・class="html" に を付与する。

ここにコード記述
//※html以外の場合はclass不要 > < の置換が避けられない //コード表示のhighlightは、highlight.js ver9.18を採用 //ver10以降は、IE11に対応していないため //highlight.jsのデザインCSSを読み込み //highlight.jsの読み込みと実行

//class="html" なしなら > < の記述OK!