为什么在重构jQuery代码时我得到[对象对象]而不是我预期的HTML

Why am I getting [object Object] instead of my expected HTML when refactoring jQuery code?

本文关键字:对象 HTML jQuery 重构 代码 为什么      更新时间:2023-09-26

我正在尝试清理我的代码,我在我的脚本中发现了许多类似于以下内容的代码片段:

$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] .

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

这是重构 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);

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

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

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