我真的很挣这个 - 确定我错过了一些简单的东西。
这是代码: -
function webcamupdate(webcamurl) {
alert("I am a function to update the webcam with the url "+webcamurl);
}
function countdown(callback) {
alert(callback);
setTimeout("callback()", 10000);
}
var theurl = "THIS IS THE URL";
countdown(function(){ webcamupdate(theurl); });
正如你所看到的,我正在试图建立一个倒计时功能(有更多的代码,但我刚刚发布了基础知识),这将在10秒后运行一个功能(在这种情况下更新网络摄像头)。
如果函数没有参数,则一切正常,但是coundown函数中的警报(回调)会返回以下内容: -
function(){webcamupdate(theurl); }
当webcamupdate函数运行时,这当然会导致脚本崩溃,因为没有定义“webcamurl”。
实际需要说的是什么警报(回调): -
function(){webcamupdate(“这是网址”); }
即。它在使用函数传递之前评估参数“theurl”。
非常感谢任何想法
修改
我想我可能误导了我使用警报而不是功能(我只是想保持简单!)
这是原始代码(仍然缩减,但会给你一个更好的主意)。
function webcamupdate(url) {
document.getElementById("cruisecam").src=url+"&rand="+Math.random();
countdown(30,"Webcam",function(){ webcamupdate(url); });
}
function countdown(currentcount,displayelement,callback) {
var displaytext;
if (currentcount == 0 ) displaytext = displayelement+" is refreshing now";
else displaytext = displayelement+" updating in "+currentcount+" seconds";
if (trackingcountdown.hasChildNodes()) clearelement("trackingcountdown");
trackingcountdown.appendChild(document.createTextNode(displaytext));
if (currentcount == 0) {
countdown(currentcount,displayelement,callback)
}
else {
currentcount--;
var countdownparameters=currentcount+',"'+displayelement+'",'+callback;
setTimeout("countdown("+countdownparameters+")", 1000);
}
}
//The function is called on window loading with
//countdown(30,"Webcam",function(){ webcamupdate(url); });
//clearelement is another function (not listed) that clears the node.
基本上,它是重要的倒计时功能 - 它需要3个参数 - 以秒为单位的倒计时时间,显示倒计时的DOM元素,以及在超时时运行的功能。
如果第三个参数(函数)没有自己的任何参数 - 例如网络摄像头() - 它运行正常,但是当我们尝试添加网络摄像头(“webcampic.jpg”)时,由于尝试运行网络摄像头(网址)而不是网络摄像头(“webcampic.jpg”),它无法正常工作。
显然最简单的解决办法就是让url成为一个全局变量,但这不是一个好习惯,并且会阻止我通过js文件在其他页面上使用倒计时代码。 帮助!
答案 0 :(得分:3)
只需从callback()
更改为传递函数引用即可。
function webcamupdate(webcamurl) {
alert("I am a function to update the webcam with the url "+webcamurl);
}
function countdown(callback) {
alert(callback);
setTimeout(callback, 10000);
}
var theurl = "THIS IS THE URL";
countdown(function(){ webcamupdate(theurl); });
答案 1 :(得分:0)
var theURL = "THIS IS THE URL";
function webCamUrlUpdate( url ) {
alert( "I am a function to update the webcam with the url " + url );
}
function countDown( callback ) {
setTimeout( callback, 10000 );
alert( callback );
}
countDown(function () {
/* IMPORTANT: need to return that other function */
return webCamUrlUpdate( theURL );
});
您实际上希望返回该函数,以便setTimeout( callback, 10000 );
按预期运行。当您在Javascript中提醒函数时,它与alert(callback.toString())
相同,以获取函数头和正文的完整字符串版本。
http://jsfiddle.net/btleffler/xJ5uw/
有趣的是,如果你在setTimeout()
之前提醒回调,那么回调似乎不会被激活。如果您注释掉第一个警报,或者在设置超时后发出警报,它就可以正常工作。我只在Chrome中测试过,所以我想做更多的研究。
无论哪种方式,在实际调用函数之前,您不能对函数的参数进行javascript解析(或处理或其他)。你可以让countDown()
中的匿名回调通过自己提醒网址。
答案 2 :(得分:0)
好的伙计 - 我自己终于解决了 - 这是其他人的解决方案。
首先创建一个返回函数的函数:
function createfunctionwebcamupdate(url) {
return function(){ webcamupdate(url); };
}
然后设置一个变量以在调用函数时触发该函数:
webcamupdatefunction = createfunctionwebcamupdate(url);
然后将此新变量称为回调函数:
function(){ webcamupdatefunction(); }
当调用变量时,Javascript显然会记住存储在createfunction
部分中的变量。
希望这有帮助。