Отключить ASP.NET 1.1 Validator с помощью JavaScript - не работает в Firefox
Следующая попытка работает в IE8, но не в Firefox (для этого нельзя использовать JQuery):
case 'Template:templateControl:residenceRBL2':
if (selected.value == 'Within USA')
{
/* Enable zip textbox and validator */
document.getElementById("Template_templateControl_zipTxt1").disabled=false;
ValidatorEnable(document.getElementById('<%=firstPersonZipReqVal.ClientID%>'),
true);
...
}
else if (selected.value == 'Outside USA')
{
/* Disable zip textbox and validator */
document.getElementById("Template_templateControl_zipTxt1").disabled=true;
ValidatorEnable(document.getElementById('<%=firstPersonZipReqVal.ClientID%>'),
false);
...
}
break;
<asp:Label ID="firstPersonZipLabel" Runat="server"></asp:Label><br />
<asp:TextBox ID="zipTxt1" Height="19" Width="100"
Runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="firstPersonZipReqVal"
ControlToValidate="zipTxt1" Display="Dynamic"
ErrorMessage="First Person Zip"
Runat="server">*</asp:RequiredFieldValidator>
Описание проблемы: в зависимости от выбора списка радиокнопок обязательный валидатор отключается / повторно включается для текстового поля. По сути, если их адрес находится за пределами США, то средство проверки почтового индекса отключено. В Firefox это не будет работать вообще.
ОБНОВЛЕНИЕ 1: 09-07-2010 Я отключил текстовое поле в Firefox; Я использовал атрибут имени вместо идентификатора. Моя единственная проблема сейчас заключается в том, как получить доступ к "ClientID" элемента управления проверки ASP.NET в JS?
ОБНОВЛЕНИЕ 2: 09-07-2010 Согласно документации MSDN, я думал, что мог сделать что-то вроде этого:
ValidatorEnable(firstPersonZipReqVal, false);
К сожалению, в Firefox это тоже не работает...
ASP.NET сломал рендеринг кода на стороне клиента проверки в Firefox
ОБНОВЛЕНИЕ 3: 09-08-2010
Причина, по которой Firefox не играет хорошо, заключается в том, что ASP.NET 1.1 рассматривает его как браузер нижнего уровня. Если я добавлю clientTarget="upLevel" в тег Page, Firefox будет работать как положено. К сожалению, это нарушает весь макет сайта. Есть ли более постепенный способ исправить колпачки браузера для Firefox? Эта версия browserCaps также нарушает макет.
Текущие колпачки браузера в Web.Config выглядят так:
<browserCaps>
<case match="Gecko/[-\d]+">
browser=Netscape
frames=true
tables=true
cookies=true
javascript=true
javaapplets=true
ecmascriptversion=1.5
w3cdomversion=1.0
css1=true
css2=true
xml=true
tagwriter=System.Web.UI.HtmlTextWriter
<case match="rv:1.0[^\.](?'letters'\w*)">
version=6.0
majorversion=6
minorversion=0
<case match="^b" with="${letters}">
beta=true
</case>
</case>
<case match="rv:1(\.\d+)(\.\d)?(?'letters'\w*)">
version=7.0
majorversion=7
minorversion=0
<case match="^b" with="${letters}">
beta=true
</case>
</case>
</case>
</browserCaps>
ОБНОВЛЕНИЕ: 09-11-2010
Следующая ссылка может дать ответ; может кто-нибудь помочь с кодом на 50 баллов?
5 ответов
Помечено как ответ - см. Ссылку на статью Скотта Митчелла на эту тему выше.
Как получить доступ к "ClientID" элемента управления проверки ASP.NET в JS
Вы обращаетесь к нему надлежащим образом в своем коде, хотя вам может понадобиться использовать двойные кавычки вместо одинарных кавычек:
document.getElementById("<%=firstPersonZipReqVal.ClientID%>")
Хорошо, вопрос очень старый, но fr1.1 все еще жив - фактически статья Митчелла не предоставляет обходного пути, позвольте мне показать мой:
1. Web config browserCaps должен содержать "msdomversion", что-то вроде этого:
<browserCaps>
<case match="^Mozilla/5\.0 \([^)]*\) (Gecko/[-\d]+)(?'VendorProductToken' (?'type'[^/\d]*)([\d]*)/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)))?">
browser=Gecko
<filter>
<case match="(Gecko/[-\d]+)(?'VendorProductToken' (?'type'[^/\d]*)([\d]*)/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)))">
type=${type}
</case>
<case>
<!-- plain Mozilla if no VendorProductToken found -->
type=Mozilla
</case>
</filter>
frames=true
tables=true
cookies=true
javascript=true
javaapplets=true
ecmascriptversion=1.2
w3cdomversion=1.0
css1=true
css2=true
xml=true
msdomversion=6.0
tagwriter=System.Web.UI.HtmlTextWriter
<case match="rv:(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*))">
version=${version}
majorversion=0${major}
minorversion=0${minor}
<case match="^b" with="${letters}">
beta=true
</case>
</case>
</case>
<case match="Chrome/(?'version'(?'major'\d+)\.(?'minor'\d+\.\d+).\d+)">
browser=Chrome
version=${version}
majorversion=${major}
minorversion=${minor}
frames=true
tables=true
cookies=true
javascript=true
javaapplets=true
ecmascriptversion=1.5
w3cdomversion=1.0
msdomversion=6.0
css1=true
css2=true
xml=true
tagwriter=System.Web.UI.HtmlTextWriter
</case>
</browserCaps>
2. WebUIValidation.js должен быть изменен:
2.1 заменить вызовы document.all на document.getElementById (Mitchell)
2.2 Переименовать переменную в "финал" (Митчелл)
2.3 добавить функцию для чтения в качестве атрибутов:
function ValidatorValidatorGetAttribute(item, attribName)
{
var retVal = null;
var attribs = item.attributes;
for (var i = attribs.length - 1; i >= 0; i--)
{
var attrib = attribs[i];
if (attrib.nodeName == attribName)
{
retVal = attrib.nodeValue;
}
}
return retVal;
}
2.4 добавить логику обработки эксплоонов, например, в ValidatorOnLoad:
if (typeof(val.evaluationfunction) == "string") {
eval("val.evaluationfunction = " + val.evaluationfunction + ";");
}
else
if (typeof(ValidatorGetAttribute(val,'evaluationfunction')) == "string") {
eval("val.evaluationfunction = " + ValidatorGetAttribute(val,'evaluationfunction') + ";");
}
3. Добавьте клиентский скрипт на странице (автоматический скрипт проверяет, работает ли он только в браузере IE)
var nonIEBrowser = false;
if (typeof(clientInformation) == "undefined")
nonIEBrowser = true;
if ((typeof(clientInformation) != "undefined") && (clientInformation.appName.indexOf("Explorer") == -1))
nonIEBrowser = true;
//None - IE browsers, and possibly IE 10+
if (nonIEBrowser)
{
if (typeof(Page_ValidationVer) == "undefined")
alert("Unable to find script library '/aspnet_client/system_web/1_1_4322/WebUIValidation.js'. Try placing this file manually, or reinstall by running 'aspnet_regiis -c'.");
else if (Page_ValidationVer != "125")
alert("This page uses an incorrect version of WebUIValidation.js. The page expects version 125. The script library is " + Page_ValidationVer + ".");
else
ValidatorOnLoad();
}
это все. По крайней мере, у меня это работает:)
Я считаю, что проблема в том, что вы вызываете Javascript до того, как DOM будет готов, поэтому не можете найти ваши элементы с помощью getElementByID.
Есть 2 решения.
- Визуализируйте свой JavaScript в нижней части страницы, по крайней мере, после элементов управления.
- Поместите свой вызов Javascript в функцию и сначала вызовите ее с помощью window.onload.
И наверняка вам нужно вызывать их с предложением palswim с помощью <% = firstPersonZipReqVal.ClientID%>
Я не на 100% уверен, что это проблема, потому что я не вижу полный код, но это главная причина, когда getElementByID не находит существующий элемент управления.
Это слишком долго, чтобы добавить к комментарию и является отдельным ударом по ответу из моего поста выше.
Я просто скопировал и вставил это из поста об этой проблеме, но пользователь попробовал что-то вроде этого:
function disableValidator(elem)
{
elem.style.cssText = "";
elem.style.display = 'none';
elem.style.accelerator = true;
}
disableValidator( document.getElementById("<%=firstPersonZipReqVal.ClientID%>") );