在Rails应用程序的JS模块中,我找到了这段代码:
$body.on('ajax:success', '.js-comment-create', function(data, xhr, status) {
var content = $(xhr.content),
$comment = $(content.comment);
我想知道为什么xhr.content
需要或应该在$()
中成为现实?
只要一切正常,我就不会注意它,但是现在,当我调试时,我想知道为什么会这样。
对控制台的快速测试表明,包装xhr-Object会返回一个JQuery对象,而不是纯JS对象。但是在这种特殊情况下,我只想访问对象内部的数据,这有什么好处呢?
编辑:xhr.content
是一个JSON对象,其中键comment
包含一段html来替换DOM的某些部分,如$(".aside ul.messages").prepend($comment);
答案 0 :(得分:1)
根据您引用的代码和您提供的信息,“为什么包装对象成为jQuery对象?”的答案。是:它看起来像一个bug。不仅没有充分的理由这样做,这样做会使代码无法正常工作。
代码几乎肯定只是:
$body.on('ajax:success', '.js-comment-create', function(data, xhr, status) {
var content = xhr.content,
$comment = $(content.comment);
甚至
$body.on('ajax:success', '.js-comment-create', function(data, xhr, status) {
var $comment = $(xhr.content.comment);
...除非其他内容稍后使用content
。
以下是执行代码操作时会发生的情况:
var xhr = {
content: {
comment: "<p>I'm the comment</p>"
}
};
var content = $(xhr.content),
$comment = $(content.comment);
$comment.appendTo(document.body);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
VS。如果你不做初始包装:
var xhr = {
content: {
comment: "<p>I'm the comment</p>"
}
};
var content = xhr.content,
$comment = $(content.comment);
$comment.appendTo(document.body);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>