我不确定我想做的事情是否可行,或者是否有更轻松的方法去做我想做的事情。
我有以下代码:
<script>
function TitleSwitch() {
var counter = 0,
fn = function () {
var array = ['Value1','Value2','Value3'];
$(document).prop('title', array[counter]);
counter++;
counter %= array.length;
};
fn();
return fn;
}
setInterval(TitleSwitch(), 5000);
</script>
它每隔5秒在三个变量Value1,Value2和Value3之间旋转页面标题。这很好。
但是,在同一页面上有一些ajax脚本正在轮询与该应用程序相关的其他信息。
我要做的是使用轮询脚本返回的一些数据来更改标题切换功能中的值。
因此,作为示例,轮询数据可能会返回Value4,Value5和Value6。
所以在上面的代码中,有没有办法替换
中的值var array = ['Value1','Value2','Value3'];
来自标题转换功能之外的其他功能?
所以,假设我有一个名为pollingDone()的函数,每次返回轮询数据时都会调用它,如何更改&#34; array&#34;在TitleSwitch()已经使用setInterval运行之后,在pollingDone()中的TitleSwitch()?
基本上,我试图做的是保持TitleSwitch运行,但只是替换使用的值。
我试图这样做的原因是因为标题每5秒在三个值之间切换,但是轮询脚本每10秒运行一次。因此,如果每次轮询脚本完成时都启动了TitleSwitch()函数,则第三个值将永远不会显示在标题中。前两个将显示,轮询脚本将运行,然后标题将重新开始。所以我希望保持TitleSwitch()函数按原样运行,只需替换它正在使用的值。
答案 0 :(得分:4)
您可以通过将array
函数中的fn
公开给外部上下文来实现。
以下是一个例子:
function TitleSwitch() {
var counter = 0;
this.array = ['Value1','Value2','Value3'];
var self = this;
this.fn = function () {
$(document).prop('title', self.array[counter]);
console.log(self.array[counter]);
counter++;
counter %= self.array.length;
};
this.fn();
}
var switcher = new TitleSwitch()
setInterval(switcher.fn, 500);
function asyncFn(){
switcher.array[0] = "changed title1";
}
setTimeout(asyncFn, 1000)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 1 :(得分:1)
在构造函数中传递它,以便您可以从外部控制访问级别。
在示例中:
myArray
是在TitleSwitch
创建的闭包之外定义的。像这样:
function TitleSwitch(array) {
var counter = -1,
fn = function () {
counter++;
counter %= array.length;
// Move to bottom to prevent errors when using a shorter array
console.log(array[counter]);
};
fn();
return fn;
}
var myArray = ['Value1','Value2','Value3'];
setInterval(TitleSwitch(myArray), 1000);
myArray[1] = "TEST";
myArray[2] = "TEST2";
答案 2 :(得分:1)
我认为你必须从你的功能范围中取出你的变量,如下所示:
Undefined variable: "$i".
答案 3 :(得分:0)
无法替换在array
内定义为局部变量的fn
。如果你将它拉到TitleSwitch
之外,你可以给它一个新值。或者,您可以在fn
上使用属性,或构建更复杂的对象,以避免污染环境。
您还想将模数线提升到fn
的开头:例如:如果您有一个5个元素的列表,counter
为4
,并且您将array
替换为2个元素的列表,那么您的代码就会中断。
答案 4 :(得分:0)
var array = ['Value1','Value2','Value3'];
function TitleSwitch() {
var counter = 0,
fn = function () {
$(document).prop('title', array[counter]);
console.log(array[counter]);
counter++;
counter %= array.length;
};
fn();
return fn;
}
setInterval(TitleSwitch(), 5000);
function pollingDoneCallback(data){
if(data){
array=[];
for(var i=0;i<data.length;i++)
array.push(data[i]);
}
}
pollingDoneCallback(['val5','val6']);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>