【问题标题】:document.getElementById([id]).value returns an empty stringdocument.getElementById([id]).value 返回一个空字符串
【发布时间】:2020-12-13 06:10:08
【问题描述】:

我正在尝试让一个基本的搜索功能在一个显示在模式中的列表上工作。

当我在输入框中输入内容时,下面的javascript函数中的input.value由于某种原因是一个空字符串。结果,javascript 搜索/过滤功能什么都不做。

感谢您的帮助。

VB(生成 HTML):

<WebMethod()>
    Public Function GetIionsList(schedTypeUID As Integer) As String
        
        Dim table As String = ""
        Dim sql As String = ""
        Dim inspListHTML As New StringBuilder

        Dim dif As DataInterfaceFactory = GetSettingsDIF()

        Dim UserInfo As New NAMEGenericCls.UserCls.NAMEUser
        Dim userName As String = GetUserName(dif)
        UserInfo.Initialise(userName, dif)
        Dim SchedDataRight As New NAMEGenericCls.SecDataRights
        SchedDataRight.LoadDataRights(dif, UserInfo.UID, UserInfo.GroupUID)

        Select Case schedTypeUID
            Case SchedType.PLANNED
                table = "TABLE_ONE"
            Case SchedType.ADHOC
                table = "TABLE_TWO"
            Case SchedType.EXISTING
                table = "TABLE_THREE"
        End Select

        sql = SchedDataRight.CheckDataRights(dif, "SELECT I_UID FROM " & table)

        inspListHTML.Append("<input type='text' id='textInput' onkeyup='IionSearch()' placeholder='Search..' title='Type in a word'>").AppendLine()
        inspListHTML.Append("<br>").AppendLine()
        inspListHTML.Append("<br>").AppendLine()
        inspListHTML.Append("<ul id='ISelectListUL' class='list-group'>").AppendLine()

        Using dr As New DataReader(dif)
            dr.ExecuteReader(sql)

            Dim PreviousIUID As String = ""
            Dim CurrentIUID As String = ""

            While dr.Read()
                If Not IsDBNull(dr!I_UID) Then
                    CurrentIUID = dr!I_UID

                    If CurrentIUID <> PreviousIUID Then
                        PreviousIUID = CurrentIUID
                        Using drlkp As New DataReader(dif)

                            Dim qp As New List(Of Sqlclient.SqlParameter)
                            qp.Add(New SqlClient.SqlParameter("@CurrentIUID", CurrentIUID))

                            Dim lkp As String = SchedDataRight.CheckDataRights(dif, "SELECT I_NAME FROM TABLE_TWO WHERE I_UID = @CurrentIUID ")
                            drlkp.ExecuteReader(lkp, qp)

                            If Not IsDBNull(lkp) Then
                                getInspListHTML(inspListHTML, dr!I_UID, drlkp!I_NAME, schedTypeUID)
                            End If
                        End Using

                    End If
                Else
                    getInspListHTML(inspListHTML, 999, "Error - No Iions Found", "")
                End If

            End While
        End Using

        inspListHTML.Append("</ul>").AppendLine()

        Return inspListHTML.ToString()


    End Function

呈现的 HTML:

<input type='text' id='textInput' onkeyup='IionSearch()' placeholder='Search..' title='Type in a word'>
<br>
<br>
<ul id='ISelectListUL' class='list-group'>
<li><a id='li_InspID_117' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>1 Monthly - Safety Iion                     </a></li>
<li><a id='li_InspID_118' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>x1 and 2 Monthly - Safety Iion              </a></li>
<li><a id='li_InspID_119' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>Full Sector - Safety Iion                   </a></li>
<li><a id='li_InspID_120' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>x2 Monthly - Safety Iion                    </a></li>
<li><a id='li_InspID_121' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>x4 Monthly - Safety Iion                    </a></li>
<li><a id='li_InspID_122' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xHigh Traffic - Safety Iion                 </a></li>
<li><a id='li_InspID_123' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xHigh &amp; Med Traffic - Safety Iion           </a></li>
<li><a id='li_InspID_124' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xMed Traffic - Safety Iion                  </a></li>
<li><a id='li_InspID_125' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xLow Traffic - Safety Iion                  </a></li>
<li><a id='li_InspID_126' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xPeriod Full Sector - Safety Iion           </a></li>
<li><a id='li_InspID_127' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xPeriod Full Sector - Safety Iion           </a></li>
<li><a id='li_InspID_128' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xPeriod Full Sector - Safety Iion           </a></li>
<li><a id='li_InspID_129' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>3 Monthly - Safety Iion                     </a></li>
<li><a id='li_InspID_130' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>6 Monthly - Safety Iion                     </a></li>
<li><a id='li_InspID_131' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>1 and  3 Monthly - Safety Iion              </a></li>
<li><a id='li_InspID_132' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>Adhoc                                             </a></li>
</ul>

渲染的 HTML 使用以下命令显示:

$('#IionList').html(inspListHTML);

JS:

function IionSearch() {
        var input, filter, ul, li, a, i, txtValue;
        input = document.getElementById("textInput");
        filter = input.value.toUpperCase();
        ul = document.getElementById("ISelectListUL");
        li = ul.getElementsByTagName("li");
        for (i = 0; i < li.length; i++) {
            a = li[i].getElementsByTagName("a")[0];
            txtValue = a.textContent || a.innerText;
            if (txtValue.toUpperCase().indexOf(filter) > -1) {
                li[i].style.display = "";
            } else {
                li[i].style.display = "none";
            }
        }
    };

function IionSearch() {
  var input, filter, ul, li, a, i, txtValue;
  input = document.getElementById("textInput");
  filter = input.value.toUpperCase();
  ul = document.getElementById("ISelectListUL");
  li = ul.getElementsByTagName("li");
  for (i = 0; i < li.length; i++) {
    a = li[i].getElementsByTagName("a")[0];
    txtValue = a.textContent || a.innerText;
    if (txtValue.toUpperCase().indexOf(filter) > -1) {
      li[i].style.display = "";
    } else {
      li[i].style.display = "none";
    }
  }
};
<input type='text' id='textInput' onkeyup='IionSearch()' placeholder='Search..' title='Type in a word'>
<br>
<br>
<ul id='ISelectListUL' class='list-group'>
  <li><a id='li_InspID_117' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>1 Monthly - Safety Iion                     </a></li>
  <li><a id='li_InspID_118' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>x1 and 2 Monthly - Safety Iion              </a></li>
  <li><a id='li_InspID_119' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>Full Sector - Safety Iion                   </a></li>
  <li><a id='li_InspID_120' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>x2 Monthly - Safety Iion                    </a></li>
  <li><a id='li_InspID_121' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>x4 Monthly - Safety Iion                    </a></li>
  <li><a id='li_InspID_122' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xHigh Traffic - Safety Iion                 </a></li>
  <li><a id='li_InspID_123' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xHigh &amp; Med Traffic - Safety Iion           </a></li>
  <li><a id='li_InspID_124' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xMed Traffic - Safety Iion                  </a></li>
  <li><a id='li_InspID_125' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xLow Traffic - Safety Iion                  </a></li>
  <li><a id='li_InspID_126' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xPeriod Full Sector - Safety Iion           </a></li>
  <li><a id='li_InspID_127' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xPeriod Full Sector - Safety Iion           </a></li>
  <li><a id='li_InspID_128' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>xPeriod Full Sector - Safety Iion           </a></li>
  <li><a id='li_InspID_129' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>3 Monthly - Safety Iion                     </a></li>
  <li><a id='li_InspID_130' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>6 Monthly - Safety Iion                     </a></li>
  <li><a id='li_InspID_131' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>1 and  3 Monthly - Safety Iion              </a></li>
  <li><a id='li_InspID_132' onclick="javascript:selectIion(this.id,'1');" class='list-group-item'>Adhoc                                             </a></li>
</ul>

【问题讨论】:

  • 看看呈现的 HTML 变成了什么——这可能会帮助您识别问题。听起来它不包含具有这些 ID 的元素
  • @CertainPerformance 我已经在上面添加了渲染的 HTML,据我所知,它看起来还不错
  • 如果是 HTML,它看起来可以正常工作。正如您在 sn-p 中看到的那样,那里的代码不应产生您描述的错误 - 它可以按需要工作。如果您不知道如何在此处重现问题,您可以链接到无法解决此问题的网站吗?
  • 很遗憾,我不能。在这种情况下,我想知道该元素是否尚未加载到 dom 中,并且在函数开始时需要 window.onload = 。出于某种原因,该功能在执行此操作时不再触发,当我将其包装在 $(document).ready(function () {...} 中时它也不会触发
  • InspectionSearch 仅在 keyup 上调用,这将在 DOM 加载之后发生,因此将所有内容包装在 .ready.onload 中将无济于事 - 并且,因为您使用的是内联处理程序(您是shouldn't),所以包装实际上会导致您的脚本中断。但它应该可以在没有包装的情况下正常工作。

标签: javascript html jquery vb.net getelementbyid


【解决方案1】:

这一行之后

 inspListHTML.Append("</ul>").AppendLine()

添加这个:

inspListHTML.AppendLine("<script type='text/javascript'>  (function test() { document.getElementById('textInput').addEventListener('keyup', function execute() { InspectionSearch(); }) })();</script>")

【讨论】:

  • 感谢您的建议。不幸的是我仍然有同样的问题。 filter 是一个空字符串,无论我输入什么
  • @NickyLarson 如何通过 GetInspectionsList Server 函数放置您的 Html 数据。这是javascript写的吗?如果是,您需要在之前将其转换/解析为 dom 元素,并将它们作为元素而不是文字字符串进行广告。此时您可以通过 dom 访问这些元素。
  • 如果我从我的代码中删除 onkeyup='InspectionSearch()' 并添加您建议的事件侦听器,InspectionSearch() 根本不会被触发。编辑:刚刚看到您的第二条评论,现在正在研究它
  • 如果您的 keyup 事件被定期触发,但您无法通过 document.getElementById 找到输入元素,则将该输入作为参数传递,例如 onkeyup="InspectionSearch(this);"
  • 通过运行:$('#inspectionList').html(inspListHTML); 放置 HTML 数据,该 jquery 函数需要一个字符串,因此如果我解析为 dom,它将不起作用。我也尝试将输入作为参数传递,但没有任何区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多