Проверка дат в Javascript с необычными идентификаторами полей формы - интеграция с Salesforce.com - PullRequest
1 голос
/ 10 июня 2009

Хорошо, мне нужна помощь. Это мой первый вопрос здесь.

Справочная информация: Я работаю над благотворительным проектом, и моя часть проекта заключается в создании функциональности Web-To-Case с Salesforce.com. Salesforce.com, если вы не знали, раздает свое программное обеспечение бесплатно квалифицированным некоммерческим организациям. В любом случае, функция Web-To-Case в Salesforce.com создает HTML-форму, которая при отправке отправляет данные обратно в Salesforce.com и создает заявку. Идентификаторы для элементов формы представляют собой строки из цифр и букв, которые должны соответствовать полям в Salesforce.com.

Цель: Я пытался встроить проверку дат в определенной форме, потому что мы обнаружили, что если даты не были отформатированы именно так (30.12.2009 12:00 PM), все, что пользователь ввел, не попадет в Salesforce.com.

Проблема: Нашел скрипт онлайн (javascript) и изменил его под свои нужды. Проблема - это не работает. В углу браузера появляется небольшая ошибка, но она не останавливает прохождение формы (она также не проверяется) - «Ожидается») в строке 16.

Я бы хотел прикрепить код здесь ... Надеюсь, все в порядке. Обычно я бы вырезал только соответствующие фрагменты, но боюсь, что люди скажут: «Эй, это никогда не сработает - у вас нет закрывающего HTML-тега» или еще чего-нибудь. Я не уверен, будет ли он хорошо вставлен - он взят из файла .htm, и HTML может быть интерпретирован этим форумом, и это было бы ... ну ... не идеально! Ладно, я думаю, что я понял, как избежать этого, но было так много, чтобы избежать, что я вырезал большинство комментариев и большинство действительно не относящихся к делу вещей.

Вы можете видеть, как все идентификаторы полей формы выглядят причудливо - в большинстве примеров, которые я видел, были простые идентификаторы и имена форм ... поэтому я подумал, может ли Javascript просто не иметь дело со строками, начинающимися с цифр в качестве идентификаторов / имен на поля.

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Cambridge Cares About AIDS: Request an Asset</title>
<link type="text/css" rel="stylesheet" href="styles.css" />

<SCRIPT LANGUAGE="JavaScript">  // Original JavaScript code by Chirp Internet: www.chirp.com.au    // Please acknowledge use of this code by including this header.  //Code modified to validate a date/time field by Shannon Davis, Company Name Removed.

function checkDates(form)
{
checkDate(form.00N80000003LGJ5);
    checkDate(form.00N80000003LGNt);
}

 function checkDate(field)
 {
   var allowBlank = false;
var minYear = (new Date()).getFullYear();
var maxYear = 2100;

var errorMsg = "";

// regular expression to match required date format
re = /^(\d{1,2})\/(\d{1,2})\/(\d{4})\s(\d{1,2}):(\d{2})+\s([ap]m)+$/;

if(field.value != '') {
  if(regs = field.value.match(re)) {
    if(regs[1] < 1 || regs[1] > 12) {
      errorMsg = "Invalid value for day: " + regs[1];
    } else if(regs[2] < 1 || regs[2] > 31) {
      errorMsg = "Invalid value for month: " + regs[2];
   } else if(regs[3] < minYear || regs[3] > maxYear) {
      errorMsg = "Invalid value for year: " + regs[3] + " - must be between " + minYear + " and " + maxYear;
   }
  } else {
    errorMsg = "Invalid date format: " + field.value;
  }
} else if(!allowBlank) {
  errorMsg = "Empty date not allowed!";
}

if(errorMsg != "") {
  alert(errorMsg);
  field.focus();
  return false;
}
return true;
  }
</SCRIPT>

<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8">
</head>

<BODY>

    <div id="container">
        <div id="top_photo">
      <img src="images/ccaa_banner.jpg" alt="banner" width="800" height="181" />
        </div>

        <div id="left_colum" style="width: 200; height: 256"><a href="index.html">
                      <img src="images/cca_logo.gif" alt="logo" border="0" width="178" height="84" /></a>
                    <p class="address">Cambridge Cares About AIDS<br />17 Sellers Street<br /> Cambridge, MA 02139<br />617.661.3040</p>
                <br />

                </div>
                <div id="right_colum">
                        <div id="content">

<form id="form" name="form" action="https://www.salesforce.com/servlet/servlet.WebToCase?encoding=UTF-8" method="POST">

<input type=hidden name="orgid" value="00D80000000M3if">
<input type=hidden name="retURL" value="http://wilmwebtest/CCAA/thank_you.htm">

<table border=0>

<tr><TD><label for="email">CCA Email:*</label></TD><td><input  id="email" maxlength="80" name="email" size="40" type="text" /><br> </td></tr>

<tr>
<td><label for="subject">Subject:</label></td><td><input  id="subject" maxlength="80" name="subject" size="40" type="text" /><br></td>
</tr>
<tr><td>
<label for="description">Description*</label></td>
<td>
<textarea name="description" rows="4" cols="25"></textarea><br></td>
</tr><tr>
<input type="hidden" name="recordType" id="recordType" value="0012800000006ZWz">

<tr> <td colspan="2">
<p>Date Format: mm/dd/yyyy hh:mm am/pm<br>example: &quot;08/30/2009 12:00 am&quot;</td></tr>
<tr><td>When Needed (Start):*</td>
<td><input id="00N80000003LGJ5" name="00N80000003LGJ5" size="40" type="text" /></span><br></td></tr>
<tr>
<td>
When Needed (End):<span class="dateInput">*</td>
<TD>

<input  id="00N80000003LGNt" name="00N80000003LGNt" size="40" type="text" /></span><br></td>
</tr>
</table>
<input type="hidden"  id="external" name="external" value="1" /><br>

<input type="submit" name="submit" value="Submit Asset Request" onClick="checkDates    (this.form);" >

</form>

                        </div>
                </div>
            <div id="clearit">
            </div>
    </div>
   </body>
   </html>

1 Ответ

2 голосов
/ 10 июня 2009

Ваша функция checkDate верна. Проблема в вашей функции checkDates. Javascript не любит переменные, которые начинаются с цифр. Измените его на:

function checkDates(form)
{
    checkDate(form.elements['00N80000003LGJ5']);
    checkDate(form.elements['00N80000003LGNt']);
}

и он должен работать как положено.

Кроме того, чтобы недействительная дата отменить отправку формы, необходимо изменить атрибут onClick кнопки отправки на:

onclick="return checkDates( this.form )"

В противном случае форма будет отправлена ​​независимо от того, что.

Кстати, упомянутое вами сообщение об ошибке звучит как классический 'WTF?' Internet Explorer сообщение об ошибке. Подумайте об обновлении до последней версии IE (IE8), в которой сообщения об ошибках гораздо лучше, чем в предыдущих версиях, или с использованием Firefox. Консоль ошибок Firefox не имеет себе равных в отслеживании ошибок Javascript (и CSS).

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