【问题标题】:How to use the each() function to iterate through a JSON file如何使用 each() 函数遍历 JSON 文件
【发布时间】:2016-02-14 20:02:57
【问题描述】:

我想显示 JSON 文件中的元素。

这是 JSON 文件

"2015": {
"img": "<img src = \"../images/images/images_of_members/image1.jpg\">",
"img2": "<img src = \"../images/images/images_of_members/image2.jpg\">"},

"2016": {
"img": "<img src = \"../images/images/images_of_members/image1.jpg\">",
"img2": "<img src = \"../images/images/images_of_members/image2.jpg\">"  }

这是 JavaScript 文件

$.ajax("gallery.json", {
    dataType: 'json',
    success: function (response) {
        $.each(response, function () {
            $.each(this, function (i, el) {
                $(".photo_target").css('display', 'block');
                $(".photo_target").append(el);
            });
        });
     }
});

这是 HTML 文件

<div class="years">
    <p data-year="2015">Pictures 1</p>
    <p data-year="2016">Pictures 2</p>
</div>
<div class="photo_target"></div>

如果单击属性数据年 2015 的段落,我只想显示对象 2015 中的图片,如果单击属性数据年 2016 年的段落,则显示对象 2016 中的图片。现在它是迭代通过所有对象并显示所有图片,可以在此 JSON 文件中找到。

我应该在 AJAX 调用中进行哪些更改才能使其按我的意愿工作?

谢谢

【问题讨论】:

  • 你试过console.log 看看你的$.each 循环指的是什么吗?
  • 在某种程度上取决于您希望如何将所有这些图像加载到页面中。全部加载然后过滤它们?...或者只加载用户想要的?例如,如果有很多图像,则可能需要考虑带宽
  • 图片不会太多,都会优化。每张图片的三种不同尺寸,适用于不同的屏幕分辨率。
  • 我所做的和工作的,但不幸的是每张图片加载了两张。这是我得到的 $.each(response, function () { $.each(response[number], function (i, el) { ... } 我在响应后添加了 [number] 现在只加载图片我想要。但是每张都加载了两张图片。你知道为什么吗?

标签: javascript jquery json ajax


【解决方案1】:

我做了很长时间的 JQuery,但你可以做类似的事情:

首先像这样改变你的json*:

{2015 : ['/images/img1', '/images/img2'], 2016 : ['/images/img2']}

然后你做:

function fetchData(year) {
   $.ajax("gallery.json", {
     success : function(response) {
        var images = response[year];
        //images is now an array you could 'for each' over
        images.forEach(function(image) {
          //do your append...
        })

     }
   })
}

(*假设您可以更改 json。)

【讨论】:

  • 我想你和我一样错过了点击部分。看我的回答。 (不是投反对票的人)
  • 像你自己一样,我认为点击部分很明显,困难在于迭代图像
【解决方案2】:

这是一个可行的解决方案:https://jsfiddle.net/hgmx71zt/2/

基本上我每年将所有图像分组在一个容器 div 中:

for (var year in jsondata) {
  var $container = $("<div/>");
  $container
    .addClass("year-" + year)
    .appendTo($photo_target)
    .addClass("year-images");

  for (var img in jsondata[year]) {
    var $img = $(jsondata[year][img]);
    $container.append($img);
  }
}

我使用 CSS 将它们默认隐藏。

.year-images {
  display: none;
}

最后,我添加了一个点击事件处理程序,它切换“.visible”类,使给定容器可见(再次使用 CSS)

$(".years").on("click", "[data-year]", function(e) {
  var year = $(e.currentTarget).data("year"),
    container = $photo_target.find(".year-" + year);
  console.log(year);
  console.dir(container);
  container.toggleClass("visible").siblings().removeClass("visible");
});

可见类的 CSS:

.year-images.visible {
  display: block;
}

【讨论】:

  • 嗨,由于某种原因它不起作用。我不知道为什么,控制台中根本没有错误消息。
  • 示例中的 URL 是虚构的,因此它们是不可见的……看看小提琴,我没有在这里复制所有内容。
【解决方案3】:

试试这个:

$.ajax("gallery.json", {
  dataType: 'json',
  success: function (response) {
    $(".photo_target").css('display', 'block');
    for(var year in response){
      for(var key2 in response[year]){
        var $img = $(response[year][key2]);
        $img.hide();
        $img.data("year", year);
        $(".photo_target").append($img);
      }
    }
  }
});

$(".years p").click(function(){
  var year = $(this).data("year");
  $(".photo_target").find("img").hide();
  $(".photo_target").find("img[data-year='" + year + "']").show();
  return false;
});

【讨论】:

  • 如何回答点击过滤问题?
  • @charlietfl 啊哈,我的错。我认为问题是要附加图像,因为 OP 的原始迭代不起作用。我会更新我的答案。
  • @charlietfl 我认为这可能有效。感谢您的信息。
  • 您好,这个解决方案出现错误 Uncaught ReferenceError: key1 is not defined
  • @LászlóPéterVarga 已修复!
【解决方案4】:

$(函数 () {

$('.years p').on('click', function () {
    $(".photo_target").children().remove();
    var attr = $(this).attr('data-year');
    if (typeof attr !== typeof undefined && attr !== false) {
        var number = $(this).data('year');
        console.log(number);
        $.ajax("gallery.json", {
            dataType: 'json',
            success: function (response) {
                    $.each(response[number], function (i, el) {

                        $(".photo_target").css('display', 'block');

                $(".photo_target").append(el);
                    });

            }
        })

    }
})});

这是我的解决方案。 我已经改变了这一行

success: function (response) {
    $.each(response, function () {
        $.each(this, function (i, el) {
            $(".photo_target").css('display', 'block');
            $(".photo_target").append(el);

到这里

success: function (response) {
                    $.each(response[number], function (i, el) {
                        $(".photo_target").css('display', 'block');
                $(".photo_target").append(el);

现在可以正常使用了。

感谢您的所有帮助。

【讨论】:

  • 这是一个非常糟糕的解决方案,它并没有给那些试图帮助你的人任何功劳。为什么每次点击都加载相同的数据,为什么不按照这里其他人的建议呢?
  • 我相信你是一个比我优秀得多的程序员。我分享我的解决方案的唯一原因是它对我来说很好。其他人只是没有。我尝试了所有,结果是一个空白字段,而我的一个加载图片。每次点击都有一个 AJAX 调用,只需 2kB 的数据,几乎什么都没有。图片是在我认为它们被缓存后第一次点击时下载的。谷歌开发工具显示第一次点击后没有图片下载。对不起,如果我让你受够了。
猜你喜欢
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 2015-03-03
  • 1970-01-01
  • 2011-11-29
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多