为什么在重构jQuery代码时我得到[object Object]而不是我期望的HTML?

时间:2016-03-01 19:30:05

标签: javascript jquery refactoring

我正在尝试清理我的代码,并在脚本中找到许多与以下内容类似的代码段:

$msg.html('<a href="#" data-userName=' + msg.user +
      ' class="userName" onClick="showCurrUsersMsgs(this);">@' + msg.user + '</a>' + '<span class="timestamp"> <b>&middot;</b> ' + 
      jQuery.timeago(msg.created_at) +'</span></br>' + 
      msg.message);

我尝试过像

这样的事情
var $userProfile = $('<a href="#" data-userName=' + msg.user +
      ' class="userName" onClick="showCurrUsersMsgs(this);">@' + msg.user + '</a>');
var $timeStamp = $('<span class="timestamp"> <b>&middot;</b> ' + 
      jQuery.timeago(msg.created_at) +'</span>'); 
$msg.html($userProfile + $timeStamp + '</br>' + msg.message);

使其更具可读性,但页面无法正确构建。相反,它显示的内容类似于[Object][Object]

为什么会发生这种情况,如何修复此错误?

2 个答案:

答案 0 :(得分:3)

这是重构生成html的jQuery代码的一种明确的(很长的)方法:

var $a = $('<a>', {
  'href': '#',
  'data-userName': msg.user,
  'class': 'userName',
  'html': '@' + msg.user
}).on('click', function() { showCurrUsersMsgs(this);});

var $span = $('<span>', {
  'class': 'timestamp',
  'html': '<b>&middot;</b>' + msg.created_at
});

var $p = $('<p>', {html: msg.message});

var $html = $a.add($span).add($('<br>')).add($p);

答案 1 :(得分:0)

你不能添加&#34;两个jQuery对象在一起。您应该将HTML片段构建为字符串,然后将字符串连接在一起:

()

也就是说,如果你真的对清理它有兴趣,你应该停止使用简单的字符串连接来构建HTML。选择一个真正的模板库,如Handlebars,HTMLBars,Jade等。