2016-04-14 2 views
-2

У меня есть страница ASP.Net с 3 текстовыми полями и 1 радиобутом. Каждый из 4 элементов управления имеетquerySelectorAll возвращает пустой ноделист

class="tabbable" 

в своем определении. Вот полные разметки:

<%@ Control Language="c#" AutoEventWireup="false" Codebehind="approvalacctprocess.ascx.cs" Inherits="cmc.workflow.ui.ApprovalAcctProcess" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> 
<%@ Register tagprefix="CMC" Tagname="ApprovalComments" src="~/workflow\ui\ApprovalComments.ascx" %> 
<script src="../../Scripts/jquery-1.4.1.js"></script> 
<asp:Panel ID="pnlApprovalAC" CssClass="STDPANEL" HorizontalAlign="Center" Runat="server" Width="550"> 
    <TABLE cols="2" width="520"> 
     <TR> 
      <TD class="FLDLABEL" style="VERTICAL-ALIGN: top">Client Number</TD> 
      <TD> 
       <asp:TextBox id=txtclnum style="VERTICAL-ALIGN: top" Width="300" Runat="server" CssClass="FLDVALUE" TabIndex="0" onchange="MoveNext(this);" Text='<%# Property["clnum"] %>' MaxLength="14" AutoPostBack="True" class="tabbable"></asp:TextBox>&nbsp; 
       <asp:RegularExpressionValidator id="rxClNum" ValidationExpression="^[0-9]+[&#9;]*$|Clt Number TBD" ErrorMessage="Client Number consists of up to 14 numbers" 
        ControlToValidate="txtclnum" runat="Server"></asp:RegularExpressionValidator></TD> 
     <TR> 
      <TD class="FLDLABEL" style="VERTICAL-ALIGN: top">Matter Number (5-6 digit)</TD> 
      <TD> 
       <asp:Label id=lbclnum style="TEXT-ALIGN: right" Width="140" Runat="server" Text='<%# Property["clnum"] %>' Font-Name="verdana" Font-Size="x-small"> 
       </asp:Label>- 
       <asp:TextBox id=txtmmatter Width="150" Runat="server" CssClass="FLDVALUE" TabIndex="1" Text='<%# Property["mmatter"] %>' MaxLength="6" AutoPostBack="True" class="tabbable"></asp:TextBox>&nbsp; 
      </TD> 
     <TR> 
      <TD colSpan="2"> 
       <HR style="COLOR: gray; TEXT-ALIGN: left" SIZE="1"> 
      </TD> 
     </TR> 
     <tr> 
      <td class="FLDLABEL" style="VERTICAL-ALIGN: top" width="500" colspan="2"><asp:Label runat="server" ID="lbExistingClientQuestion" Text="Is there an Engagement Letter on file for this client?" Visible="false" />&nbsp;&nbsp; 
     <asp:Label runat="server" ID="lbUDFRetainerLetter" Text='<%# Property["RetainerLetter"] %>' Visible="false" /></td> 
     </tr> 
     <TR> 
      <TD class="FLDLABEL" style="VERTICAL-ALIGN: top" width="500" colSpan="2">Has a 
       retainer/engagement letter been submitted and approved by Charlotte Fischman?</TD> 
     </TR> 
     <TR> 
      <TD colSpan="2"> 
       <asp:RadioButtonList id="rblRetLtrReturned" TabIndex="2" Runat="server" CssClass="RADIOBUTTONLIST" RepeatDirection="Horizontal" class="tabbable" 
        RepeatLayout="Table" RepeatColumns="1" width="300" AutoPostBack="True"> 
        <asp:ListItem Value="0">No</asp:ListItem> 
        <asp:ListItem Value="1">Yes</asp:ListItem> 
       </asp:RadioButtonList> 
       <asp:Label id="lblnoretainerltrneeded" Runat="server" CssClass="SMALLNOTE" Text="(This is an existing client and the matter is in an existing area of law.&#13;&#10;&#9;&#9;&#9;&#9;&nbsp;&nbsp; A retainer letter may not be needed.)" 
        Font-Size="xx-small" Visible="False" ForeColor="red"></asp:Label></TD> 
     </TR> 
     <TR> 
      <TD colSpan="2"> 
      </TD> 
     </TR> 
     <TR> 
      <td class="FLDLABEL" style="VERTICAL-ALIGN: top" colSpan="2" width="500">Reason for Not Submitting an Retainer/Engagement Letter for Approval<SPAN style="FONT-WEIGHT: bold; COLOR: red"> 
           *</SPAN>&nbsp; 
      <asp:Label runat="server" CssClass="SMALLNOTE" Text="(Required if no retainer letter submitted and not an existing client)" Font-Size="XX-Small" ForeColor="Red" /></td> 
     </TR> 
     <TR> 
      <td colspan="2"> 
       <asp:TextBox Width="500" runat="server" TextMode="MultiLine" TabIndex="3" CssClass="FLDVALUE" ID="txtReason" MaxLength="500" Text='<%# Property["Reason"] %>' AutoPostBack="True" class="tabbable" /> 

      </td> 
     </TR> 
     <TR> 
      <TD colSpan="2"> 
       <HR style="COLOR: gray; TEXT-ALIGN: left" SIZE="1"> 
      </TD> 
     </TR> 
     <TR> 
      <TD class="FLDLABEL" style="VERTICAL-ALIGN: top">Comments</TD> 
      <TD> 
       <asp:TextBox id="txtComments" style="VERTICAL-ALIGN: top" Width="300" TabIndex="4" Runat="server" CssClass="FLDVALUE" 
        MaxLength="450" Rows="5" TextMode="MultiLine" Text='<%# Property["AcctgComment"] %>' AutoPostBack="True" class="tabbable"></asp:TextBox></TD> 
     </TR> 
    </TABLE> 
    <TABLE class="STDPANEL" style="VERTICAL-ALIGN: middle" height="50" width="550"> 
     <TR> 
      <td align="center"> 
       <input id="btnSaveACProperty" runat="server" name="btnSaveACProperty" 
        onserverclick="OnSave_Click" type="submit" value="Save Status and Comment"> 
        &nbsp;&nbsp; 
        <input id="btnResetACProperty" runat="server" name="btnResetACProperty" 
         type="reset" value="Cancel"> 
        </input> 
       </input> 
      </td> 
     <tr> 
      <td align="left"> 
       <asp:ValidationSummary ID="valsum" runat="server" BorderColor="" 
        BorderStyle="Solid" BorderWidth="2" CssClass="VALIDATORSUM" DisplayMode="List" 
        Font-Bold="True" ForeColor="red" 
        HeaderText=" Some errors occurred in your input. Please correct them:&lt;br&gt; " 
        ShowMessageBox="True" ShowSummary="True" Width="500" /> 
      </td> 
     </tr> 
    </TABLE> 
</asp:Panel> 
<script type="text/vbscript"> 

</script> 
<script type="text/javascript" lang="javascript"> 
    function MoveNext(ele) { 
     $(document).ready(function() { 
      var lastTabIndex = 4; 
      var currentElementID = ele.id; // ID set by OnFocusIn 
      var currentElement = document.getElementById(currentElementID); 
      var curIndex = currentElement.tabIndex; //get current elements tab index 
      if (curIndex == lastTabIndex) { //if we are on the last tabindex, go back to the beginning 
       curIndex = 0; 
      } 
      var tabbables = document.querySelectorAll("tabbable"); //get all tabbable elements 
      alert(tabbables.length); 
      for (var i = 0; i < tabbables.length; i++) { //loop through each element 
       if (tabbables[i].tabIndex == (curIndex + 1)) { //check the tabindex to see if it's the element we want 
        tabbables[i].focus(); //if it's the one we want, focus it and exit the loop 
        break; 
       } 
      } 
     }); 
    } 
</script> 

Текстовое поле txtclnum вызывает яваскрипт функцию MoveNext в нижней части страницы (просто чтобы убедиться, что все грузы в правильном порядке) (это взято из the first answer to this question). У MoveNext есть предупреждение, чтобы сообщить мне, что такое tabbables.length. Предупреждение возвращает 0, потому что CssClass в элементах .Net перезаписывает класс = "tabbable" в HTML. Я пробовал

var tabbables = document.getElementsByTagName("*"); 

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

+2

Вам нужно вызвать 'document.querySelectorAll ('. Tabbable')'. «.» - это то, что говорит вам, что вы смотрите на классы. Прочитайте [Селекторы CSS] (https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started/Selectors), чтобы получить представление о том, как использовать 'querySelector' и' querySelectorAll'. –

+0

Я был бы признателен, если кто бы ни опронил этот вопрос, мог бы сообщить почему. Благодарю. – Melanie

+0

Возможно, потому, что вы могли понять решение, прочитав документацию на 'querySelectorAll'. Кстати, какое-либо из предлагаемых решений помогло вам? Если это так, выберите один из них в качестве ответа, иначе обновите свой вопрос, чтобы включить * почему * они не помогли. –

ответ

1

Эта функция принимает в качестве аргумента селектор CSS, так что если вы ищете для элементов с классом «tabbable» вы бы использовать document.querySelectorAll(".tabbable")

+1

Я пробовал это, но я все равно получаю 0 как tabbable.length. – Melanie

1

Поскольку tabbable класс, вам нужно поставить точку перед это в вашем queryselector, поэтому он должен быть:

document.querySelectorAll(".tabbable") 

Edit: Просто дальнейшее уточнение, то queryselector без "" будет искать html-теги, такие как <tabbable>. Так как этого не существует, длина возвращается 0.

+1

Я пробовал это, но я все равно получаю 0 как tabbable.length. – Melanie

1

Способ использования, document.querySelectorAll("tabbable") ищет элемент тега <tabbable>. Поскольку похоже, что вы пытаетесь выполнить запрос по классу, добавьте период, чтобы обозначить, что он такой.

document.querySelectorAll(".tabbable")

При использовании document.getElementsByClassName("tabbable") она могла бы работать, так что я мог видеть, где вы могли бы запутаться, если вы использовали этот метод в прошлом.

+0

Я пробовал это, но я все еще получаю 0 как tabbable.length. Использование getElementsByClassName также возвращает 0 как tabbable.length. – Melanie

+0

Можете ли вы дважды проверить свой HTML-код? Это не похоже, что теги закрыты должным образом. Например, первый '' не имеет соответствия '' перед следующим. – Quinto

+0

Вы абсолютно правы. Мне не хватало тегов закрытия полей. Я добавил их, но это не помогает, увы. Однако, пожалуйста, см. Мой отредактированный вопрос. Теперь я могу найти элемент управления со следующим tabindex, но он почти мгновенно теряет фокус, и я не уверен, почему. – Melanie

1

ОК, я чувствую себя идиотом. Как раз для будущей ссылки других, проблема заключалась в том, что 1) для этих элементов управления назначается Cssclass, который переопределяет мой tabbable класс в разметке HTML; и 2) как только я позаботился об этом (см. ниже код), он все еще не работал, потому что (duh) каждый элемент управления имел AutoPostBack = true на нем (к ним привязывался серверный код). Теперь, когда AutoPostBack является ложным, мой код работает нормально. Вот оно:

<script type="text/javascript" lang="javascript"> 
function MoveNext(currentElement, btnID) { 
    $(document).ready(function() { 
     var saveButton = document.getElementById(btnID); 
     saveButton.disabled = false; 
     var lastTabIndex = 4; 
     var curIndex = currentElement.tabIndex; //get current elements tab index 
     if (curIndex == lastTabIndex) { //if we are on the last tabindex, go back to the beginning 
      curIndex = 0; 
     } 
     var tabbables = document.getElementsByTagName("*"); //get all tabbable elements 
     for (var i = 0; i < tabbables.length; i++) { //loop through each element 
      if (tabbables[i].tabIndex != null & tabbables[i].tabIndex == (curIndex + 1)) { //check the tabindex to see if it's the element we want 
       tabbables[i].focus(); //if it's the one we want, focus it and exit the loop 
       break; 
      } 
     } 
    }); 
} 

Спасибо всем за помощь.

Смежные вопросы