请看这段代码:
<script>
var mygrid;
function lock(){
for (var i=1; i<15; i++)
{
var cur_row=i + "";
mygrid.lockRow(cur_row,true);
mygrid.setRowColor(i,"#E5E5E5");
}
}
function doInitGrid(){
mygrid = new SomeClass;
}
</script>
</head>
<body onload="doInitGrid()" dir=rtl>
<div id="mygrid_container" style="width:905px;height:550px;"></div>
<script>lock();</script>
<button onclick="addRow()">Add Row</button>
<button onclick="removeRow()">Remove Row</button>
<button onclick="lock()">lock Row</button>
</body>
为什么当我运行锁定功能时(没有按钮),我的var是未定义的,当我点击按钮时一切正常?
答案 0 :(得分:2)
这是一个时间问题,而不是范围问题。
您只调用doInitGrid()
onload
,因此在文档加载完成之前,它不会为mygrid
分配值。
当你内联lock()
时,你会在加载的情况下这样做。
据推测,在点击按钮之前,您已等待文档完成加载。
答案 1 :(得分:0)
如果“我的var未定义”,则表示变量mygrid
未定义,这是因为您在函数doInitGrid()
内初始化它,直到页面加载时才调用它。 onload事件在整个页面加载完成后发生。其他内联脚本在浏览器在解析文档时遇到它时运行。
答案 2 :(得分:0)
Quentin已经回答了你的问题,但我想补充一点,最好是稍微清理你的代码。这样的事情。
<script>
function lock(mygrid){ //pass in the grid var
for (var i=1; i<15; i++)
{
var cur_row=i + "";
mygrid.lockRow(cur_row,true);
mygrid.setRowColor(i,"#E5E5E5");
}
}
function getInitGrid(){
//some initialization code here maybe. Otherwise just take this out
return new SomeClass;//return an instance
}
var mygrid = getInitGrid();
//and then pass in the mygrid variable wherever you call lock
lock(mygrid);
</script>
答案 3 :(得分:0)
我不确定你在没有点击按钮的情况下调用了锁定功能。但是,执行锁定功能时,似乎没有执行doInitGrid函数。以下代码可能有效
function lock(){
if(!mygrid){
doInitGrid();
}
for (var i=1; i<15; i++)
{
var cur_row=i + "";
mygrid.lockRow(cur_row,true);
mygrid.setRowColor(i,"#E5E5E5");
}
}
答案 4 :(得分:0)
在文档完全加载之前,您正在调用load()
。因此,您的变量未分配,因为尚未调用doInitgrid
。(只有在文档完全加载后才会调用它)
答案 5 :(得分:0)
您正在函数mygrid
中实例化doInitGrid()
,该函数仅在onload上调用。但是您的脚本语句<script>lock();</script>
在页面加载之前执行,因为它是页面HTML的一部分。执行此脚本块时,mygrid的值为undefined
,这是JS为没有初始值声明的所有变量设置的默认值。
如果你想在页面加载时调用lock(),请在调用doInitGrid()之后在onload上调用它,如下所示:
<body onload="doInitGrid(); lock();" dir=rtl>