_$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!