0

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

<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 = 1i = 36

每次updatePreview()调用i都会从 1 开始递增,而不是从 36 开始。

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

4

1 回答 1

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 变量在那里更改。

于 2012-12-27T09:01:20.327 回答