手风琴AJAX JSON内容

时间:2014-11-06 20:26:59

标签: javascript jquery ajax json

我有以下html结构

<div class="accordion-container">
    <ul class="accordion">
      <li class="accordion-header">
        <a class="is-active link">Accordion header<i class="accordion-header-icon"></i></a>
        <div class="accordion-content js-accordion-content">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eum, quos!</p>
        </div>
      </li>
      <li class="accordion-header">
        <a class="link">Accordion header<i class="accordion-header-icon"></i></a>
        <div class="accordion-content js-accordion-content">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nulla sed ducimus iusto, atque veniam, laborum ratione quibusdam sapiente. Sint.</p>
        </div>
      </li>
      <li class="accordion-header">
        <a class="link">Accordion header<i class="accordion-header-icon"></i></a>
        <div class="accordion-content js-accordion-content">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nulla sed ducimus iusto, atque veniam, laborum ratione quibusdam sapiente. Sint.</p>
        </div>
      </li>
      <li class="accordion-header">
        <a class="link">Accordion header<i class="accordion-header-icon"></i></a>
        <div class="accordion-content js-accordion-content">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nulla sed ducimus iusto, atque veniam, laborum ratione quibusdam sapiente. Sint.</p>
        </div>
      </li>
    </ul>
  </div>

和这个css

.accordion-content {
  display: none; }

我只是在点击每个手风琴标题(.link)时试图用json文件中的内容填充手风琴内容

我已经尝试过了,但它并没有按预期工作。当我点击标题时,它会填充所有其他的手风琴内容。

$(document).ready(function () {
  $('.accordion').each(function (index) {
    $(this).children('li').first().children('a').addClass('is-active').next().addClass('is-open').show();
  });

  $('.accordion').on('click', 'li > a', function (event) {
    if (!$(this).hasClass('is-active')) {
      event.preventDefault();
      var accordionTabs = $(this).closest('.accordion');
      accordionTabs.find('.is-open').removeClass('is-open').slideUp('fast');

      $(this).next().toggleClass('is-open').slideToggle('fast');
      accordionTabs.find('.is-active').removeClass('is-active');

      $(this).addClass('is-active').closest('.accordion-content', function () {
        $.getJSON('public/js/result.json', function (jd) {
        $('.js-accordion-content').html('<p>Name: ' + jd.name + '</p>');
        $('.js-accordion-content').append('<p>Age : ' + jd.age+ '</p>');
        $('.js-accordion-content').append('<p>Sex: ' + jd.sex+ '</p>');
      });  
    });
    } else {
      event.preventDefault();
    }
  });
});

json看起来像这样:

{
  "name": "Zara Ali",
  "age" : "67",
  "sex": "female"
}

2 个答案:

答案 0 :(得分:0)

jQuery的closest方法不接受匿名函数作为第二个参数,因此它永远不会在您的代码中触发。

$(this).addClass('is-active').closest('.accordion-content', function () {

我还没有看到你对.accordion-content选择器做任何事情,所以只需省略它。

$(this).addClass('is-active');
$.getJSON(....

您还需要缓存对触发click事件的元素的引用,以便在您的ajax回调结果中引用:

var self = $(this);

我们需要将其本地包装为jQuery对象,因为我们作为上下文传递的第二个参数需要应用.parent()才能实际获取.js-accordion-content元素。

$('.js-accordion-content', self.parent()).html('<p>Name: ' + jd.name + '</p>');
$('.js-accordion-content', self.parent()).append('<p>Age : ' + jd.age + '</p>');
$('.js-accordion-content', self.parent()).append('<p>Sex: ' + jd.sex + '</p>');

jsFiddle

答案 1 :(得分:0)

查询&#34; .js-accordion-content&#34;对具有相同类名的所有类似元素都不明确。将它隔离到当前的&#34;手风琴&#34;

取代:

  $(this).addClass('is-active').closest('.accordion-content', function () {
    $.getJSON('public/js/result.json', function (jd) {
    $('.js-accordion-content').html('<p>Name: ' + jd.name + '</p>');
    $('.js-accordion-content').append('<p>Age : ' + jd.age+ '</p>');
    $('.js-accordion-content').append('<p>Sex: ' + jd.sex+ '</p>');
  });  

 var self = this;
  $(this).addClass('is-active').closest('.accordion-content', function () {
    $.getJSON('public/js/result.json', function (jd) {
    $('.js-accordion-content', self).html('<p>Name: ' + jd.name + '</p>');
    $('.js-accordion-content', self).append('<p>Age : ' + jd.age+ '</p>');
    $('.js-accordion-content', self).append('<p>Sex: ' + jd.sex+ '</p>');
  });  

注意使用引用手风琴的self