Javascript 代码在没有警报的情况下无法工作,否则它可以完美运行
Javascript code that doesn't work without an alert before it, otherwise it works perfectly
在提出问题之前,我试图真正查找这个问题,但看起来我在这里陷入困境,想看看是否有人知道这个问题的明确答案。我见过一两个类似的问题,但他们似乎没有指出我的问题,或者至少我不明白他们在做什么。
我正在开发一个 RPG 系统音频 PHP 函数,该功能在调用时播放音乐,如果用户没有静音的音乐选项,它会使用音频标签。(在函数中 $song 是放入第一个参数的歌曲。现在,如果调用此函数以使恢复为真,则它使用一些javascript。请原谅代码,因为它有点混乱(对我来说),但以下是包含 javascript 代码的代码:
function playmusic($song, $resume=false, $loop=true)
{
global $baseurl, $loggeduser;
if ($resume == true)
{
$buttons = "
<button onclick='"resetplaytime()'" type='"button'">Reset</button>
<button onclick='"alertplaytime()'" type='"button'">Alert Time</button>";
$resume = "
<script type='"text/javascript'">
var curmusic_$song = document.getElementById('"music_$song'");
var musictime = getcookie('"musicplaytime_$song'");
if (musictime != null && musictime != '"'")
{
alert(musictime);
curmusic_$song.currentTime = musictime;
}
window.onload=settimecookie();
function getcookie(c_name)
{
var i,x,y,ARRcookies=document.cookie.split('";'");
for (i=0;i<ARRcookies.length;i++)
{
x=ARRcookies[i].substr(0,ARRcookies[i].indexOf('"='"));
y=ARRcookies[i].substr(ARRcookies[i].indexOf('"='")+1);
x=x.replace(/^'s+|'s+$/g,'"'");
if (x==c_name)
{
return unescape(y);
}
}
}
function settimecookie()
{
var playtime = curmusic_$song.currentTime;
if (playtime != null && playtime != '"'")
{
document.cookie = 'musicplaytime_$song=' + playtime;
}
setTimeout('"settimecookie()'", 50);
}
function alertplaytime()
{
alert(musictime);
}
function resetplaytime()
{
curmusic_$song.currentTime=0;
}
</script>";
}
if ($loop == true)
{
$songloop = " loop='"true'"";
}
if ($loggeduser['mutemusic'] == 0)
{
return "
</table>
$buttons
<audio id='"music_$song'" autoplay='"true'"$songloop preload='"true'">
<source src='"$baseurl/boardfiles/effects/$song.ogg'" type='"audio/ogg'" />
<source src='"$baseurl/boardfiles/effects/$song.mp3'" type='"audio/mp3'" />
</audio>
$resume
<table class='"brdr'" cellpadding='"0'">";
}
}
现在,如果我将警报从将音频标签的播放时间设置为 cookie 值的循环中取出,则整个脚本不起作用(就像什么都不做一样),除非您使用按钮直接调用其中一个函数,然后该函数工作。
我已经尝试了一些事情,从使其成为函数并直接调用它(它似乎仅适用于 onclick 事件,但如果您希望它在加载或某些自动事件时运行,那么它会失败)。 现在我没主意了。
我希望得到一个答案,因为我相信这段代码可以帮助那些一直试图获得某种恢复音频功能的人,这些功能使用起来并不笨重或令人困惑。 :)我一直在努力寻找解决方案,但从未如此接近。感谢您的阅读。如果你想要整个PHP函数,那么我也会展示它,但除了两个调试按钮(重置和警报cookie)和ID为"music_$song"的音频标签之外,真的没有什么可看的。
编辑:为了清楚起见,在代码中,双引号前有转义,因为javascript是在PHP函数中返回的。
编辑2:现在加粗此编辑,因为它已被某些人错过。此外,我还添加了PHP部分。
最后编辑:我现在似乎想出了一些东西,让我更接近我想要实现的目标。我将上面的代码更改为以下内容,它对我来说完美无缺。
function playmusic($song, $resume=false, $loop=true)
{
global $baseurl, $loggeduser;
if ($resume == true)
{
$resume = "
<!--
<button onclick='"resetplaytime();'" type='"button'">Reset</button>
<button onclick='"alertplaytime();'" type='"button'">Alert Time</button>
<button onclick='"settimecookie();'" type='"button'">Start Cookie tracking</button>
-->
<script type='"text/javascript'">
function getcookie(c_name)
{
var i,x,y,ARRcookies=document.cookie.split('";'");
for (i=0;i<ARRcookies.length;i++)
{
x=ARRcookies[i].substr(0,ARRcookies[i].indexOf('"='"));
y=ARRcookies[i].substr(ARRcookies[i].indexOf('"='")+1);
x=x.replace(/^'s+|'s+$/g,'"'");
if (x==c_name)
{
return unescape(y);
}
}
}
function settimecookie()
{
var curmusic_$song = document.getElementById('"music_$song'");
var playtime = curmusic_$song.currentTime;
if (playtime != null && playtime != '"'")
{
document.cookie = '"musicplaytime_$song='" + playtime;
}
setTimeout('"settimecookie()'", 50);
}
function resumeplaytime()
{
var curmusic_$song = document.getElementById('"music_$song'");
var musictime = getcookie('"musicplaytime_$song'");
if (musictime != null && musictime != '"'")
{
curmusic_$song.currentTime = musictime;
}
curmusic_$song.play();
settimecookie();
}
window.onload=resumeplaytime;
function alertplaytime()
{
var musictime = getcookie('"musicplaytime_$song'");
alert(musictime);
}
function resetplaytime()
{
var curmusic_$song = document.getElementById('"music_$song'");
curmusic_$song.currentTime=0;
}
</script>";
}
else
{
$autoplay = "autoplay='"true'"";
}
if ($loop == true)
{
$songloop = " loop='"true'"";
}
if ($loggeduser['mutemusic'] == 0)
{
return "
</table>
$resume
<audio id='"music_$song'" $autoplay$songloop preload='"true'">
<source src='"$baseurl/boardfiles/effects/$song.ogg'" type='"audio/ogg'" />
<source src='"$baseurl/boardfiles/effects/$song.mp3'" type='"audio/mp3'" />
</audio>
<table class='"brdr'" cellpadding='"0'">";
}
}
它现在似乎工作得很好。我改变了一些东西,现在按照我想要的方式工作。感谢您的帮助!:)
看起来您尝试在 DOM 可用之前执行document.getElementById("music_$song")
。为此使用加载处理程序。
然而,我找不到任何可以等待alert()
或alertplaytime()
的电话 - 尤其是不像你描述的那样循环。
此外,线路window.onload=settimecookie();
是错误的。 settimecookie
在执行 beeing 时不返回事件处理程序函数。
- 如何使用phaser使html5游戏在移动设备浏览器上运行
- 使用压缩的JavaScript文件(不是运行时压缩)
- Javascript运行php文件,然后下载文件
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- 我已经创建了一个jquery转盘,并使用if条件来运行和停止转盘
- Angularjs代码未在匿名函数中运行
- jquery设置为使用参数运行
- 如何根据时间运行不同的脚本
- 漂亮的照片在Dreamweaver上完美运行;但不能在任何浏览器上在线工作
- jqgrid没有在服务器acugis中加载数据,而是在本地运行,一切都很完美
- Ajax在台式机上完美运行,但在手机/平板电脑上则不然
- 脚本在除IE之外的所有其他浏览器中都能完美运行
- 在小提琴完美运行,但 JQuery 对网页没有影响
- Jquery对话框在IE中完美运行,但在FF和Chrome中则不然
- Javascript 代码在没有警报的情况下无法工作,否则它可以完美运行
- Javascript在IE7,8,9中返回控制台错误,但在所有其他浏览器中都能完美运行
- 如果我应用断点并在调试模式下运行应用程序,则应用程序可以完美运行
- 我的脚本运行完美,直到我包装它在这个if(屏幕).宽度& lt;980){}语句检查屏幕大小
- ReCaptcha不会在IE中加载/显示,但在Chrome和safari中可以完美运行
- 窗口滚动jQuery动画无法完美运行