Получение идентификатора встроенного ASP-объекта с использованием JavaScript и jQuery

StackOverflow https://stackoverflow.com/questions/272007

Вопрос

Я использую jQuery для попытки запуска метода, когда ASP.NET (2.0) событие изменения выпадающего списка обрабатывается jQuery. Проблема заключается в том, что раскрывающийся список находится внутри вида сетки и даже тогда, только когда пользователь решил редактировать строку в этом виде сетки.

Я думаю, что он собирает объект с помощью блока кода ASP, но проблема в том, что при первой загрузке страницы индекс редактирования строки не существует и выдает ошибку. Помещение блока внутрь оператора IF также не работает.

$(document).ready(function() //when DOM is ready, run containing code
{
    <% if (grvTimeSheets.EditIndex > -1) {%>
        $(#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>).change(function() {
             $(#<%= grvTimeSheets.ClientID %>).block({ message: null }
        });
}
);
<% } %>

Это была одна попытка, которую я предпринял, и я также попытался поместить ASP-код оператора IF вне блока JavaScript. Это тоже не работает.

Как я могу применить событие jQuery к выпадающему списку? В идеале как можно более кратким.

<Ч>

Спасибо за ответ, но нет, он не работает :(. Кажется, код JavaScript не выводится ... Смущает ...

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //When DOM is ready, run the containing code
    {

    }
    );
</script>

Это выход. Хотя это код:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //when DOM is ready, run containing code
    {<% if (grvTimeSheets.EditIndex > -1) {%>
        var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
        $(id).change(function() {
             $(id).block({ message: null }
        });
     <% } %>
    }
    );
</script>

Он делал это и раньше, сводя меня с ума.

<Ч>

Извините, не могли бы вы сделать это немного яснее. Я попытался определить всю вещь в коде так:

DropDownList ddl (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    $(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
          csm.RegisterStartupScript(cstype, csname1, script, true);
}

Это то, что вы имели в виду?

Кстати, вышесказанное не сработало. Нет ошибок, просто нет событий.

Это было полезно?

Решение

Несколько вещей здесь.

<Ол>
  • Вам нужно заключить ваши селекторы в кавычки, когда вы передаете их в функцию $ () . Приведенный выше фрагмент кода генерирует что-то вроде $ (# some-generate-id) , что не сработает.
  • Закрывающая фигурная скобка для серверной части, если инструкция находилась вне функции onready. Он должен быть вложен на том же уровне, что и открытие, если.
  • Попробуйте это:

    $(document).ready(function() //when DOM is ready, run containing code
    {
      <% if (grvTimeSheets.EditIndex > -1) {%>
          var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
          $(id).change(function() { 
               $(id).block({ message: null }
            }); 
     <% } %>
    }
    );
    

    Если это не сработает, вставьте сгенерированный javascript.

    Другие советы

    Используйте это:

    cs.RegisterClientScriptBlock(cstype, csname, cstext2.ToString(), False)
    

    Неверно создавать теги сценария, поскольку вы их включаете. Документация MSDN неверна в том, как она объясняет флаг.

    Кроме того, просто поместите идентификаторы клиента ваших элементов управления в отдельные переменные из кода, а не в jQuery. code.

    Затем используйте переменные, содержащие идентификаторы, в коде jQuery.

    Внутри вашего блока скрипта, который вы создаете в коде позади:

    string script = @"<script type=text/javascript> var myControlId = '" + ddl.ClientId  "';") + "</script>"
    

    Я не проверял этот синтаксис, но он должен быть закрыт. Вы можете добавить дополнительный синтаксис для grvTimeSheets.ClientID самостоятельно. Если это работает, то вы можете изменить его, чтобы построить массив JavaScript и таким образом сохранить ClientId, и тогда у вас будет только одна глобальная переменная JavaScript, с которой вам нужно работать.

    Другой вариант - просто дать элементу, который вы ищете, имя класса, которое описывает его поведение. Тогда ваш код jQuery станет действительно понятным:

    $(function() {
        $("select.yourMarkerClass").change(....);
    });
    

    Если строки редактирования нет, этот код ничего не делает. Если есть элемент, соответствующий селектору, вы добавите новое поведение.

    Если вы не используете этот идентификатор в другом месте на странице, вы можете помешать ASP. Уникальный идентификатор NET с одним из расширенных селекторов jQuery:

    $('[id$=ddlClients]')
    

    Это соответствует только концу строки идентификатора, а не всему. Помните, что если элемент управления присутствует несколько раз в разных строках, он будет соответствовать всем экземплярам.

    См. Селекторы для получения дополнительных примеров.

    Ключ может быть любым, но уникальным.

    Я попробую больше после выходных. Это был код:

    DropDownList ddl = (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
    if (ddl != null)
    {
        ClientScriptManager csm = Page.ClientScript;
        Type cstype = this.GetType();
        String csname1 = "PopupScript";
    
        string script = @"
        <script language='javascript' type='text/javascript'>
        jQuery(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
        csm.RegisterStartupScript(cstype, csname1, script, false);
    

    Потому что у вас есть выпадающий список в каждой строке. У каждого выпадающего списка будет уникальный ClientId, поэтому я предлагаю сделать то, что предложил Бен, и использовать селектор классов, так как это самое простое решение.

    Или вы можете создать функцию JavaScript по щелчку мыши, а затем получить уникальный идентификатор клиента вашего раскрывающегося списка в редактируемой строке.

    Извините, я должен был прочитать ваш код ближе.

    scroll top