【问题标题】:JavaScript selectors: how to find the next input fieldJavaScript 选择器:如何找到下一个输入字段
【发布时间】:2021-07-20 18:31:37
【问题描述】:

阅读选择器后,我尝试将函数应用于下一个输入字段...但它不起作用。要么我没有理解使用过的选择器,要么我理解了功能词“this”的错误。

<table class="example" id="example">
<tr> <!-- rows are dynamically added -->
<td><input type="text" name="number" class="number"></td> 
<td><input type="text" name="name" class="name"></td>
</tr>
</table>

<script>
    var searchTimeout;
    $(".number").keyup(function() {
    searchKey = this.value;
    clearTimeout(searchTimeout);
    searchTimeout = setTimeout(function() {
    getdata(searchKey);    
    }, 200);
});
    
/* FIND A NAME MATCHING THE NUMBER */
    
    function getdata(searchKey) {
    $.ajax({
        url: 'get_data.php',
        type: 'GET',
        dataType: 'json',
        data: {number: searchKey},
        success: function(data) {
            if(data.status) {
            $(this).closest("tr").next().find(".name").val(data.some_data);
            } else {
            $(this).closest("tr").next().find(".name").val("No match");
            }   
        }
    });         
    }
</script>

数据已正确获取,但我无法显示它,因为将其放置在正确的字段中存在问题。

在试验时,我尝试将选择器更改为:

$(input).closest.(".name").val(data.some_data);

并且它起作用了-但是它应用于下面动态添加的所有行中的所有类“名称”字段,并且当我尝试在第二个“数字”字段中输入数据时-什么也没发生(所以我猜选择器位于 $(" .nu​​mber").keyup(function() 也不正确)。

请帮助我处理此代码,以便将每一行视为单独的操作,并将数据显示在正确选择的字段中。谢谢!

【问题讨论】:

    标签: jquery jquery-selectors


    【解决方案1】:

    当您调用函数时,传递 this 以及引用发生事件的输入框。因此,在 settimeout 之外添加此行 var selector = this 然后将其传递到此处 getdata(searchKey ,selector) 。最后将 $(this).clo.. 更改为$(el).closest.. 其他也一样,不需要next() 删除。

    演示代码

    var searchTimeout;
    $(document).on('keyup', '.number', function() {
      searchKey = this.value;
      var selector = this //add this line
      clearTimeout(searchTimeout);
      searchTimeout = setTimeout(function() {
        getdata(searchKey, selector); //pass that as well
      }, 200);
    });
    
    //add it here 
    function getdata(searchKey, el) {
      /*$.ajax({
        url: 'get_data.php',
        type: 'GET',
        dataType: 'json',
        data: {
          number: searchKey
        },
        success: function(data) {*/
      //just for demo
      var data = {
        "status": "ok",
        "some_data": "abcgh"
      }
      if (data.status) {
        //remove next and use `el`
        $(el).closest("tr").find(".name").val(data.some_data);
      } else {
        $(el).closest("tr").find(".name").val("No match");
      }
      /*}
      });*/
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <table class="example" id="example">
      <tr>
        <!-- rows are dynamically added -->
        <td><input type="text" name="number" class="number"></td>
        <td><input type="text" name="name" class="name"></td>
      </tr>
      <tr>
        <!-- rows are dynamically added -->
        <td><input type="text" name="number" class="number"></td>
        <td><input type="text" name="name" class="name"></td>
      </tr>
      <tr>
        <!-- rows are dynamically added -->
        <td><input type="text" name="number" class="number"></td>
        <td><input type="text" name="name" class="name"></td>
      </tr>
    </table>

    【讨论】:

    • 完美! :-) 非常感谢。事实上,我确实尝试将“this”作为值传递给函数,但由于其他错误,我认为它不起作用。如我所见,我已经接近解决选择器的问题了。我仍然需要阅读 $(document).on('keyup', '.number', function() 我猜这是下一行显示重复值的原因。再一次 - 谢谢!:-)跨度>
    • 不,我使用了$(document),因为您说行是动态创建的,因此您需要将事件处理程序与您的 dom 中已经存在的静态元素绑定。它可以是您的 html 中已经存在的任何元素,即: div 、 body ..etc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2017-11-29
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多