1

场景:我希望通过 AJAX 将元素列表返回给浏览器。使用 JAXB 进行编组,并且由于 XML 需要根元素(JSON 不需要...),我将列表包装在信封(包装器)元素中。现在在客户端(浏览器)上,我希望删除外部元素,使内部元素列表保持不变。然后我希望将提取的元素列表放入 HTML Dom。我怎样才能做到这一点?

澄清示例:

想寄:

<tr><td>data</td></tr><tr><td>data</td></tr>

由于对 text/xml 响应类型的限制(为了符合 XML),我将其包装为:

<tbody><tr><td>data</td></tr><tr><td>data</td></tr></tbody>

因此,在我的 jquery 回调方法中,我收到了上述内容(作为 xml 对象)。我怎样才能(没有特定的顺序,除了任何工作)删除 tbody 元素,并确保剩余的 tr 标签是可接受的 domData。我玩过 find()、filter() 等,但仍然没有解决这两个要求的解决方案。

感谢所有已经回复的人!这个真的让我很困扰。如果不测试所有提供的答案,似乎有多种方法可以做到这一点,并且每个答案都可能被标记为正确的答案。我实际上是这样做的:

 }).done(function(xmlResponse) {
    $strData = xmlToString(xmlResponse);
    $html = $($strData);
    $('#mytable tbody').html($html.contents());
 });

出于某种原因,如果没有首先将 xml 转换为字符串的显式标注,它就不起作用。此后,将字符串包装在 $() 中强制它符合 DOM,然后 contents() 方法负责提取(删除)外部元素。

这是 xmlToString() 方法。如果有人能指出我如何消除对这种丑陋方法的需求,那肯定是一个奖励。它看起来像是 2009 年之前的 html 应用程序:

function xmlToString(xmlData) { 
  var xmlString;
  if (window.ActiveXObject){
     xmlString = xmlData.xml;
  } else{
     xmlString = (new XMLSerializer()).serializeToString(xmlData);
  }
  return xmlString;
}   

我会将我读到的第一个答案标记为正确,因为它足以让我越过终点线。

4

4 回答 4

0

您可以使用replaceWith它的孩子来替换它(这将保留它们):

$(xml).children("tbody").replaceWith($(xml).children("tbody").children());
于 2013-04-18T19:49:37.683 回答
0

您可以只使用.contents()来提取根元素的内容:

$html = $('<tbody><tr><td>data</td></tr><tr><td>data</td></tr></tbody>');
$html.contents().appendTo('#something-else');
于 2013-04-18T19:49:51.660 回答
0

尝试这个 -

$(xml).find('tbody').contents().unwrap();

工作演示

于 2013-04-18T19:44:28.477 回答
0

只需找到 tbody 的孩子。想象“数据”变量包含通过 ajax 接收到的数据:

var $shard = $(data).children();

$('.something').append($shard);

解释:

$(data) // creates the dom shard.
$(data).children(); // selects it's children, which is everything except the tbody
于 2013-04-18T19:46:19.183 回答