読者です 読者をやめる 読者になる 読者になる

jQueryにないJavaScript頻出イデオム

JavaScript

jQueryAPIが見当たらないので、いろいろと自作しました。JavaScriptでよくやることだと思うのですが、なんでないんだろう? 確実じゃないからサポートしてないのかな。

要素の属性をすべて列挙する

function attrs_of(element) {
    if(element instanceof jQuery){ element = element.get(0); }
    var as = element.attributes;
    var props = {};
    for(var i = 0; i < as.length; i++){
        var a = as.item(i);
        if(a.specified){
            props[a.name] = a.value;
        }
    }
    return props;
}

jQueryでは、オブジェクトをattrに渡して、一気に要素に属性を設定する方法はあるのに、一気に取得することはできないみたい。

DOM要素がドキュメントに含まれる(作成直後や除去済みでない)か判別

function is_in_document(element){
    if(element instanceof jQuery){ element = element.get(0); }
    var p = element.parentNode;
    while(p && p != window) {
        if(p == document){
            return true;
        }
        p = p.parentNode;
    }
    return false;
}

もしかしたら、気づいてないだけで、実はjQuery的解決方法があるのかな?

オブジェクトを文字列形式ダンプ

function strdump(v, sharrow){
    switch(typeof v){
        case 'object':
            if(sharrow){
                return '{...}';
            }else{
                var props = [];
                for(var k in v) { props.push(k + ':' + strdump(v[k], true)); }
                return '{' + props.join(', ') + '}';
            }
        case 'function':
            return 'function(){...}';
        case 'string':
            v = v.replace(/\\/g, "\\\\").replace(/\"/g, "\\\"").replace(/\n/g, "\\n").replace(/\r/g, "\\r");
            return '"' + v.substr(0,30) + (v.length > 30 ? "..." : "") + '"';
        default:
            return String(v);
    }
}

sharrowはブール値だけど、オブジェクトを掘る深さとかでもいいかもしれない。