Отключить 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 баллов?

http://www.4guysfromrolla.com/articles/051204-1.aspx

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 решения.

  1. Визуализируйте свой JavaScript в нижней части страницы, по крайней мере, после элементов управления.
  2. Поместите свой вызов 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%>") );
Другие вопросы по тегам