Я пытаюсь исправить некоторые ошибки в продукте, унаследованном мною, и у меня есть этот фрагмент 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;
}
Как вы вызываете lastCheckInv ()?





Единственное, о чем я могу думать, - это если одна из строк перед подтверждением генерирует исключение, и вы никогда не доберетесь до подтверждения.
Если вы используете IE, убедитесь, что включена отладка скриптов. Если вы используете Firefox, установите надстройку Firebug и включите ее для своего веб-сайта.
Или, для очень примитивной отладки, просто ставьте предупреждения после каждого оператора и выясняйте, где это бомба.
Если вы застряли в IE, вы можете использовать DebugBar
Несколько мыслей: Может быть, звонок .focus() скрывает ваше подтверждение за страницей? Или может быть, что один из ваших управляющих идентификаторов неверен, что приводит к сбою ссылок .style.background?
Обновление:
Основываясь на вашем комментарии к другому ответу, этот код приведет к обратной передаче, если функция вернет true. В этом случае нет смысла запускать строку .focus(), если вы не собираетесь возвращать false.
Спасибо за совет. Я определенно не писал этот жестко запрограммированный мусор, я просто застрял, пытаясь исправить это, пока разрабатываю новую версию, не полную зла.
Для ссылки на элементы управления из 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 существует, приведенный выше код может работать.
Кроме сумасшедших идентификаторов элементов, я не думаю, что это имеет какое-либо отношение к C#, .net или asp.net.