Почему этот JavaScript не отображает окно подтверждения? - PullRequest
1 голос
/ 07 октября 2008

Я пытаюсь исправить некоторые ошибки в унаследованном продукте, и у меня есть этот фрагмент 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 ]

7 голосов
/ 07 октября 2008

Единственное, о чем я могу подумать, это если одна из строк перед подтверждением выдает исключение, и вы никогда не получите подтверждение.

Если вы используете IE, убедитесь, что отладка сценариев включена. Если вы используете Firefox, установите дополнение Firebug и включите его для своего веб-сайта.

Или, для очень примитивной отладки, просто ставьте оповещения после каждого оператора и выясняйте, где он бомбит.

5 голосов
/ 07 октября 2008

Вы должны использовать следующий метод для ссылки на ваши элементы управления из JavaScript:

document.getElementById(<%= txtInvNumber.ClientID %>).style.background = "yellow"

Если это не поможет, попробуйте установить точку останова в вашем JavaScript и пройти через нее, чтобы увидеть, где она не работает.

2 голосов
/ 07 октября 2008

Этот тестовый скрипт отлично работал в IE, Firefox и Opera. Так что нет ничего плохого в вашем базовом синтаксисе. Проблема заключается либо в идентификаторах (которые не соответствуют тому факту, что они действуют, как если бы они были подтверждены через 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>
1 голос
/ 07 октября 2008

Несколько мыслей: может быть, звонок .focus() скрывает ваше подтверждение за страницей? Или может быть, что один из ваших контрольных идентификаторов неверен, что приводит к сбою ссылок .style.background?

  1. Вы должны установить фокус после , показывающего окно подтверждения, в противном случае поле подтверждения захватит фокус, делая эту строку бессмысленной.
  2. Не кодируйте идентификатор ASP.Net таким образом. Хотя они, как правило, согласуются, будущая версия ASP.net не гарантирует ту же схему, а это означает, что вы настроены на боль, когда придет время обновить этот код в какой-то момент в будущем. Используйте свойство .ClientID на стороне сервера для элементов управления, чтобы записать эти значения в javascript где-нибудь как переменные, на которые вы можете ссылаться.

Обновление:
На основании вашего комментария к другому ответу этот код приведет к обратной передаче, если функция вернет true. В этом случае нет смысла запускать строку .focus(), если только вы не собираетесь возвращать false.

0 голосов
/ 27 октября 2008
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?");    
}

Первые две строки в вашей функции неверны, $ в UniqueID элемента управления ASP.Net.

На стороне клиента вы должны использовать ClientID, заменить $ на _.

Если вы уверены, что элементы управления существуют, приведенный выше код может работать.

0 голосов
/ 08 октября 2008

bRetVal фактически объявлен где-нибудь?

Если нет, " var bRetVal = Подтвердить ...." - это удобный способ сообщить jscript, что это переменная.

0 голосов
/ 07 октября 2008

Возможно, стоит проверить, что элементы действительно существуют. Также попробуйте отложить фокусировку до подтверждения ():

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;

}
0 голосов
/ 07 октября 2008

Мне не нравится прямой доступ к объектам

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, поэтому он никогда не доберется до вызова подтверждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...