javascript - Onclick 选择特定的 JSON 数据集

标签 javascript json loops firebase firebase-realtime-database

我有一个 JSON 对象,如下所示:

{
  "workouts":
  [
    {
      "title": "Full Body",
      "exercises":
      [
        {
          "name": "Push Ups",
          "duration": 3,
          "break": 3
        },
        {
          "name": "Squats",
          "duration": 3,
          "break": 3
        },
        {
          "name": "Running in Place",
          "duration": 3,
          "break": 3
        }
      ]
    },
    {
      "title": "God Legs",
      "exercises":
      [
        {
          "name": "Running in Place (High Knees)",
          "duration": 3,
          "break": 3
        },
        {
          "name": "Squats",
          "duration": 3,
          "break": 3
        },
        {
          "name": "Clams",
          "duration": 3,
          "break": 3
        }
      ]
    },
    {
      "title": "Morning Stretch",
      "exercises":
      [
        {
          "name": "Downward Dog",
          "duration": 3,
          "break": 3
        },
        {
          "name": "Face Plant",
          "duration": 3,
          "break": 3
        },
        {
          "name": "Warrior",
          "duration": 3,
          "break": 3
        }
      ]
    }
  ]
}

我正在循环访问这些数据以动态创建卡片列表。我想这样做,以便当点击/单击卡片时,显示/访问与该特定数据集相关的信息。

示例如果我点击标题为“全身”的卡片,我希望显示一个仅包含“全身”练习数组中的练习的列表,该列表应该是: Push起立,3, 3 - 深蹲,3, 3 - 原地运行 3, 3。

我正在使用 Firebase 在实时数据库上托管我的数据。

HTML:

<!--LIST THAT THE DYNAMICALLY GENERATED CARDS ARE APPENDED TO-->
<ul id="cardList" class="cards"></ul>

<!--MARKUP FOR THE CARDS, USED IN THE JSON FOR LOOP-->
<li>
  <div class='card' onclick='selectWorkout(this)'>
    <a class='startIt' href='timer.html'>
      <div class='cardInfo'>
         <h3>Full Body</h3>
         <p>10 min.</p>
       </div>
    </a>
    <a class='cardOptions' href='overview.html'>
      <p>Options</p>
    </a>
  </div>
</li>

JavaScript:

// Initialize Firebase.
firebase.initializeApp(config);
// Reference data.
var dbRef = firebase.database().ref().child("workouts");
// Sync with Firebase in real time.
dbRef.on("value", snap =>
{
  var workouts = snap.val();

  for (var i = 0;  i < workouts.length; i++) // WORKS GREAT.
  {
    //display.innerHTML = exercises[0].name;
    //$("#cardList").append(exercises[i].title);
    var routine = workouts[i].title;

    $("#cardList").append("<li><div class='card'><a class='startIt' href='#' onclick='selectWorkout(this)'>\n\
    <div class='cardInfo'><h3>" + routine + "</h3><p>10 min.</p>\n\
    </div></a><a class='cardOptions' href='overview.html'>\n\
    <div id='options'><p>Options</p></div></a></div></li>"); // ALL GOOD.
  }

  function selectWorkout(this) // NOT ONLY DOES NOT ACHIEVE DESIRED GOAL, BREAKS ENTIRE FUNCTION.
  {
    var selected = workouts[this].exercises;
    $("#cardList").append(selected);
  }
});

我认为我像往常一样做了一些愚蠢的事情:锻炼方括号中似乎不允许使用“this”,但否则我如何获取一组特定的数据?

最佳答案

是的,你不能传入this作为参数名称 - 它是一个保留字。一般来说,我会尽量避免使用 this如果可以的话,用 javascript 编写 - 这真的很棘手。

更可靠的方法是将卡片 HTML 创建为单独的 jQuery 对象并添加特定的点击处理程序,如下所示:

var routine = workouts[i].title;

//create card element
var $card = ("<li><div class='card'><button class='startIt'><div class='cardInfo'><h3>" + routine + "</h3><p>10 min.</p></div></a><a class='cardOptions' href='overview.html'>   <div id='options'><p>Options</p></div></button></div></li>");

//add click handler
$card.find("button.startIt").on("click", function() {
    selectWorkout( workouts[i] );
});

//put card on the page
$("#cardList").append($card);

然后

函数选择锻炼(锻炼) { var selected =锻炼.exercises;

//not sure what you're trying to do here??
$("#cardList").append(selected);

}

您可能会注意到我更改了您的 <a href='#'>进入<button> - 一般来说,可访问性更好!

关于javascript - Onclick 选择特定的 JSON 数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46978122/

相关文章:

jquery - 从 JSON 中提取多个数据集

python - 从键列表中获取 JSON 对象

arrays - 在 postgres 中查询 JSON[] 类型

excel - Application.WorksheetFunction.Match 没有按预期工作

javascript - Jest "Cannot log after tests are done. Did you forget to wait for something async in your test?"

javascript - 数组函数,其位置处的数字返回零

java - 我不明白如何重置这个循环/扫描仪

java - 数组循环性能中哪一个更快?

javascript - svelte 如何使组件变脏

javascript - 当我使用history.go(-1)时,jQuery多选长度返回默认值;