相关疑难解决方法(0)

循环内的JavaScript闭包 - 简单实用的例子

var funcs = [];
// let's create 3 functions
for (var i = 0; i < 3; i++) {
  // and store them in funcs
  funcs[i] = function() {
    // each should log its value.
    console.log("My value: " + i);
  };
}
for (var j = 0; j < 3; j++) {
  // and now let's run each one to see
  funcs[j]();
}
Run Code Online (Sandbox Code Playgroud)

它输出这个:

我的价值:3
我的价值:3
我的价值:3

而我希望它输出:

我的价值:0
我的价值:1
我的价值:2


使用事件侦听器导致运行函数的延迟时,会出现同样的问题:

var buttons = document.getElementsByTagName("button");
// let's create 3 …
Run Code Online (Sandbox Code Playgroud)

javascript closures loops

2689
推荐指数
25
解决办法
34万
查看次数

如何在Javascript中使用循环生成事件处理程序?

例如,我有一个从AJAX响应生成的10个标签:

<a href="#" id="b1">b1</a>
<a href="#" id="b2">b2</a>
<a href="#" id="b3">b3</a>
<a href="#" id="b4">b4</a>
<a href="#" id="b5">b5</a>
<a href="#" id="b6">b6</a>
<a href="#" id="b7">b7</a>
<a href="#" id="b8">b8</a>
<a href="#" id="b9">b9</a>
<a href="#" id="b10">b10</a>
Run Code Online (Sandbox Code Playgroud)

我需要通过循环为每个人分配onclick事件:

for(i=1; i<11; i++) {
    document.getElementById("b"+i).onclick=function() {
        alert(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,它只分配onclick到最后一个标签并提醒"11".我怎样才能让它发挥作用?我宁愿不使用jQuery.

javascript

21
推荐指数
3
解决办法
1万
查看次数

单击传单标记将您带到URL

在R的宣传资料包中,是否可以点击标记并定向到URL?*

JS中这似乎是可能的。


添加带有URL的独立弹出窗口很容易:

library(leaflet)
content <- paste(sep = "<br/>",
                 "<b><a href='http://www.samurainoodle.com'>Samurai Noodle</a></b>"
)

leaflet() %>% addTiles() %>%
  addPopups(-122.327298, 47.597131,  content,
             options = popupOptions(closeButton = FALSE)
  )
Run Code Online (Sandbox Code Playgroud)

添加标记时也很简单,当单击该标记时,将在弹出窗口中提供一个URL:

leaflet() %>% addTiles() %>%
  addMarkers(-122.327298, 47.597131, popup =  content,
            options = popupOptions(closeButton = FALSE)
  )
Run Code Online (Sandbox Code Playgroud)

也许有一些习惯传递给传单了...吗?


最后,自定义JS函数如何为每个地图标记显示不同的URL?考虑示例data.frame:

df <- data.frame(url = c("/sf/ask/tagged/python/",
                         "/sf/ask/tagged/r/")),
                 lng = c(-122.327298, -122.337298),
                 lat = c(47.597131,47.587131))
Run Code Online (Sandbox Code Playgroud)

* 之前曾有人问过这个问题,但我在这里再问一个问题,并举一个最小的,可复制的例子。

javascript r leaflet htmlwidgets htmltools

5
推荐指数
1
解决办法
202
查看次数

如何使用for()或JavaScript中的其他代码缩短代码?

我想做的事

我想缩短代码。此Drum Play应用程序通过按某些键或用鼠标单击来播放声音。

它可以工作,但是单击事件的代码太长,因为我多次重复了相同的代码。

谁能使它更清洁或更短?

我尝试过的

我尝试了循环,如下所示:

document.querySelector(`div[data-key="${dataKeys[i]}"]`).addEventListener...
Run Code Online (Sandbox Code Playgroud)

但这没有用。

我的当前代码

这是我的代码。

document.querySelector(`div[data-key="${dataKeys[i]}"]`).addEventListener...
Run Code Online (Sandbox Code Playgroud)

如果有人可以使我的代码更简洁或更短,我将不胜感激。

javascript

2
推荐指数
1
解决办法
80
查看次数

在循环中添加addEventListener()仅适用于最后一个按钮

我从dynamodb获取一个json数组,并在遍历按钮时将addEventListener()添加到按钮。但是只有最后一个按钮对此作出响应。

这是在SO上问过的,并且是google上的首个热门产品,因此我将循环更改为使用闭包。但是我仍然不能将addEventListener()附加到最后一个按钮之外。

我最初尝试这样做:

for (var i = 0; i < array_length; ++i) {
    (function(j) {
        var obj = data.Items[j];

        adiv.innerHTML = adiv.innerHTML + "<div class='row'><div class='center-div six columns'>" + obj.Event + ", " + obj.Location + "</div></div>";
        adiv.innerHTML = adiv.innerHTML + "<div class='row'><div class='center-div six columns'>" + obj.Date + ", " + obj.Time + "</div></div>";
        adiv.innerHTML = adiv.innerHTML + "<div class='row'><div class='center-div six columns'><button id='yay_button_" + i + "' class='button-primary'>Deltag</button></div></div>";

        var elem = document.getElementById('yay_button_' + j);
        elem.addEventListener('click', function() …
Run Code Online (Sandbox Code Playgroud)

javascript arrays json addeventlistener

0
推荐指数
1
解决办法
1616
查看次数