16

これは非常に単純に思えるものの 1 つですが、うまくいく方法が思いつきません。

おそらくノードがありますnodelist = document.getElementById("mydiv");-これをノードリストに正規化する必要があります。また、配列でもありません。実際の正真正銘のnodeListオブジェクトです。

いいえ nodelist = [document.getElementById("mydiv")];

ライブラリはありません。

4

5 に答える 5

9

JavaScriptですでに参照されている要素を取得し、セレクターを使用して検索できる属性を指定し、リストとして検索し、属性を削除して、リストを返します。

function toNodeList(elm){
    var list;
    elm.setAttribute('wrapNodeList','');
    list = document.querySelectorAll('[wrapNodeList]');
    elm.removeAttribute('wrapNodeList');
    return list;
}

bfavarettoの答えから拡張されました。


function toNodeList(elm, context){
    var list, df;
    context = context // context provided
           || elm.parentNode; // element's parent
    if(!context && elm.ownerDocument){ // is part of a document
        if(elm === elm.ownerDocument.documentElement || elm.ownerDocument.constructor.name === 'DocumentFragment'){ // is <html> or in a fragment
            context = elm.ownerDocument;
        }
    }
    if(!context){ // still no context? do David Thomas' method
        df = document.createDocumentFragment();
        df.appendChild(elm);
        list = df.childNodes;
        // df.removeChild(elm); // NodeList is live, removeChild empties it
        return list;
    }
    // selector method
    elm.setAttribute('wrapNodeList','');
    list = context.querySelectorAll('[wrapNodeList]');
    elm.removeAttribute('wrapNodeList');
    return list;
}

私が最近考えたこれを行う別の方法があります

var _NodeList = (function () {
    var fragment = document.createDocumentFragment();
    fragment.appendChild(document.createComment('node shadows me'));
    function NodeList (node) {
        this[0] = node;
    };
    NodeList.prototype = (function (proto) {
        function F() {} // Object.create shim
        F.prototype = proto;
        return new F();
    }(fragment.childNodes));
    NodeList.prototype.item = function item(i) {
        return this[+i || 0];
    };
    return NodeList;
}());

var list = new _NodeList(document.body); // note **new**
list.constructor === NodeList; // all these are true
list instanceof NodeList;
list.length === 1;
list[0] === document.body;
list.item(0) === document.body;
于 2012-11-13T15:25:35.667 に答える
6

をサポートするブラウザをターゲットにしている場合document.querySelectorAll、常にNodeList. そう:

var nodelist = document.querySelectorAll("#mydiv");
于 2012-11-12T21:42:25.137 に答える
3
var nodeList = document.createDocumentFragment();
nodeList.appendChild(document.getElementById("myDiv"));
于 2012-11-12T21:44:31.107 に答える