为什么包装对象成为jQuery对象?

时间:2017-02-03 11:02:14

标签: jquery

在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);

1 个答案:

答案 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>