【问题标题】:Passing an object at runtime to a javascript function在运行时将对象传递给 javascript 函数
【发布时间】:2017-08-20 22:07:33
【问题描述】:

在运行时,我有 Javascript 创建 html,我想在它们上绑定一个对象,以便稍后传递给一个函数。

类似这样的:

var projects = //(json object)
projects.forEach(function(p) {
   $("#container").append("<div onclick=handleClick(p)></div>");
});

function handleClick(p) {
  //...
}

似乎这样做会使p 成为字符串[object object] 而不是实际的Project 对象,并且使用JQuery 的内置$.click 函数是一回事。我知道我必须以某种方式在运行时将这些元素绑定到一个函数。

在没有过多搜索和 DOM 访问的情况下执行此类操作的正确方法是什么?

【问题讨论】:

  • 您可以使用 jQuery 的 .data() 方法将对象存储在相关元素上。然后在点击处理程序中使用$(this).data() 来检索它。阅读the .data() doco 并尝试一下;如果仍有问题,请回来。
  • 处理对父级的点击,并根据点击的 div 决定。如果您有一个 id 来识别点击了哪个项目,您可以将其用作数据属性,以便您识别

标签: javascript jquery


【解决方案1】:

您可以使用 JavaScript 而不是内联 HTML 处理程序创建内容并设置其点击处理程序。

var projects = [{id: 1}, {id:2}, {id:3}];
projects.forEach(function(p) {
   $("#container").append($("<div>Test </div>").click(function(e){
       handleClick(p);
   }));
});

function handleClick(p) {
  console.log('Clicked project', p.id);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="container">
Content here
</div>

请注意,更好的选择(因为您只需要一个处理程序,并且您不必担心以后添加处理程序)是在父级上设置一个处理程序,您可以在每个 div 上使用 data-pid 属性这将使您的处理程序根据单击的 div 找到正确的项目。

$(() => {
  var projects = [{id: 1}, {id: 2}, {id: 3}];
  projects.forEach(function(p) {
    $("#container").append("<div class=clicky data-pid=" + p.id + ">Project " + p.id + " </div>");
  });
  $("#container").click('.clicky', (e) => {
    console.log('Clicked paragraph for ' + $(e.target).data('pid'));
  })

})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="container">
  Content
</div>

【讨论】:

  • 谢谢!正是我正在寻找的解决方案
  • .. 虽然你的第二个例子是对的,因为项目将在没有页面刷新的情况下更新,所以稍后添加更多处理程序似乎是个坏主意。将使用您的第二种方法
  • 我正在考虑你的第二种方法,但我的对象比你的复杂得多,并且嵌套在多个 json 层和数组中,我必须从看起来像 search the json data file for the object from the id我想避免的。您对此有什么建议吗,或者我应该采用第二种方法并在 DOM 中创建新项目时重新绑定?
  • 我的建议是尽可能使用单个处理程序。搜索您的结构不会那么昂贵。如果需要,创建与您链接到的答案类似的地图
猜你喜欢
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
相关资源
最近更新 更多