2012-09-10 16 views
0

我想从我的旧网站中提取旧的FAQ系统,并将其重新编码为<dl>交替出现两个jQuery对象

这是迄今为止我jQuery代码:

$accordion = $('.accordion'); 
$headers = $accordion.find('h3.trigger-h3-accordion a'); 
$content = $accordion.find('div.toggle-accordion-large'); 

out = "<dl>\n"; 
$headers.each(function(k,v) { 
    out += "<dt>" + $(this).text() + "</dt>\n"; 
    out += "<dd>" + $content[k].html() + "</dd>\n"; 
    // I also tried $content.k.html() and $content{k}.html() 
    // and .text() on all of those options 
}); 
out += "</dl>\n"; 
console.log(out); 

我得到的错误:TypeError: $content[k].html is not a function

在线:out += "<dd>" + $content[k].html() + "</dd>\n";

<div class="accordion"> 
    <div class="trigger-accordion-large trigger-accordion-active"> 
     <h3 class="trigger-h3-accordion"><a href="#" onclick="return stopAccordionRefresh();">Header Text</a></h3> 
    </div> 
    <div style="display: block;" class="toggle-accordion-large"> 
     <div class="block-large"> 
      <div class="body-content-textarea"> 
       <p>Content Text.</p> 
      </div> 
     </div> 
    </div> 
</div> 

我怎么能输出的每个$内容的内容循环中的对象创建有效的<dl><dt><dd>我后?

回答

1

试试这个:

$($content[k]).html(); 

因为,.html()只与jQuery对象工作,根据你的错误似乎$content[k]不是一个jQuery对象,可能是一个因素。

因此,将其包装在$()中将使其成为jQuery对象,然后您就可以使用任何jQuery方法。

如果$content[k]是一个元素,那么你可以使用:

$content[k].innerHTML = 'your_all_html'; 
+0

OMG!我真是个白痴! 我试过'$($ content [k])。html();'但我把它拼错为'$(content [k])。html();' 它现在可以工作: '$($ content [k])。html();' – atwright147

1

这是因为$content[k]是本地元素,而不是一个jQuery对象。您可以将其封装在新的jQuery对象中,如codeparadox所示,或者使用$content[k].htmlString,而不是Function)。

[]的文档是在这里:http://api.jquery.com/get/

.get()返回jQuery对象所有DOM元素的天然阵列。
.get(n)返回从零开始的第n个元素。
.get(-n)返回第n个元素,基于1的元素。
jQuery对象的行为像在于
[n]包含的第n个元件
.length意义上的数组包含

天然dom元素的文档可以在这里找到的元素数:

http://www.w3schools.com/jsref/dom_obj_all.asp http://www.javascriptkit.com/domref/elementproperties.shtml

+0

有趣。我不知道这个选项。 有没有在jQuery网站上的这个地方的文档(只搜索返回.html()的信息? – atwright147

2

使用数组索引返回底层DOM元素访问jQuery对象的元素,而不是一个jQuery对象;访问该元素的jQuery的参考,使用.eq()方法来代替:

out += "<dd>" + $content.eq(k).html() + "</dd>\n"; 
+0

Ooooh,我忘了.eq() - 非常好 – atwright147

2

我会处理这种转换通过使jQuery的对象,而不是一个HTML字符串:

var $accordion = $('.accordion'), 
    $headers = $('h3.trigger-h3-accordion a', $accordion), 
    $content = $('div.toggle-accordion-large', $accordion), 
    $out = $('<dl/>') 
    $dt = $('<dt/>'), 
    $dd = $('<dd/>'); 

$headers.each(function(k,v) { 
    var contents = $($content[k]).html(); 
    $dt.clone().html(v.innerHTML).appendTo($out); 
    $dd.clone().html(contents).appendTo($out); 
}); 

console.log(out); 
+0

哇,这是一个优雅的解决方案! – atwright147