getElementById не находит элемент управления, сгенерированный ASP.net - PullRequest
15 голосов
/ 04 января 2011

Я просто пытаюсь сохранить метку в переменной в javascript, но по какой-то причине это не работает с document.getElementById('control');. Я знаю, что мой javascript нормально связывается с моим html-файлом, потому что все остальное работает.

Вот мой код JavaScript:

function performEvapCooledCircuit(txt)
{
    var error = document.getElementById('lblError');


    if (txt.value == null || isNaN(txt.value))
    {
       error.style.visibility = "visible";
    }
}

Вот HTML-код для моей метки:

<asp:Label ID="lblError" class="NormLabel" runat="server" 
   style="color:red; visibility:hidden;" Text="Invalid Input."></asp:Label>

Я получаю ошибку, в которой говорится, что объект ожидается ??

Ответы [ 5 ]

20 голосов
/ 04 января 2011

Идентификатор, который сгенерирует ASP.NET, не будет "lblError", поэтому вам нужно сослаться на него по ClientID

document.getElementById('<%=lblError.ClientID %>');

Если ваш файл javascript является внешним, мне обычно приходилось писать тип метода javascript "Init", чтобы убедиться, что для моих идентификаторов установлено свойство

На вашей странице ASPX:

<script type="text/javascript">
    var lblError = null;
    function InitializeVariables()
    {
        if (lblError == null) // make sure you only do this once
        {
            lblError = document.getElementById("<%=lblError.ClientID %>");
        }
    }
</script>
<asp:Label 
    ID="lblError"
    class="NormLabel"
    runat="server" 
    style="color:red; visibility:hidden;"
    Text="Invalid Input."></asp:Label>

Затем в вашем файле javascript вам нужно будет вызвать InitializeVariables(), чтобы убедиться, что у вас есть переменные, указывающие на надлежащие элементы управления asp.net

function performEvapCooledCircuit(txt)
{
    InitializeVariables();

    if (txt.value == null || isNaN(txt.value))
    {
        lblError.style.visibility = "visible";
    }
}
6 голосов
/ 21 ноября 2012

«Охотник» дает довольно надежный способ ведения дел, однако, на мой взгляд, гораздо лучший способ - использовать свойство «CliendIDMode» в элементе управления и установить для этого свойства «Статический».Это сделает идентификаторы клиента и сервера одинаковыми.Как это:

<asp:TextBox ID="ServerAndClientId" runat="server" ClientIDMode="Static" />
2 голосов
/ 04 января 2011

Идентификатор метки не является "lblError". Движок ASP.net изменил идентификатор. Проверьте исходный код HTML в браузере, чтобы узнать настоящий идентификатор.

1 голос
/ 18 января 2013

Вы можете использовать это:

document.getElementById('<%= lblError.ClientID %>').click()

Начиная с ASP.NET 4.0, вы можете использовать ClientIDMode свойство для вашего элемента.И если вы установите его в Static, тогда значение ClientID будет установлено в значение свойства ID:

 <asp:Label ID="lblError" runat="server" ClientIDMode="Static" />

будет отображаться примерно так:

<span id="lblError" name="ctl00$MasterPageBody$ctl00$Label1" />
1 голос
/ 04 января 2011

Это не HTML для метки, это элемент управления ASP.NET, который будет отображаться в HTML перед отправкой в ​​ответе.Элементы управления ASP.NET WebForms иногда изменяют идентификатор создаваемого ими HTML.

Просмотрите исходный веб-сайт, чтобы увидеть, какой идентификатор элемента HTML находится на отображаемой странице.

...