JS和Jquery问题

时间:2011-01-02 17:49:27

标签: javascript jquery for-loop

嗨,我遇到了问题,script.js给了我

<div id="gracze">
  <div id="10" class="char" style="z-index: 19; top: 592px; left: 608px; "></div>
  <div id="14" class="char" style="z-index: 25; top: 784px; left: 608px; "></div>
</div>

代替

<div id="gracze">
  <div id="4" class="char" ... ></div>
  <div id="10" class="char" style="z-index: 19; top: 592px; left: 608px; "></div>
  <div id="14" class="char" style="z-index: 25; top: 784px; left: 608px; "></div>
</div>

get_players.php

4/62/6
10/19/19
14/19/25

的script.js

function get_players()
{
    $.ajax({   
    type:   "POST",
    url:    "get_players.php",   
    dataType: "html",  
    success:  function(data) {
        var str = data;
                var chars = str.split("<br />");
                var lol = chars.length;
                for(var i = lol; i--; ) {
                    chars[i] = chars[i].split('/');
                    var o = document.getElementById(chars[i][0]);
                    var aimt = i;
                    if (!o) {
                        if (aimt!=chars.length-1 && aimt != 0) {
                            $('#gracze').html('<div id="'+chars[aimt][0]+'" class="char"></div>'+$('#gracze').html());
                            $('#'+chars[aimt][0]).css("top", chars[aimt][2]*32-16+"px");
                            $('#'+chars[aimt][0]).css("left", chars[aimt][1]*32+"px");
                            $('#'+chars[aimt][0]).css("z-index", chars[aimt][1]*32);
                        }
                    } else {
                        $('#'+chars[aimt][0]).animate({
                            "top": chars[aimt][2]*32-16+"px", "left": chars[aimt][1]*32+"px"
                        }, { duration: 275});
                        //$('#'+chars[aimt][0]).css("top", chars[aimt][1]*32-16+"px");
                        //$('#'+chars[aimt][0]).css("left", chars[aimt][2]*32+"px");
                        $('#'+chars[aimt][0]).css("z-index", chars[aimt][2]);
                    }
                }
        }});
    setTimeout("get_players();", 1000);
}

我认为这是因为for(var i = lol; i--; ) {

2 个答案:

答案 0 :(得分:1)

将循环更改为:

for(var i = lol - 1; i >= 0 ;i-- )

Javascript数组索引以0开头并以数组-1的大小结束(因此,如果数组有5个元素,则第一个将指数为0,最后一个指数为4)。

您的原始循环以数组的大小开始,立即递减(因此访问最后一个元素)。循环继续,直到变量递减到0,此时循环存在,没有使用第一个元素。

请参阅this page关于在javascript中循环数组。


此外,此条件if (aimt!=chars.length-1 && aimt != 0)明确排除了最后一个元素。删除&& aimt != 0

答案 1 :(得分:0)

由于您正在进行反向循环,我会改为使用反向while

var i = chars.length;
while( i-- ) {
    //...and so on
}

这样会更快,会在循环体内给出i的正确值,并且仍会在适当的时间终止循环。

这样做的原因是我已经使用了一个后递减运算符。这意味着i的值为:

while( i-- )

总是比这里的大1:

{
    // ...and so on
}

因此,如果总长度为5,则您将在块中包含正确的索引4

最后,当评估中i1时,它将在块中为0,表示最后一次迭代,它将项目放在第一个索引处。< / p>

下一个传递将在i评估0,并且该块中的代码将不会执行。