我正在try 在点击时显示/隐藏更多关于姓名的信息,但不知道如何让它只需点击一次就能工作.

我正在获取包含游戏相关信息的JSON,并使用JS创建一个div,如下所示:

fetch("thething.json")
.then(res => res.json())
.then(data =>{
games = data.map(game => {
const newDiv = document.createElement("div");
newDiv.className = "game-info";
newDiv.innerHTML = `
<p onclick="toggler()";>${game.Name}</p>
<div class="info">
<img src="${game.Thumbnail}">
<p>${game.Description}</p>
</div>
`;
document.body.appendChild(newDiv);
return {name: game.Name, element: newDiv}

JSON本身就有一大堆关于游戏的信息, struct 如下:

[{"Name: "gamename1",
  "Thumbnail: "https://imglocation",
  "Description": "This game is indeed a game"
 },
  {"Name: "gamename2",
  "Thumbnail: "https://imglocation2",
  "Description": "This game2 is indeed a game2"
 }
]

Toggler函数的编写方式如下:

function toggler(){
    $('div.game-info').click(function(e){
        $(this).children('.info').toggle();
    });
}

它有点工作,但它需要一个或多个点击来查看额外的信息.我知道这个问题是由于多个onClick调用,但不知道如何使它与一个单一的点击.我试着使用jQuery而不使用toggler函数,但是它打开了所有名字的信息,而不仅仅是被点击的那个名字.所以,如果有人可以告诉我如何摆脱次要点击或如何正确地定位我点击innerHTML部分的信息,那将是伟大的!

找到答案了.快速跟进问题.我,使用这个设置来查找游戏,但它不会与新代码工作,所以有一种方法使用, "return {name:game. Name,element:newDiv}"来自JQuerry中的上一个版本?

searchInput.addEventListener("input", e=>{
    const value = e.target.value.toLowerCase()
    games.forEach(game =>{
        const isVisible = game.Name.toLowerCase().includes(value)
        game.element.classList.toggle("hide", !isVisible)
    });
})

快速搜索找到答案,如果有人偶然发现在future .seachInput抓取input ="search",然后隐藏不匹配的内容:

const searchInput = document.querySelector("[data-search]")
$(searchInput).on("keyup", function(){
    let value = $(this).val().toLowerCase();
    $(".toggle-info").filter(function(){
        $(this).toggle($(this).text().toLowerCase().indexOf(value) > 
-1)
        });
});

推荐答案

You‘s toggle()函数是建立点击事件的基础.这就是为什么你必须在任何事情发生之前点击一次,在此之前没有事件侦听器.而且,每次你点击它,它都会添加一个新的事件处理程序,这就是为什么你会得到奇怪的重复行为.这就是为什么现在把javascript放在html中,把它放在<script>个标签之间,被认为是不好的做法的原因之一.

此外,$('div.game-info')正在 Select 所有div与类game-info,这可能是为什么它切换所有..on()方法允许您提供第二个参数selector,然后在处理程序函数this中引用触发事件的特定元素,而不是所有元素.

如果您的项目正在使用jQuery,不妨使用它!以下是可能出现的情况:

$.getJSON('thething.json')
  .done(function(data) {
    $('body').append(data.map((game) => `
      <div class="game-info">
        <p class="toggle-info">${game.Name}</p>
        <div class="info">
          <img src="${game.Thumbnail}" alt="${game.Name} thumbnail">
          <p>${game.Description}</p>
        </div>
      </div>`).join(``))
    .find('.info').hide();
  })
  .fail(function(error) {
    //handle errors here
  });

$('body')
  .on('click', '.toggle-info', function() {
    $(this).siblings('.info').slideToggle();
  });

$.getJSON()—假设你的数据源返回有效的JSON,.done()方法的第一个参数将是一个解析的JSON对象,没有额外的步骤.如果源代码无效,可以在.fail()方法中处理.

接下来,您可以创建一个巨大的html字符串,并且只需要修改一次DOM,而不是 for each 游戏修改DOM.然后,您可以再次将事件处理程序放在动态添加的html的某个父级(本例中为body)上,并使用selector参数 Select 处理事件的特定元素.

Javascript相关问答推荐

成帧器运动中的运动组件为何以收件箱开始?

如何判断属于多个元素的属性是否具有多个值之一

按下同意按钮与 puppeteer 师

React 17与React 18中的不同setState行为

在vercel throws上部署带有gunjs的sveltekit应用无法找到模块./' lib/文本编码'

在这种情况下,如何 for each 元素添加id?

如何修复(或忽略)HTML模板中的TypeScript错误?'

用JavaScript复制C#CRC 32生成器

我的服务工作器没有连接到我的Chrome扩展中的内容脚本.我该怎么解决这个问题?

在执行异步导入之前判断模块是否已导入()

如何在文本字段中输入变量?

类构造函数不能在没有用With Router包装的情况下调用

如何将未排序的元素追加到数组的末尾?

为什么我的自定义元素没有被垃圾回收?

搜索功能不是在分页的每一页上进行搜索

如何在AG-Grid文本字段中创建占位符

ReactJS在类组件中更新上下文

找不到处于状态的联系人

通过ng-绑定-html使用插入的HTML中的函数

如何让noWrap在嵌套在Alert/AlertTitle组件中的排版组件中工作?