ここでは、jQuery自体がオブジェクトを処理するための概念実証の実装があります。オブジェクトラッパー(FakeNode
)を介して、あなたが使っへのjQueryをだますことができます内蔵のプレーンなJavaScriptオブジェクトのセレクタエンジン(シズル):
function FakeNode(obj, name, parent) {
this.obj = obj;
this.nodeName = name;
this.nodeType = name ? 1 : 9; // element or document
this.parentNode = parent;
}
FakeNode.prototype = {
documentElement: { nodeName: "fake" },
getElementsByTagName: function (tagName) {
var nodes = [];
for (var p in this.obj) {
var node = new FakeNode(this.obj[p], p, this);
if (p === tagName) {
nodes.push(node);
}
Array.prototype.push.apply(nodes,
node.getElementsByTagName(tagName));
}
return nodes;
}
};
function $$(sel, context) {
return $(sel, new FakeNode(context));
}
および使用方法は、次のようになります。
var obj = {
foo: 1,
bar: 2,
child: {
baz: [ 3, 4, 5 ],
bar: {
bar: 3
}
}
};
function test(selector) {
document.write("Selector: " + selector + "<br>");
$$(selector, obj).each(function() {
document.write("- Found: " + this.obj + "<br>");
});
}
test("child baz");
test("bar");
与えます出力:
Selector: child baz
- Found: 3,4,5
Selector: bar
- Found: 2
- Found: [object Object]
- Found: 3
もちろん、もっと複雑なセレクタをサポートするためには、上記よりも多くを実装する必要があります。
ご参考までにjLinqを見ましたか?
でループにし、それをjQueryを使って要素をラップすることです-1]; ? –
これは、このおもちゃの例ではうまくいくが、より深い木や大きなオブジェクトではすばやく崩壊する。たとえば、ネットワークパケットを表すツリーを使用するプログラムで作業していますが、到達できないパケットのICMPフレームを取得するために$( 'icmp [code = UNREACHABLE]'、packetlist)を書くことができればと思っています。 – brendan