Đây là cách thực hiện chứng minh khái niệm để giúp jQuery tự hoạt động trên các đối tượng. Qua một wrapper đối tượng (FakeNode
), bạn có thể đánh lừa jQuery vào sử dụng nó được xây dựng trong công cụ chọn (sizzle) trên đồng bằng đối tượng 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));
}
Và việc sử dụng sẽ là:
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");
Cho các đầu ra:
Selector: child baz
- Found: 3,4,5
Selector: bar
- Found: 2
- Found: [object Object]
- Found: 3
Tất nhiên, bạn phải thực hiện nhiều hơn những điều trên để hỗ trợ các bộ chọn phức tạp hơn.
BTW, bạn có thấy jLinq không?
Nguồn
2009-07-17 20:46:42
Có một lý do mà bạn không thích obj.child.baz [obj.child.baz.length -1]; ? –
Đó là công việc cho ví dụ đồ chơi này, nhưng phá vỡ nhanh chóng cho cây sâu hơn và các đối tượng lớn hơn. Ví dụ, tôi đang làm việc trên một chương trình sử dụng một cây đại diện cho các gói mạng, và tôi rất muốn có thể viết $ ('icmp [code = UNREACHABLE]', packetlist) để lấy các khung ICMP cho các gói không thể truy cập được. – brendan