CSS动画无法正确使用PHP数组中的JavaScript变量

CSS动画无法正确使用PHP数组中的JavaScript变量,javascript,php,css,json,animation,Javascript,Php,Css,Json,Animation,我有一个脚本,可以从PHP获取一个对象数组 我能够将脚本的结果输出到Div中,以便在我的站点上显示 接下来我有一些CSS动画,只有当变量的长度大于div width时才会出现动画。。。我遇到的问题是,当我将脚本与CSS动画合并时,动画不起作用,但在下面的JSFIDLE测试中它确实起作用: (我目前只在FIREFOX中使用此功能,但稍后将添加其他浏览器支持) 在测试中,您可以看到我创建了两个变量,一个比div宽度短,一个比div宽度长。一切都正常工作,超过div宽度的信息按预期来回反弹 下面是我

我有一个脚本,可以从PHP获取一个对象数组

我能够将脚本的结果输出到Div中,以便在我的站点上显示

接下来我有一些CSS动画,只有当变量的长度大于div width时才会出现动画。。。我遇到的问题是,当我将脚本与CSS动画合并时,动画不起作用,但在下面的JSFIDLE测试中它确实起作用:

(我目前只在FIREFOX中使用此功能,但稍后将添加其他浏览器支持)

在测试中,您可以看到我创建了两个变量,一个比div宽度短,一个比div宽度长。一切都正常工作,超过div宽度的信息按预期来回反弹

下面是我有问题的脚本,它从JSON编码的PHP数组中获取一个对象数组。函数“getPlayList”循环遍历JSON对象的元素,我使用“document.getElementById”来命名元素,以便在我的HTML代码中使用它们,然后设置一个计时器以每秒刷新一次

但是当我使用my脚本时,会显示变量信息,但是没有动画但是当我在上面看到的JSFIDLE中模拟我的脚本时,一切正常,我有点不明白为什么会发生这种情况,但问题似乎完全与my脚本有关:

我的脚本

function getPlaylist() {
    var xmlhttp,
    timer;

    if (window.XMLHttpRequest) {
       xmlhttp = new XMLHttpRequest();
    }
    else {
       xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

xmlhttp.onreadystatechange = function () {

if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {

    try {
        var list = JSON.parse(xmlhttp.responseText);

        if (list && typeof list === 'object') {

            for (var i = 0; i < list.length; i++) {

                var currentItem = list[i];

                document.getElementById("list0artist").innerHTML=list[0].artist;
            document.getElementById("list0title").innerHTML=list[0].title;

            }

       }

    } catch(e) {

        throw new Error("Bad response...");

    }

}
};

xmlhttp.open("GET", "playlist.php?t=" + Math.random(), true);
xmlhttp.send();

timer = setTimeout(getPlaylist, 1000);
}
函数getPlaylist(){ var xmlhttp, 定时器; if(window.XMLHttpRequest){ xmlhttp=新的XMLHttpRequest(); } 否则{ xmlhttp=新的ActiveXObject(“Microsoft.xmlhttp”); } xmlhttp.onreadystatechange=函数(){ if(xmlhttp.readyState==4&&xmlhttp.status==200){ 试一试{ var list=JSON.parse(xmlhttp.responseText); if(list&&typeof list==='object'){ 对于(变量i=0;i 如果您有任何想法,我们将不胜感激。。。。谢谢

更新:

下面是我实际脚本的HTML和CSS代码,我使用“body onload”将脚本变量加载到HTML中

<!doctype html>
<html><head>
<script src="/testsite/AlternativeSecondPlaylist.js"></script>

<meta charset="utf-8">
<title>Untitled Document</title>
</head>

<style type="text/css">
#wrapper {
    width: 257.4px;
    height: 41.85px;
    overflow: hidden;
    background-color: #383838;
    color: #FFFFFF;
    line-height: 41.85px;
    font-size: 80%;
    font-family: baumans;
    color: #FFFFFF;
    position:relative;
    }
.nowPlayNoAnimate {
    position:absolute;
    white-space:nowrap;
    overflow: hidden;
}
.nowPlayAnimate {
    -moz-animation-duration: 2s;
    -moz-animation-name: slidein;
    -moz-animation-iteration-count: infinite;
    -moz-animation-direction: alternate;
    -moz-animation-timing-function: linear;
}

@-moz-keyframes slidein {
    from {
        transform:translateX(0);
    }
    to {
        transform:translateX(calc(-100% + 257px)); /* -100% + parent width */
    }
}

</style>
<body onload="getPlaylist()">

<div id="wrapper">
    <div id="list0artist" class="nowPlayNoAnimate"></div>
</div>

<div id="wrapper">
    <div id="list0title" class="nowPlayNoAnimate"></div>
</div>

<script>
var animate = document.getElementsByClassName('nowPlayNoAnimate');

for (var i = 0; i < animate.length; i++) {
    if (animate[i].parentNode.offsetWidth < animate[i].offsetWidth) {
animate[i].classList.add("nowPlayAnimate");
}
}
</script>
</body>
</html>

无标题文件
#包装纸{
宽度:257.4px;
高度:41.85px;
溢出:隐藏;
背景色:#3838;
颜色:#FFFFFF;
线高:41.85px;
字号:80%;
字体系列:baumans;
颜色:#FFFFFF;
位置:相对位置;
}
.nowPlayNoAnimate{
位置:绝对位置;
空白:nowrap;
溢出:隐藏;
}
.NowPlay动画{
-moz动画持续时间:2s;
-moz动画名称:slidein;
-moz动画迭代次数:无限;
-moz动画方向:交替;
-moz动画计时功能:线性;
}
@-moz关键帧幻灯片{
从{
变换:translateX(0);
}
到{
变换:translateX(计算(-100%+257px));/*-100%+父宽度*/
}
}
var animate=document.getElementsByClassName('nowplaynanimate');
对于(var i=0;i
动画脚本只执行一次,而ajax调用每秒执行一次。自从第二次执行getPlaylist()以来,无论动画脚本更改了什么,都会恢复,您需要像这样再次运行它们:

xmlhttp.onreadystatechange = function () {

if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {

    try {
        var list = JSON.parse(xmlhttp.responseText);

        if (list && typeof list === 'object') {

            for (var i = 0; i < list.length; i++) {

                var currentItem = list[i];

                document.getElementById("list0artist").innerHTML=list[0].artist;
                document.getElementById("list0title").innerHTML=list[0].title;
                var animate = document.getElementsByClassName('nowPlayNoAnimate');

                for (var i = 0; i < animate.length; i++) {
                    if (animate[i].parentNode.offsetWidth < animate[i].offsetWidth) {
                        animate[i].classList.add("nowPlayAnimate");
                    }
                }
            }
       }

    } catch(e) {

        throw new Error("Bad response...");

    }

}
};
xmlhttp.onreadystatechange=函数(){
if(xmlhttp.readyState==4&&xmlhttp.status==200){
试一试{
var list=JSON.parse(xmlhttp.responseText);
if(list&&typeof list==='object'){
对于(变量i=0;i

我还强烈建议,不要立即发送ajax请求,因为这可能会显著降低服务器的速度。假设有1000人在浏览器选项卡中打开页面12小时,从那以后,你每秒将有100个请求。

你确定在填充
list0artist
list0title
元素后正在执行动画脚本吗?哦,每隔一秒发出一个ajax请求通常是个坏主意。@VolkanUlukut我已经更新了我的问题,并为实际脚本添加了html代码……你呢是那个男人。。。谢谢你解释这个。。。也。。计时器最终将基于来自服务器的歌曲长度,并且仅在歌曲结束时刷新。。。。我知道很多请求都会烧坏我的服务器。我有一个小问题,如果文本对于div来说太大,那么文本就会动画化。。。很好!!,但是,当一个新变量被发送到页面时,页面会记住旧的“nowPlayAnimate”类,并继续设置动画,即使文本太小,不需要设置动画。。。我如何告诉页面恢复到“nowPlay”的原始状态