Изменение меток внутри повторителя в режиме реального времени

#javascript #c# #asp.net

#javascript #c# #asp.net

Вопрос:

Я пытаюсь изменить метку внутри повторителя в режиме реального времени на основе значения текстового поля, которое также находится внутри повторителя.

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

У меня нет проблем с доступом к метке или текстовому полю, если оно находится за пределами повторителя

JS:

 <script language="javascript" type="text/javascript">
    document.getElementById('<%=labelToUpdate.ClientID%>').innerHTML = document.getElementById('<%=txtInput.ClientID%>').value;
</script>
  

ASPX:

 <asp:TextBox ID="txtInput" runat="server" class="form-control"></asp:TextBox>
<asp:Label ID="labelToUpdate" runat="server"></asp:Label>
  

Любая помощь всегда приветствуется.

Спасибо

Ответ №1:

Элементы управления Repeater находятся внутри ItemTemplate, поэтому вы не можете ссылаться на них напрямую. Вам нужно получить к ним доступ по индексу.

С помощью вашего метода вы могли бы сделать это

 document.getElementById('<%= Repeater1.Items[i].FindControl("labelTotalCsrPercentage").ClientID %>').innerHTML = 
   document.getElementById('<%= Repeater1.Items[i].FindControl("txtInput").ClientID %>').value;
  

Или это становится проще при использовании jquery. Затем вы можете использовать nth-of-type селектор

 $('#MyRepeater1 span:nth-of-type(2)').html($('#MyRepeater1 span:nth-of-type(2)').prev('input').val());
  

Для этого вам нужно обернуть Repeater элементом с уникальным идентификатором

 <span id="MyRepeater1">
    <asp:Repeater ID="Repeater1" runat="server">
    </asp:Repeater>
</span>
  

Ответ №2:

asp:repeater добавляет его id (и его родительские id элементы) перед элементами управления на уровне id элементов. Так что используйте эту идею. Поместите скрипт после повторителя.

 <script>
//language="javascript" is deprecated
//type="text/javascript" is default and cam be omitted
var txts = document.querySelectorAll('input[id$=txtInput]');
for(var i = 0, txt; txt = txts[i];   i){
    txt.addEventListener('change', function(){
      document.getElementById(this.id.replace('txtInput', 'labelToUpdate')).innerHTML = this.value;
      });
}
</script>
  

Вы также можете использовать jQuery, если это проще.