2013-02-22 70 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); 
}); 

});