2008-10-22 1 views
1

У меня есть случай, когда у меня есть куча текстовых полей и переключателей на экране, которые все построены динамически с различными DIV. Существуют стандартные процедуры для всех текстовых полей для проверки ввода, но в зависимости от выбора переключателя запись в текстовом поле может быть недействительной, когда она была действительной изначально. Я не могу использовать onblur с помощью переключателей, потому что они могли перейти от радиокнопки в одно из текстовых полей, которое было сделано недействительным, и создать бесконечный цикл, поскольку я помещаю фокус в недопустимый элемент. Поскольку каждое текстовое поле имеет свои собственные специальные параметры для вызовов onblur, я считаю, что лучший способ сделать это - вызывать событие onblur для текстовых полей, когда форма отправляется, чтобы убедиться, что все записи по-прежнему действительны при настройке переключателя. выбрали. Я также нуждаюсь в этом, чтобы прекратить отправку, если одно из событий onblur возвращает false, чтобы они могли исправить неверное текстовое поле. Это то, что я написал ...Javascript: Как перебирать элементы и вызывать обработчик onblur для определенных элементов.

for (var intElement = 0; intElement < document.forms[0].elements.length; intElement = intElement + 1) 
    { 
     if (document.forms[0].elements[intElement].name.substr(3) == "FactorAmount") // The first 3 characters of the name are a unique identifier for each field 
     { 
      if (document.forms[0].elements[intElement].onblur()) 
      { 
       return false; 
       break; 
      } 
     } 
    } 

return true; 

Я изначально был (! Document.forms [0] .elements [intElement] .onblur()), но предупреждающие сообщения от ONBLUR событий не выскакивают когда у меня было это. Теперь появляются предупреждающие сообщения, но при этом они продолжают перебирать элементы, если они попадают в ошибку. Я прошел через это с помощью отладчика в обоих направлениях, и, похоже, он просто зацикливается, но он либо 1) не останавливается, а возвращает false, когда мне это нужно, или 2) не выполняет мои предупреждающие сообщения, чтобы сообщить пользователю, что ошибка был. Может кто-то может помочь? Это, наверное, что-то глупое, что я делаю.

Метод ONBLUR, который вызывался выглядит так ...

function f_VerifyRange(tagFactor, reaMin, reaMax, intPrecision, sLOB, sIL, sFactorCode) 
{ 
    var tagCreditOrDebit; 
    var tagIsTotal; 
    var tagPercentageOrDecimal; 

    eval("tagCreditOrDebit = document.forms[0]." + tagFactor.name.substr(0,3) + "CreditOrDebitC"); 

    eval("tagIsTotal = document.forms[0]." + tagFactor.name.substr(0,3) + "IsTotal"); 
    eval("tagPercentageOrDecimal = document.forms[0]." + tagFactor.name.substr(0,3) + "PercentageOrDecimal"); 

    if (tagPercentageOrDecimal.value == "P") 
    { 
     reaMax = Math.round((reaMax - 1) * 100); 
     reaMin = Math.round((1 - reaMin) * 100); 

     if (parseFloat(tagFactor.value) == 0) 
     { 
      alert("Please enter a value other than 0 or leave this field blank."); 

      f_SetFocus(tagFactor); 
      return false; 
     } 

     if (tagIsTotal.value == "True") 
     { 
      if (tagCreditOrDebit.checked) 
      { 
       if (parseFloat(tagFactor.value) > reaMin) 
       { 
        alert("Please enter a value less than or equal to " + reaMin + "% for a credit or " + reaMax + "% for a debit."); 
        f_SetFocus(tagFactor); 
        return false; 
       } 
      } 
      else 
      { 
       if (parseFloat(tagFactor.value) > reaMax) 
       { 
        alert("Please enter a value less than or equal to " + reaMin + "% for a credit or " + reaMax + "% for a debit."); 
        f_SetFocus(tagFactor); 
        return false; 
       } 
      } 
     } 
    } 

    return true; 
} 

EDIT: Я думаю, что я понял, почему это не работает, как ожидалось, но я до сих пор не знаю, как я могу выполнить то, что мне нужно. Линия ниже ...

  if (!document.forms[0].elements[intElement].onblur()) 

или

  if (document.forms[0].elements[intElement].onblur()) 

не возвращает то, что единственная функция ONBLUR (f_VerifyRange) возвращается. Вместо этого он всегда возвращает либо истину, либо ложь, несмотря ни на что. В первом случае он возвращает true, а затем завершает работу и прерывает отправку после первого текстового поля, даже если в первом текстовом поле не было ошибок. Во втором случае он возвращает false и пробегает все поля. Несмотря на то, что могут быть ошибки (которые он отображает), он не считает, что есть какие-либо ошибки, поэтому он продолжается с помощью submit. Я предполагаю, что мне действительно нужно, как получить возвращаемое значение из f_VerifyRange, которое является моей функцией onblur.

+0

Не могли бы вы пропустить их все, даже если есть ошибка? Таким образом, вы можете сразу отобразить все ошибки на странице, возможно, сосредоточив внимание на первом на странице. – EndangeredMassa 2008-10-22 14:19:45

+0

Это было бы неплохо, но я думаю, что моя главная проблема заключается в том, что страница выгружается неправильно. Прямо сейчас появляется предупреждение, а затем страница выгружается, поэтому у пользователя нет возможности что-либо исправить, или предупреждение не появляется, и экран не выгружается, потому что что-то не так. – 2008-10-22 14:46:53

+0

Я думаю, мне нужно будет увидеть еще один код, чтобы отладить это. Как выглядят ваши методы onblur? – 2008-10-22 14:57:55

ответ

-1

Во-первых, за любовь к богу и всем святым, перестать писать родной яваскрипт и помочь себе некоторые из этих jQuery :)

Во-вторых, начать использовать рамки проверки. Для jQuery jQuery Validate обычно работает очень хорошо. Он поддерживает такие вещи, как зависимости между разными полями и т. Д. И вы также можете легко добавить новые правила, например, действительные номера ISBN и т. Д.

Редактировать: Что касается вашего кода, я не уверен, что вы можете использовать onunload для этого, так как в этот момент нет пути назад, вы не можете прервать в этот момент. Вы должны поместить этот код в событие onsubmit.

1

Этот вопрос немного слишком сложны для меня в это время ночи, но я дам вам этот бит совет:

eval("tagCreditOrDebit = document.forms[0]." + tagFactor.name.substr(0,3) + "CreditOrDebitC"); 

Это можно записать в гораздо лучший способ:

tagCreditOrDebit = document.forms[0][tagFactor.name.substr(0,3) + "CreditOrDebitC"]; 

В javascript, где вы можете использовать точечный синтаксис, вы можете использовать квадратные скобки.

document.body; 
document['body']; 
var b = 'body'; 
document[b]; 

Кроме того, подумайте о том, чтобы предоставить ваши формы своего рода идентификатор. Я понятия не имею, почему document.forms[0] был стандартным способом долгого обращения к форме ... если вы решили разместить другую форму на странице до этого, тогда все сломается!

Другие способы сделать это включают в себя:

// HTML 
<form name="myFormName"> 

// Javascript 
var f = document.myFormName; 

или

<form id="myFormId"> 

var f = document.getElementById("myFormId") 
0

Я в конечном итоге решить это с помощью глобальной переменной. Первоначально я установил значение g_bHardEditsPassed в true, полагая, что ошибок у нас не будет. Затем в f_VerifyRange каждый раз, когда я возвращаю значение, я помещаю перед ним строку, чтобы установить переменную g_bHardEditsPassed. Затем я модифицировал петлю, чтобы выглядеть так ...

g_bHardEditsPassed = true; 

    for (var intElement = 0; intElement < document.forms[0].elements.length; intElement = intElement + 1) 
    { 
     if (document.forms[0].elements[intElement].name.substr(3) == "FactorAmount") 
     { 
      document.forms[0].elements[intElement].onblur() 
      if (!g_bHardEditsPassed) 
      { 
       g_bHardEditsPassed = true; 
       return false; 
      } 
     } 
    } 

    return true; 

Спасибо за все предложения. Я уверен, что особенность jQuery особенно стоит заглянуть в будущее.

0

У вас нет успеха с if (!...onblur()), потому что возврат onblur() всегда undefined при использовании напрямую. OnBlur() - Event Handler Function. Как и вы, вы должны создать обходной путь.