jQuery()对象可以保存非DOM对象吗?
分析这个SO问题所显示的代码,我只是注意到它使用jQuery迭代JSON数组的方式:
$(data).each(function() {
而在我看来,数组应该以这种方式迭代:
$.each(data, function() {
实际上, jQuery.each()手册页指出:
$ .each()函数与$(selector).each()不同,后者用于独占于jQuery对象进行迭代。
但由于OP看起来他的代码至少部分工作,我很想测试,并发现它有效!
这是certificate:
var data = [ {"key": "value-1"}, {"key": "value-2"}, {"key": "value-3"} ]; $(data).each(function() { document.write('
' + this.key); });
因此,如果$(data).each()
在data
是JSON数组时有效,那么它似乎意味着这个数组是$(data)
返回jQuery对象的可接受内容。
然后进行调查我检查了jQuery(elementArray)手册页并查看了jQuery( elementArray )
部分,其中指出:
elementArray
类型:数组
包含一组DOM元素的数组,用于包装在jQuery对象中。
根据以上所述,对象数组(而不是DOM元素)应该失败。
所以我测试比较这个$(data)
和一个简单的$('body')
返回的对象。 结果如下:
var data = [ {"key": "value-1"}, {"key": "value-2"}, {"key": "value-3"} ]; function log(obj, init) { for (var prop in obj) { if (obj.hasOwnProperty(prop)) { var $row = $('tr[data-prop=' + prop + ']'); if (!$row.length) { $row = $('' + prop + ' ') .appendTo($('table')); if (!init) { $row.append(' '); } } $row.append('' + JSON.stringify(obj[prop]).substr(0,25) + ' '); } } } log($('body'), true); log($(data), false);
table { border-collapse: collapse; border: 1px solid #000; } th, td { border: 1px solid #000; padding: 5px; }
Property $('body') $(data)
实际上似乎所有东西都可以转换为jQuery对象。
我很困惑:我正在重新发明轮子!?
你读的文档太多了。
是的,通常jQuery(elementArray)
将用在元素数组中。 但是,它可以是一系列的东西。
目的是让您在具有普通元素的数组上使用$.each()
和可能的其他便捷方法。 如果您的数组没有某种元素,您会发现其他jQuery方法与数组中的任何内容都不匹配。
是的,jQuery构造函数接受一个数组,你可以使用$.fn.each
方法迭代返回的jQuery集合, this
在处理程序中引用每个元素。 jQuery集合是一个类似于数组的对象。
但是,不,这并不意味着您可以成功调用集合上所有与DOM相关的方法。 只需尝试使用$(data).html()
作为示例,您将收到错误,因为它希望看到DOM节点而不是普通对象或集合中的字符串。
另一个例子是尝试$(['foo']).text()
并抛出Uncaught RangeError: Maximum call stack size exceeded
jQuery 2.2.2中Uncaught RangeError: Maximum call stack size exceeded
错误。
现在尝试:
/** * `text` reads textContent of DOM elements (nodeType = 1) * and `nodeValue` of textNodes (nodeType = 3) * and returns the concatenated text */ $([ { "nodeType": 1, "textContent": "value-1" }, { "nodeType": 3, "nodeValue": "value-2" }, { "textContent": "I'm a rebel" } ]).text()
它返回"value-1value-2"
!