原代码:
switch (Rows[k].isModifyStatus)
{
case DWBUF_NEWMODIFY:
sUpdateType="i"
break;
case DWBUF_DATAMODIFY:
sUpdateType="u"
break;
case DWBUF_NOTMODIFY:
if (abSubitAll)
{ //提交所有数据
sUpdateType="n"
}
else
{
continue;
}
break;
default:
continue;
break;
}
DWBUF_NOTMODIFY是常量为0,可以当Rows[k].isModifyStatus确实为0的时候,
却无法进入其case语句执行,而进入default段执行了。用if else替换后的代码:
if (Rows[k].isModifyStatus==DWBUF_NEWMODIFY)
sUpdateType="i"
else if (Rows[k].isModifyStatus==DWBUF_DATAMODIFY)
sUpdateType="u"
else if (Rows[k].isModifyStatus==DWBUF_NOTMODIFY)
{
if (abSubitAll)
{ //提交所有数据
sUpdateType="n"
}
else
{
//check null
if (abCheckAll)
{
if (checkNull(k)==-1) return -1
}
continue;
}
}
else
{
if (Rows[k].isModifyStatus!=DWBUF_NEW) alert("不合法的行状态类型:"+Rows[k].isModifyStatus)
continue;
}
却能够正确执行
switch (Rows[k].isModifyStatus)
{
case DWBUF_NEWMODIFY:
sUpdateType="i"
break;
case DWBUF_DATAMODIFY:
sUpdateType="u"
break;
case DWBUF_NOTMODIFY:
if (abSubitAll)
{ //提交所有数据
sUpdateType="n"
}
else
{
continue;
}
break;
default:
continue;
break;
}
DWBUF_NOTMODIFY是常量为0,可以当Rows[k].isModifyStatus确实为0的时候,
却无法进入其case语句执行,而进入default段执行了。用if else替换后的代码:
if (Rows[k].isModifyStatus==DWBUF_NEWMODIFY)
sUpdateType="i"
else if (Rows[k].isModifyStatus==DWBUF_DATAMODIFY)
sUpdateType="u"
else if (Rows[k].isModifyStatus==DWBUF_NOTMODIFY)
{
if (abSubitAll)
{ //提交所有数据
sUpdateType="n"
}
else
{
//check null
if (abCheckAll)
{
if (checkNull(k)==-1) return -1
}
continue;
}
}
else
{
if (Rows[k].isModifyStatus!=DWBUF_NEW) alert("不合法的行状态类型:"+Rows[k].isModifyStatus)
continue;
}
却能够正确执行
{
case DWBUF_NEWMODIFY.toString():
sUpdateType="i"
break;
case DWBUF_DATAMODIFY.toString():
sUpdateType="u"
break;
case DWBUF_NOTMODIFY.toString():
if (abSubitAll)
{ //提交所有数据
sUpdateType="n"
}
else
{
continue;
}
break;
default:
continue;
break;
}
vc版有个DestinyDoctor也是你吗?
var DWBUF_NEWMODIFY = 1
var DWBUF_DATAMODIFY = 2
var DWBUF_NOTMODIFY = 0
var sUpdateType
var abSubitAll = true
var Rows = new Array();
function MyObj(){
this.isModifyStatus = 0;
}
function newHighlite(v) {
Rows[0] = new MyObj();
alert(typeof(Rows[0].isModifyStatus));
alert(typeof(DWBUF_NOTMODIFY));
alert(typeof(Rows[0].isModifyStatus.toString()));
alert(typeof(DWBUF_NOTMODIFY.toString()));
try{
switch (Rows[0].isModifyStatus.toString()){
case DWBUF_NEWMODIFY.toString():
sUpdateType="i"
alert("DWBUF_NEWMODIFY1");
break;
case DWBUF_DATAMODIFY.toString(): sUpdateType="u"
alert("DWBUF_DATAMODIFY2");
break;
case DWBUF_NOTMODIFY.toString():
if (abSubitAll)
{ //提交所有数据
sUpdateType="n"
}
else
{
}
alert("DWBUF_NOTMODIFY0");
break;
default:
alert("default");
break;
} }
catch(e){
alert("Err")
}
}
alert(end);
</SCRIPT><input type=button value=button onclick="newHighlite()">正如ptma(守望者)说得
用toString()后,问题解决,
不过如fantiny写的,var DWBUF_NEWMODIFY = 1
var DWBUF_DATAMODIFY = 2
var DWBUF_NOTMODIFY = 0 我定义的是整数,而且在外部设置isModifyStatus的时候都是这种调用方式:
dwBrowse.setrowstatus(uRow,dwBrowse.DW_NOTMODIFY)
不可能出现如:
dwBrowse.setrowstatus(uRow,"0")
的赋值方式,请问一下,怎么在后来又变为字符串类型的了?
这算是Javascript的bug吧?另外,用if没有问题,我测试过是应为if("0"==0) 是为真的。期待高手说明一下原理。
关键是要看你里面的声明是什么类型,跟DW_NOTMODIFY的类型无关。javascript有自动转换类型的机制。
switch也许比较特殊。
var string1 = "Hello";
var string2 = "Hello";// 具有相同值的两个 String 对象。
var StringObject1 = new String(string1);
var StringObject2 = new String(string2);// 比较结果为 true。
if (string1 == string2)
// 执行某些命令(将要运行的)。// 比较结果为 false。
if (StringObject1 == StringObject2)
//执行某些命令(不会运行)。// 要比较 String 对象的值,
// 用 toString() 或者 valueOf() 方法。
if (StringObject1.valueOf() == StringObject2)
//执行某些命令(将要运行的)。
关键是要看你里面的声明是什么类型,跟DW_NOTMODIFY的类型无关。javascript有自动转换类型的机制。
switch也许比较特殊。
-----
我内部声明的确实是int型的
控件外部属性初始值设为:
<public:property NAME="DW_NOTMODIFY" VALUE=0 />
<public:property NAME="DW_NEW" VALUE=1 />
<public:property NAME="DW_NEWMODIFY" VALUE=2 />
<public:property NAME="DW_DATAMODIFY" VALUE=3 />设置isModifyStatus也是用
控件名.setrowstatus(uRow,控件名.DW_NOTMODIFY)的方法实现的setrowstatus方法的代码:
function setRowStatus(row,status)
{
if (Rows.length == 0) return 1;
Rows[row].isModifyStatus = status
return 1;
}不知道为什么它会给我转成字符类型。
主要是这个问题想不明白。