神秘改变Javascript变量

时间:2012-12-27 08:56:02

标签: php javascript variables global

我有以下大块的JS,我用一些PHP定义var i

<script type="text/javascript">
    var i = <?php echo $photo_count; ?>;
    function updatePreview(){
        var x = document.getElementById('preimage').value;
        var y = document.getElementById('precapt').value;
        var preview = "";
        var special = document.getElementById('special').value;

        i++;
        preview += "<div id='smallbox"+i+"' class='smallbox'><table><tr><td rowspan='2'><img id='picture"+i+"' src='"+x+"' /><br /><input type='button' onclick='removeimg("+i+");' value='delete' /></td><td>URL: <input onchange='updateimg("+i+");' type='text' id='image"+i+"' value='"+x+"'/></td></tr><tr><td>Caption: <input type='text' id='capt"+i+"' value='"+y+"'/></td></tr></table></div><hr />";
        //window.alert(preview);



        //document.getElementById('special').value += "#"+x+"|"+y;
        document.getElementById('preview').innerHTML += preview;
        document.getElementById('preimage').value = "";
        document.getElementById('precapt').value = "";
        //window.alert(document.getElementById('special').value);
    }

    function showSubmit(){
        window.alert("i = "+i);
        document.getElementById('hideImg').style.display = "none";
        document.getElementById('hideTags').style.display = "block";
        while(i>1){
            var img = document.getElementById("image"+i).value;
            var capt = document.getElementById("capt"+i).value;
            if(img.length>3){
                document.getElementById('special').value += "#"+img+"|"+capt;
                window.alert(document.getElementById('special').value);
                window.alert("i = "+i);
                document.getElementById('preview2').innerHTML += "<img class='postpreviewimg' src='"+img+"' />";
            }
            i--;
        }
        document.getElementById('preview').style.display = "none";
    }
</script>

在页面的源代码中,我可以看到PHP正确定义i,但在showSubmit()的第一行,我alert(i)显示i的值是1,除非先调用updatePreview()

换句话说..如果网页来源如下:var i = 36;然后我调用函数showSubmit(),当它应该提醒i = 1 i = 36 p>

每次调用updatePreview()i将从1增加而不是从36增加。

我是否错误地定义了i?这不是设置全局变量的正确方法吗?

1 个答案:

答案 0 :(得分:4)

您将i定义为全局变量。因此,页面上使用i=10之类的每个脚本都会更改此值。

由于i是常用的变量计数器名称,因此很可能会有一个更改它的脚本。如果您使用var MyPhotoCount = <?php echo $photo_count; ?>;作为名称,则更有可能发挥作用。

即使在此脚本之前或之后包含此其他脚本,也可能会导致问题。另一个脚本可能使用on ready function或在您致电ShowSubmit();之前触发的任何其他延迟

全局变量应始终是唯一的。你也刚刚找到了使用它们从来不是一个好主意的原因。你不能相信他们的价值。

更新:

您在页面上包含nicEdit.js,该脚本包含以下代码(完整源代码为第185行):

domLoaded : function() {
    if (arguments.callee.done) return;
    arguments.callee.done = true;
    for (i = 0;i < bkLib.domLoad.length;i++) bkLib.domLoad[i]();
},

你的i变量在那里被改变了。