我正在尝试修复我继承的产品中的一些错误,并且我有这个javascript的片段,应该是几个盒子并弹出一个确认框。目前发生的事情是我看到方框改变颜色并且有5秒左右的延迟,然后就好像缺失的确认只是接受了它自己。有没有人比我在这段代码中看到任何错误更聪明?
function lastCheckInv() {
document.getElementById("ctl00$ContentPlaceHolderMain$INDet$txtInvNumber").style.background = "yellow";
document.getElementById("ctl00$ContentPlaceHolderMain$INDet$txtInvNumber").focus();
document.getElementById("ctl00_ContentPlaceHolderMain_INDet_AddCharges").style.background = "yellow";
document.getElementById("ctl00_ContentPlaceHolderMain_INDet_lblFreight").style.background = "yellow";
bRetVal = confirm("Are you sure the information associated with this invoice is correct?");
return bRetVal;
}
答案 0 :(得分:7)
我唯一能想到的是,如果确认之前的其中一行是抛出异常而你实际上从未实现过确认。
如果您使用的是IE,请确保已启用脚本调试。如果您使用的是Firefox,请安装Firebug插件并为您的网站启用它。
或者,对于非常原始的调试,只需在每个语句之后发出警报并找出它在哪里发生轰炸。
答案 1 :(得分:5)
您应该使用以下方法从JavaScript引用控件:
document.getElementById(<%= txtInvNumber.ClientID %>).style.background = "yellow"
如果这没有帮助,请尝试在JavaScript中设置一个断点,然后单步执行它以查看它失败的位置。
答案 2 :(得分:2)
这个测试脚本在IE,Firefox和Opera中运行正常。所以你的基本语法似乎没有任何问题。问题出在ID(不符合5秒后确认的事实)或页面上的其他一些冲突的JavaScript中。如果没有看到更多页面,将很难帮助您。
<script language="javascript">
function lastCheckInv() {
document.getElementById("test1").style.background = "yellow";
document.getElementById("test1").focus();
document.getElementById("test2").style.background = "yellow";
document.getElementById("test3").style.background = "yellow";
bRetVal = confirm("Are you sure?");
return bRetVal;
}
</script>
<form method="get" onsubmit="return lastCheckInv();">
<input id="test1" name="test1" value="Hello">
<input id="test2" name="test2" value="Hi">
<input id="test3" name="test3" value="Bye">
<input type="submit" name="Save" value="Save">
</form>
答案 3 :(得分:1)
一些想法:.focus()
来电可能隐藏在页面后面的确认吗?或者可能是您的某个控件ID不正确导致.style.background
引用失败?
更新:
根据您对另一个响应的注释,如果函数返回true,此代码将导致回发。在这种情况下,除非你要返回false,否则根本不会运行.focus()
行。
答案 4 :(得分:0)
我不喜欢通过
直接访问对象document.getElementById("ctl00_ContentPlaceHolderMain_INDet_lblFreight").style.background = "yellow";
如果未返回该对象,则JavaScript将出错。
我更喜欢这种方法var obj = document.getElementById("ctl00_ContentPlaceHolderMain_INDet_lblFreight");
if(obj)
{
obj.style.background = "yellow";
}
我的猜测是你试图访问一个不在DOM上的对象,所以它永远不会进入确认调用。
答案 5 :(得分:0)
可能值得检查元素实际存在。另外,尝试将焦点延迟到confirm()之后:
function lastCheckInv() {
var myObjs,bRetVal;
myObjs=[
"ctl00_ContentPlaceHolderMain_INDet_AddCharges",
"ctl00_ContentPlaceHolderMain_INDet_lblFreight",
"ctl00$ContentPlaceHolderMain$INDet$txtInvNumber"
];
bRetVal = confirm("Are you sure the information associated with this invoice is correct?");
for (var i=0, j=myObjs.length, myElement; i<j; i++){
myElement=document.getElementById(myObjs[i]);
if (!myElement){
// this element is missing
continue;
}
else {
// apply colour
myElement.style.background = "yellow";
// focus the last object in the array
if (i == (j-1) ){
myObj.focus();
}
}
}
return bRetVal;
}
答案 6 :(得分:0)
bRetVal实际上是否已在任何地方声明?
如果没有,“ var bRetVal = confirm ....”是一种告诉jscript它是变量的友好方式。
答案 7 :(得分:0)
function lastCheckInv()
{
document.getElementById("ctl00_ContentPlaceHolderMain_INDet_txtInvNumber").style.background = "yellow";
document.getElementById("ctl00_ContentPlaceHolderMain_INDet_txtInvNumber").focus();
document.getElementById("ctl00_ContentPlaceHolderMain_INDet_AddCharges").style.background = "yellow";
document.getElementById("ctl00_ContentPlaceHolderMain_INDet_lblFreight").style.background = "yellow";
return confirm("Are you sure the information associated with this invoice is correct?");
}
您函数中的前两行是错误的,$位于ASP.Net控件的UniqueID中。
在Clients上,您必须使用ClientID,将$替换为_。
如果你确定控件存在,那么 上面的代码可能有效。