2013-02-22 81 views
2

我无法绕过javascript封闭我的头。我想要4个随机数字,但只能得到最后一个复制4次。Javascript关闭和范围问题

的Javascript

$(function() {  

    function setNewNumber(element) { 
    return function (newNumber) { 
     element.text(newNumber); 
    } 
    } 

    $('.number').each(function() { 
     $.get('http://www.random.org/integers/?num=1&min=1&max=6&col=1&base=10&format=plain&rnd=new', 
     setNewNumber($(this)) 
    ); 
    }); 

}); 

HTML

<div class="number"></div> 
<div class="number"></div> 
<div class="number"></div> 
<div class="number"></div> 

A working plunker example

任何提示?

+1

哇哇哇哇哇你知道JavaScript可以生成它自己的随机数吗? – Aesthete 2013-02-22 00:44:30

+1

@Aesthete:当然,*伪*随机的。 random.org做*真实的事*。 – 2013-02-22 00:46:52

+0

@ExplosionPills:这取决于random.org是否支持[CORS](http://www.w3。org/TR/access-control /)并允许所有的来源。 – 2013-02-22 00:48:43

回答

4

get请求被高速缓存。

http://jsfiddle.net/hCEbd/1/

(也就是说你关闭的理解是正确的,代码工作正常)。

从评论,因为这是相关的:

您可以按他们的API相同的定时器请求random.org多个号码。相反,使用四个要求,使用num=' + $(".number").length,然后做一些解析

+0

“正在缓存获取请求。” --- http://imgs.xkcd.com/comics/random_number.png ;-) – zerkms 2013-02-22 03:44:46

+0

谢谢!这节省了我的一天!值得注意的是,它使用+ Math.random()而不是+(new Date).getTime()可以更好地工作,因为时间戳可能具有大概率连续两次具有相同的值。 – kvaale 2013-02-22 09:49:25

+0

@kvaale你可以在同一个定时器上根据他们的API从random.org请求多个数字。而不是使用四个请求,使用'num ='+ $(“。数字”)。长度',然后做一点解析 – 2013-02-22 15:35:41

0

您试图实现的功能与您的顶级功能有点混淆。如果你想要做的只是将新的随机数设置给元素,则不需要它们中的任何一个。使用ajax可以为您的请求指定几个参数。特别是,你想停止缓存你的请求。您也可以提供一个上下文来引用您的.number元素。

$('.number').each(function() { 
    $.ajax({ 
     type: "GET", 
     url: 'http://www.random.org/integers/?num=1&min=1&max=6&col=1&base=10&format=plain&rnd=new', 
     context: this, 
     success: function(data) { 
     $(this).text(data); 
     }, 
     cache: false 
    }); 
}); 

将该溶液拨弄here.

+0

即使你的意图不起作用:http://jsfiddle.net/hCEbd/2/ - 但是,在ajax回调中的$(this)'是jqXHR,而不是元件。 – 2013-02-22 00:57:58

+0

我的意思是在回调中使用'this',但是jqXHR上的'$()'没有用处 – 2013-02-22 01:24:33

+0

@ExplosionPills - 你说的没错,弄了一下并修改了解决方案。 – Aesthete 2013-02-22 01:26:50

-1

作品:http://plnkr.co/edit/XTOI20kGbFbzdtDaqpLZ

您的请求被缓存。顺便说一句,获取数据的周期 - 这不是一个好主意。

+0

是的,我说已经... – 2013-02-22 01:24:06

+0

@Explosion Pills,实际上,我们说它在同时 – Microfed 2013-02-22 08:28:47

+0

因为已经过去的时间量,Stackoverflow不够具体,但我记得你的答案是我的* 8分钟*。如果你的答案在一到两分钟之内,我不会说任何话,但是在这段时间之后,确切的重复答案应该由我的主人删除。 (顺便说一下,这不是我,降低了你的评价)。 – 2013-02-22 15:38:16

-1

任何jquery ajax请求,如$ .get,都会更改范围。如果你想重用你的setNewWord函数,它需要是全局作用域或作用域的get结果。

看看jsfiddle。 http://jsfiddle.net/justengland/hJnXb/2/

function setNewWord(element) { 
$('#output').append(element + '<br>'); 

}

$(函数(){

$(numbers).each(function() { 
    var url = 'http://www.random.org/integers/?num=1&min=1&max=6&col=1&base=10&format=plain&rnd=new'; 
    $.get(url, setNewWord); 
}); 

});