Почему этот 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;

}

Кроме сумасшедших идентификаторов элементов, я не думаю, что это имеет какое-либо отношение к C#, .net или asp.net.

Neall 08.10.2008 03:53

Как вы вызываете lastCheckInv ()?

leppie 07.10.2008 18:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 597
8

Ответы 8

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

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

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

Если вы застряли в IE, вы можете использовать DebugBar

StingyJack 07.10.2008 19:15

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

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

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

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

Ryan Skarin 07.10.2008 18:56

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

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

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

Этот тестовый сценарий отлично работал в 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>

Мне не нравится получать доступ к объектам напрямую через

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

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

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;

}

Действительно ли bRetVal где-нибудь объявлен?

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

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, заменив $ на _.

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

Другие вопросы по теме