为什么这个JavaScript没有显示确认框?

时间:2008-10-07 14:48:14

标签: c# .net asp.net javascript

我正在尝试修复我继承的产品中的一些错误,并且我有这个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;

}

8 个答案:

答案 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引用失败?

  1. 您应该在显示确认框之后设置焦点,否则确认框将抓住焦点,使该线无意义。
  2. 不要硬编码ASP.Net id。虽然它们通常是一致的,但ASP.net的未来版本将不能保证相同的方案,这意味着在将来某个时候更新此代码时,您需要为自己设置痛苦。使用控件的服务器端.ClientID属性将这些值作为可以引用的变量写入javascript中。
  3. 更新:
    根据您对另一个响应的注释,如果函数返回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,将$替换为_。

如果你确定控件存在,那么 上面的代码可能有效。