我有以下大块的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
?这不是设置全局变量的正确方法吗?
答案 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变量在那里被改变了。