在Javascript数组内部调用URL变量

Calling A URL Variable Inside Javascript Array

本文关键字:URL 变量 调用 内部 Javascript 数组      更新时间:2023-09-26

我正试图将一组预定的URL以特定的顺序加载到iframe中,每个幻灯片都有特定的时间。

其中一张幻灯片(Events.php)指向一个URL,该URL每次刷新时都会显示随机内容。我试图在Events.php URL中添加一个随机数,以强制它在每次加载到iframe时重新加载。

   <script>
var frames = Array(
                   getRandomUrl(), 5
                   );
var myUniqueTime = getUniqueTime;
/* Now every time you call getRandomUrl you should get back a unique url. */
function getRandomUrl()
{
    return "http://www.example.com/Events.php?=" + myUniqueTime;
}
function ChangeSrc()
{
  if (i >= len) { i = 0; } // start over
  document.getElementById('myiframe').src = frames[i++];
  return setTimeout('ChangeSrc()', (frames[i++]*1000));
}    
/* We'll make a closure here that will make sure you don't get duplicates! */
function getUniqueTime(startingFrom)
{
    startingFrom = startingFrom || (new Date().getTime());
    return function()
    {
        return startingFrom++;
    }
}
var i = 0, len = frames.length;
window.onload = ChangeSrc;

</script>

任何帮助或只是正确方向上的一点都将不胜感激!:)

谢谢,做记号

Javascript循环和闭包令人困惑。而只是使用一个函数:

<script>
var frames = Array(getRandomUrl(), getRandomUrl(), getRandomUrl() );
alert(frames); //remove this - just shows you that it works
var i = 0, len = frames.length;
window.onload = ChangeSrc;
function getRandomUrl()
{
    return "http://www.example.com/Events.php?=" + Math.floor(Math.random()*99999);
}
function ChangeSrc()
{
  if (i >= len) { i = 0; } // start over
  document.getElementById('myiframe').src = frames[i++];
  setTimeout('ChangeSrc()', (frames[i++]*1000));
}    
</script>

查询字符串的语法为:

?field1=value1[&field2=value2...]

您已省略field1,正在使用:

?=value1

其中CCD_ 2是随机数。

这可能不足以指示将其指定为新URL。

试试这样的东西:

return "http://www.example.com/Events.php?rnd=" + Math.floor(Math.random()*99999);

我不太确定你是如何做到这一点的,但让我们试着修改一下这段代码,看看我们是否能让它发挥作用。

首先,对变量声明进行一些更改。根据我收集到的信息,您希望为事件填写一个带有"值"(只是一个字符串)的URL,还希望保存一个"超时时间"(以毫秒为单位)。现在,为了做到这一点,最好创建一个objects的array。在php中,这将是一个带有嵌套关联数组的数字数组(也称为array(array("a"=>"b"), array("c"=>"d"));)。在Javascript中,您使用new Array()[]来启动数组,而不是php的array()"函数"。类似地,如果您调用new Object();或使用{},Javascript将创建一个object(或php中的关联数组)。

/* Update 3: Added this function here to get a random-isch number */
function getUniqueTime(startingFrom){
    startingFrom = startingFrom || new Date().getTime();
    return function(){
        return startingFrom++;
    }
}
var myUniqueTime = getUniqueTime();
/* Update 3: Added an easy way to get unique URLs and not confuse it with timings. */
var frames = [
    {event: 'http://url.tld/?data=' + myUniqueTime(), timeout: 5000},
    {event: 'http://url.tld/?data=' + myUniqueTime(), timeout: 10000},
    {event: 'http://url.tld/?data=' + myUniqueTime(), timeout: 5000}
];

现在我们所需要做的就是稍微修改一下你的函数。从帧数组中获取一个随机元素,然后要求该元素返回您保存在键"event"中的值和键"timeout"中的一个值。

/* Start with i negative so at the first increment it will become 0 and not 1. */
var i = -1;
function ChangeSrc(){
    /* SCheck if i+1 is bigger than frames.length, if so go to 0, otherwise increment. */
    i = i + 1 >= frames.length ? 0 : i + 1;
    var myevent = frames[i];
    console.log(myevent.event)
    setTimeout(ChangeSrc, myevent.timeout);
}
window.onload = ChangeSrc;

最后一件事是,setTimeout函数接受表示函数的变量,所以您只需传递它ChangeSrc本身,而不调用它(所以没有())。它以毫秒为值,因此最好立即在变量中声明这些值。

更新

我仍然不能100%确定你在做什么,但如果你希望字符串每次都不同,你可以使用new Date().getTime(),而不是随机化。它与php strtotime("now")`函数完全相同,每次调用它时字符串都会不同。但也许闭包在这里很有用,所以可以试试这个:

/* We'll make a closure here that will make sure you don't get duplicates! */
function getUniqueTime(startingFrom){
    startingFrom = startingFrom || new Date.getTime();
    return function(){
        return startingFrom++;
    }
}
var myUniqueTime = getUniqueTime();
/* Now every time you call getRandomUrl you should get back a unique url. */
function getRandomUrl(){
    return "http://www.example.com/Events.php?=" + myUniqueTime();
}

这有帮助吗?

更新的原始答案

我在原始答案中添加了随机数生成器。我试着用已经存在的代码来实现这一点,但与我最初的答案相比,这太难了。我添加了一个片段并更新了代码,使其运行更加符合您的预期。

function getUniqueTime(startingFrom){
    startingFrom = startingFrom || new Date().getTime();
    return function(){
        return startingFrom++;
    }
}
var myUniqueTime = getUniqueTime();
var i = -1;
var frames = [
    {event: 'http://url.tld/?data=' + myUniqueTime(), timeout: 5000},
    {event: 'http://url.tld/?data=' + myUniqueTime(), timeout: 10000},
    {event: 'http://url.tld/?data=' + myUniqueTime(), timeout: 5000}
];
function ChangeSrc(){
    i = i + 1 >= frames.length ? 0 : i + 1;
    var myevent = frames[i];
    document.getElementById("console").innerHTML = document.getElementById("console").innerHTML + "<br />" + myevent.event + " (waiting " + myevent.timeout + "s)";
    setTimeout(ChangeSrc, myevent.timeout);
}
window.onload = ChangeSrc;
<div id="console"></div>