_$ ->jQueryもどき
_$(ほげ).:組み込み関数
_$:のプラグイン雛形
$_::要素生成関数
その他
QRコード
_$(セレクター)
- -> 原則として複数要素をターゲットにした関数とする
- -> 単数ターゲットは、_$fn.ホゲ関数(argument)(nodeまたはセレクター)形式に置き換える(foreachを使わない分高速化するから)
- -> getIDとか.. <- 必要なくない(idで探す必要がなくなってきた) setIDにおきかえる?必要ある?
- ->
--------- jqueryとの違い --------------
$(selector,context)のような第2引数がない
その代わり複数のNodeを、複数引数で使えるようにした
--------- メソッドを限定 --------------
nodeの挿入や削除、属性変更に特化
_$()
その1::テキスト指定のセレクター
てすと
//その1::テキスト指定のセレクターOK!
_$(要素)
_$('#hoge')
_$('.hoge')
//USE
_$('#testmja').addClass('d-inline-block blue text-white m-3 p-3');
その2::テキスト指定の複数セレクター:テキストのカンマ区切り:idとクラスを混在OK!
てすと
てすと
てすと
てすと
てすと
てすと
//その2::複数セレクター:テキストのカンマ区切り
_$('#njats2,#njats3,#njats4,#njats5,#njats6')
//idとクラスを混在で指定
_$('#chk1,#chk2,#chk3,.chkcls').addClass('d-inline-block m-2 p-2 red text-white');
その3::vanilla jsのセレクタOK
vanilla jsのセレクタOK(クリック)
てすと
てすと
てすと
//vanilla jsの単数セレクタOK
let $vnla = document.getElementById('testvnla');
_$($vnla)
//vanilla jsの複数セレクタもOK
let $qall = document.querySelectorAll('.qallitm');
_$($qall)
//jqueryでもOK
//セレクターの複数指定(区切り指定)
//セレクターが全て単数ならOK!複数が混ざってるならエラー
let $vnla2 = document.getElementById('testvnla2');
_$($vnla,$vnla2).append('✨');
_$($vnla,$qall).append('✨'); //エラー!!
その3::ノードOK!
てすと
てすと
//ノードOK!
// _$($_({tag:'p'},'hoge'))
//ノードのカンマ区切りOK!
var lay0 = $_({class:"fuga"},'○');
var lay1 = $_({class:"fuga"},'●');
_$(lay0,lay1).addClass('m-3 d-inline-block');
//jqueryでは、複数ノードはNG:最初のひとつだけに適用
その4::混在は完全にはサポートしてない
てすと
てすと
//引数の混在 -> 部分的にOK
_$(lay0,"#ura").addClass('m-3 d-inline-block');
//ノードセレクタの場合挿入後に別の要素に挿入すると移動する。
_$('#testmja').append(lay0);
_$($vnla).append(lay0);
_$('#testmja').append(lay1);
:拡張セレクタ
_$().nextAll //指定要素内の後ろの(selectorに該当する)兄弟要素全て
その1その2その3その4その5
_$('#njatss01').nextAll().addClass('bg-line d-inline-block m-2');
_$().beforeAll //指定要素内の後ろの(selectorに該当する)兄弟要素全て
その1その2その3その4その5
_$('#njatss02').beforeAll().addClass('bg-line d-inline-block m-2');
参考
改良のための参考:jqueryっぽいヘルパ関数
改良のための参考:jqueryっぽいおれおれ関数
改良のための参考:jQueryプラグインにメソッド
補足:in演算子の使い方
//in演算子
// Arrays
let trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
0 in trees // true を返す
3 in trees // true を返す
6 in trees // false を返す
'bay' in trees // false を返す (インデックスの指す値ではなく、インデックスの数字を指定しなければならない)
'length' in trees // true を返す (length は Array のプロパティ)
_$(ほげ).:組み込み関数
on関数: on('イベントタイプ',fun,{once:true})
ここをクリック
//指定要素を削除し、nullを入れてキャッシュクリア
_$('#njats0').on('click',function(){
_$('#njats0').addClass('red text-white p-3 d-inline-block');
},{once:true});
//,{once:true}で一度だけ発火
削除関数=メモリもクリア!
クリックすると削除される
//指定要素を削除し、nullを入れてキャッシュクリア
_$(ほげ).dell();
_$('#njats6').on('click',function(){
_$('#njats6').dell();
});
挿入関数
append/rc
//指定要素内の後ろに追加
_$(ほげ).append('追加するNODE');
_$('#njats1').append($_({tag:'span', class:'d-inline-block'},'●'));
_$('#njats1').append('○');
_$('#njats1').append('あ');
//できないと思ってたけど、jqueryでもノードの追加できた・・
prepend
//指定要素内の最初に追加
_$(ほげ).prepend('追加するNODE');
after
//指定要素の後ろに追加
_$(ほげ).after('追加するNODE');
before/css/rc
//指定要素の前に追加
_$(ほげ).before('追加するNODE');
wrap(node)/attr
//指定要素をNODEでラップする
_$(ほげ).wrap('ラップするNODE');
wrap(string)
//指定要素をラップする(html直記述)
_$(ほげ).wrap('<div class=""></div>');
wrap(template)::<%=raw self%> 必須!
//指定要素をラップする(テンプレート使用)
let $tpl = '<div id="<%=id%>" class="<%=clss%>"><%=raw self%></div>';
let $data = {
id: "reingo",
clss: "d-inline-block red text-white p-2 rounded",
}
_$(ほげ).wrap($tpl, $data);
_$().unwrap();
//指定要素の親を削除
クラス・属性操作
ホゲホゲ
//指定要素にclassを追加
_$(ほげ).addClass('hoge fuga');
_$('#njaclts1').addClass('d-inline-block');
ホゲホゲ
//指定要素のclassを削除
_$(ほげ).removeClass('hoge fuga');
_$('#njaclts2').removeClass('p-2');
ホゲホゲ
//指定要素にstyleを追加
_$(ほげ).css({widht:100px, height:50px});
//指定要素のstyle削除
_$(ほげ).css();
//配列で複数指定する場合
_$('#njaclts3').css({width:'300px', height:'80px'});
ホゲホゲ
//指定要素に属性を追加
_$(ほげ).attr("data-type","hoge");
_$('#njaclts4').attr("data-type","hoge");
クラスを配列(連想配列(val))で探す、一致したものを削除する、何かする
//配列(連想配列(val))に一致するクラスを返す
//配列に一致するクラスを取得,存在する場合は,$act実行!
//$act(ほげ) (_$(ほげ)が複数の場合、それぞれが引数に入って実行!)
_$(ほげ).aryClass($arr,$act);
//一致するclassを削除!
_$(ほげ).aryClass($arr,'remove');
var arytesary1 = ['h3-responsive','my-5'];
var arytesary2 = ['h4-responsive','my-6'];
var arytesobj3 = { head:'h4-responsive',margin:'my-3' };
//一致するものがある場合、配列で返す。なければNULL
console.log(_$('#aryclass').aryClass(arytesary1));
console.log(_$('#aryclass').aryClass(arytesary2));
console.log(_$('#aryclass').aryClass(arytesobj3));
//必要ない?
属性値を連想配列で一致しているものがあるか調べる?
//data属性系の操作をなんかする?ヘルパー関数を作る
属性値を配列で探す
//配列に一致する属性値を返す
//属性値が、配列に一致する場合は,$act実行!
_$(ほげ).aryAttr($atr,$arr,$act)
//以下、_$(ほげ)が単数の場合を想定、複数の場合の挙動をどうする?
_$(ほげ).getID();idを取得(ない場合は設定して返す)
//IDを返す
_$(ほげ).getID();
_$(ほげ).iscss('position'); styleプロパティを取得
//kunaiでposition: fixed要素を判別するために使用
if(_$(el).iscss('position') == 'fixed') {
$g = _$(el).getGrid(op.padding,'fixed');
$matoclass = 'mato fix ' + op.color;
} else {
・・・・
_$:のプラグイン雛形
_$.fn.ほげほげ = function(options) {
//タイプでオプションを分岐する場合
let $type = (!options||!options.type)?_$.fn.ほげほげ.config.type:options.type;
//オプションをマージする
let $this = this, $op = $x$(_$.fn.ほげほげ.config,_$.fn.ほげほげ[$type],options);
function $set(op) {
return function(el) {
return ;
};
}
$this.forEach(function(el) {
$set($op)(el);
});
return $this;
};
_$.fn.ほげほげ.config = {
type: "atype",
}
_$.fn.ほげほげ.atype = {
}
$_::要素生成関数ー内部コンテンツの複数追加や入子が可能
$_({id:'nyro', class:'hoge fuga','data-type':'dummy'},','Node入子','NODE並列')
innerにテンプレートが使える。関数(生成要素)指定できる。
JSONから要素生成する場合、別の関数が必要。JSON -> 配列 -> 引数変換して、$_()を活用できる?
テストここに要素を生成して挿入する。
//要素挿入のテスト
_$('#testlay1').append($_({class:'red text-white p-2',},'生成した要素'));
テストここに複数階層の要素を生成して挿入する。
//USE 並列入れ子
let $layheader = new $_({class:'w-100 p-2 green'},'ヘッダー');
let $laybody = new $_({class:'w-100 p-5 blue'},'ボディ');
let $layfooter = new $_({class:'w-100 p-2 pink'},'フッター');
let $lay = new $_({id:'laylay'},$layheader,$laybody,$layfooter);
_$('#testlay2').append($lay);
$$_配列から要素を生成:: $_({id:'hoge'},$$_(個別配列,共通パーツ配列))
- 個別配列 > 共通パーツ配列で個別配列が優先される。
- 共通パーツ配列で{class:'item'}であっても、個別配列内で[{class:'item active'}]なら個別配列で上書きされる
テスト
let $n3op = {tag:'span', class:"d-inline-block p-2"};
//個別オプション(配列 -> 連想配列)
let $n3ary = [
[{"data-val":'1'},'その1','その1ダッシュ'],
[{"data-val":'1'},'その2'],
[{"data-val":'1'},'その3']
];
$n3nodes = $_({class:'d-inline-block'},$$_($n3ary,$n3op));
_$('#node3').append($n3nodes);
$$_:テンプレートを使った例
テスト
//CODE
let $n2op = {tag:'button',type:"button", class:"wys-btn",
tpl:'<i class="x50 <%=icon %>"></i><div class="x50 name"><%=name %></div>'};
//個別オプション(配列 -> 連想配列)
let $n2ary = [
{data:{name:"太字+",icon:"nja-bold"}},
{data:{name:"サイズ",icon:"nja-font-size"}},
{data:{name:"カラー",icon:"nja-text-color"}},
{data:{name:"デコ",icon:"nja-logo-design"}},
{data:{name:"リンク",icon:"nja-link"}},
{data:{name:"消す",icon:"nja-kesu"}}
];
$n2nodes = $_({id:'hoge', class:'d-flex'},$$_($n2ary,$n2op));
_$('#node2').append($n2nodes);
配列から要素を生成して挿入
_$(挿入先).$$_(要素配列,共通配列)//後ろに追加
テスト
//要素生成関数:
_$('#node4').$$_($n3ary,$n3op);
_$.fn.$$_ = function($ary,$cmn) {
if(!$ary || $ary.length == 0) return this;
if(!$cmn) $cmn = {};
let list = [];
this.forEach(function(el, index) {
for (var i = 0; i < $ary.length; i++){
let $node;
if(isHash($ary[i])) $node = $_($x$($ary[i],$cmn));
if(Array.isArray($ary[i])) {
$node = $_($x$($ary[i][0],$cmn),...$ary[i].slice(1));
}
if($node) list.push($node);
if($node) el.appendChild($node);
}
});
return _$(...list);
};
_$(挿入先)._$$(要素配列,共通配列)//前方に追加
テスト
//要素生成関数:
_$('#node5')._$$($n3ary,$n3op);
_$.fn._$$ = function($ary,$cmn) {
if(!$ary || $ary.length == 0) return this;
if(!$cmn) $cmn = {};
let list = [];
// let $len = $ary.length;
this.forEach(function(el, index) {
//配列は逆順でループ
for (var i = $ary.length - 1; i >= 0 ; i--){
let $node;
if(isHash($ary[i])) $node = $_($x$($ary[i],$cmn));
if(Array.isArray($ary[i])) {
$node = $_($x$($ary[i][0],$cmn),...$ary[i].slice(1));
}
if($node) list.push($node);
if($node) el.prepend($node);
}
});
return _$(...list);
};
参考:ブラウザの仕組み
参考:仮想DOMは速いのか?!
DOM API <- Node <- Element
参考:DOM生成汎用
//要素生成関数:
var $_ = window.$_ = function(op,inner) {
if(!op) return;
let $div = document.createElement.call(document,(op['tag'] == null)?'div':op['tag']);
let $data, set = 0;
Object.keys(op).forEach(function(i) {
if(i == "tpl") {
if(op['tpl'] && op['data']) $data = $_tpl(op['tpl'],op['data']);
if($data != null) $div.insertAdjacentHTML('beforeend', $data);
} else if(i == "fun") {
if(typeof op['fun'] === 'function') op['fun']($div);
} else if(i != "tag" && i != "data") {
$div.setAttribute(i, op[i]);
}
});
if(arguments.length == 1) return $div;
let $inr;
for (var i=1; i < arguments.length; i++) {
$inr = arguments[i];
if($inr != null && typeof $inr == "string") $div.insertAdjacentHTML('beforeend', $inr);
if(isNode($inr)) $div.appendChild($inr);
if(Array.isArray($inr)) {
$inr.forEach(function(val) {
if(isNode(val)) $div.appendChild(val);
if(typeof val == "string") div.insertAdjacentHTML('beforeend',val);
});
}
}
return $div;
};//END:$_
var $$_ = window.$$_ = function($ary,$cmn) {
if(!$ary || $ary.length == 0) return this;
if(!$cmn) $cmn = {};
let list = [];
for (var i = 0; i < $ary.length; i++){
let $node;
if(isHash($ary[i])) $node = $_($x$($ary[i],$cmn));
if(Array.isArray($ary[i])) {
$node = $_($x$($ary[i][0],$cmn),...$ary[i].slice(1));
}
if($node) list.push($node);
}
return list;
};//END:$$_
Tom
Jack
jqueryの属性操作キャッシュ仕様
//jQueryのdataは、キャッシュするだけで、htmlを書き換えない
jQuery("#user1").data("user","Tom");
document.getElementById('user1').getAttribute('data-user') -> undefined
//キャッシュを取り出すことは可能
jQuery("#user1").data("user") -> Tom
jQuery("#user1").attr("data-date-of-birth","2001-01-01");
console.log(document.getElementById('user1'));
要素の属性操作など
確認要素
テスト用DOM(data属性)
//関数である場合は実行(target省略化)
//タイムスタンプ+乱数文字列生成
nJa_.func.tmspID($pre)
//要素にタイムスタンプDATA属性(data-tms)をつけて、値を返す
nJa_.func.setTMS(要素)
//要素にイベント用名前空間をつけ(または取得し)、配列を返す。
nJa_.func.setEVns(要素,イベント名)
//nJa_.func.setEVnsが返す、配列。
op.tms
op[イベント名]
//domのIDを返す、IDがない場合はタイムスタンプでID生成:$preは省略可
nJa_.func.getID($trg,$pre)
//data属性を設定し、dataを返す。
nJa_.func.setDATA($tg,$type,$data)
//data属性の値を返す、なければ値を設定($data指定する場合、なければ''を返す。)
nJa_.func.getTYPE($tg,$type,$data)
//要素を並べ替える
nJa_.func.sortEl($t,$atr,$order);
//クリックで表示
nJa_.func.clcshw($clc,$shw)
//windowsの表示幅を取得
nJa_.func.clcWD($maxwd)
// func for scroll
nJa_.func.scrllFix($trgt,$nav)
// QRcodeの生成 jqQRcode使用
nJa_.func.jqQRcode($trg,$url,$size)
//htmlをエスケープ
nJa_.func.escapeHTML(string)
//loadash.js
//
nJa_.func.tmpl($trg,$html,$data,$mode)
//
nJa_.func.tmplout($tmpl,$data)
QRコード生成(jquery.qrcode.min.js)
vanillaJS バーコードライブラリ
nJa_.func.jqQRcode = function($trg,$url,$size);
nJa_.func.jqQRcode($('#jrqr'),nJa_.vars.thisurl,'150');