【问题标题】:How to apply javascript function into multiple same name input fields如何将javascript函数应用于多个同名输入字段
【发布时间】:2016-07-11 18:37:25
【问题描述】:

请帮助我想在输入列表中应用 javascript。 这就是我现在所拥有的。当我单击选择列表中的项目时,输入文本框将自动填充并且它现在正在工作但是当我使用 jquery 添加输入文本框时,我在选择列表中使用的 javascript 不会应用于新输入。它仅适用于第一个选择,即原始列表。 我应该怎么做才能将它应用于所有选择列表? 点击此link 获取示例

$(document).ready(function() {
    $("#category").change(function () {
        var unit = $(this).find(':selected').data('number');
        $('#numbervalue').val(unit);
    });

    var counter = 2;
    $("#addNumber").click(function () {
        var newTextBoxDiv = $(document.createElement('tr')).attr("id", 'TextBoxDivMat' + counter);

        newTextBoxDiv.after().html('<td><select id="category"><option data-number="1" value="One">One</option><option data-number="2" value="Two">Two</option><option data-number="3" value="Three">Three</option></select></td><td><input id="numbervalue" type="text"></td>');
        newTextBoxDiv.appendTo("#TextBoxesGroupMat");
        counter++;
    });
    $("#removeButtonMat").click(function () {
        counter--;
        $("#TextBoxDivMat" + counter).remove();
    });
});
<table id="TextBoxesGroupMat">
    <thead>
        <tr>
            <th>Word</th>
            <th>Number</th>                                        
        </tr> 
    </thead>
    <tbody id="TextBoxDivMat1"> 
        <tr>
            <td>
                <select id="category">                                       
                    <option data-number="1" value="One">One</option>
                    <option data-number="2" value="Two">Two</option>
                    <option data-number="3" value="Three">Three</option>
                </select>
            </td> 
            <td><input id="numbervalue" type="text"></td> 
        </tr>
    </tbody>        
</table>
<button id="addNumber">+ add number</button>
<button id="removeButtonMat">remove</button>

【问题讨论】:

  • 这有一些问题 - 主要是 ID 在页面中必须是特定的,尤其是当您正在查看绑定更改处理程序时。相反,给选择一个类,然后寻找下一个输入以将值添加到选择更改

标签: javascript jquery html arrays


【解决方案1】:

好的,问题是您正在更改一个 ID,然后它只会更改第一个 ID 输入 - 更改为类,一切都很好 - 请参见下面的 sn-p:

Updated Fiddle

此外,如果没有空白选项,则在选择时使用 on change 是个坏主意 - 用户必须先选择 two 才能返回并选择 one

$(document).ready(function() {

$(document).on("change", ".category", function () { /* changed to class */
    var unit = $(this).find(':selected').data('number');
    $(this).parent().next().find('.numbervalue').val(unit); /* ugly but works, could be better */
});

var counter = 2;
$("#addNumber").click(function () {
var newTextBoxDiv = $(document.createElement('tr'))
	     .attr("id", 'TextBoxDivMat' + counter);
 
/* changed to add select and input with classes not IDs */	
newTextBoxDiv.after().html('<td><select class="category"><option data-number="1" value="One">One</option><option data-number="2" value="Two">Two</option><option data-number="3" value="Three">Three</option></select></td><td><input class="numbervalue" type="text"></td>');
newTextBoxDiv.appendTo("#TextBoxesGroupMat");
counter++;
     });
$("#removeButtonMat").click(function () {
counter--;
 $("#TextBoxDivMat" + counter).remove();
 
     });
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="TextBoxesGroupMat">
                                    <thead>
                                    <tr>
                                        <th>Word</th>
                                        <th>Number</th>                                        
                                    </tr> 
                                    </thead>
                                    <tbody id="TextBoxDivMat1"> 
									<tr>
                                    <td><select class="category">                                       
									   <option data-number="1" value="One">One</option>
                                       <option data-number="2" value="Two">Two</option>
                                       <option data-number="3" value="Three">Three</option>
									   </select></td> 
                                     <td><input class="numbervalue" type="text"></td> 
                                        </tr>
                                    </tbody>        
</table>

<button id="addNumber">+ add number</button>
<button id="removeButtonMat">remove</button>

【讨论】:

  • 感谢达伦,它的工作。但是,当我附加 bootstrap-selectpicker 并将其应用于选择时,当我单击 addnumber 按钮时,它会给我空白。你能看看这个小提琴jsfiddle.net/qfxtvrtu/5
  • 将此添加到您的$('#addNumber').click(){ .. } - $('.selectpicker').selectpicker({ liveSearch: true, title: 'Choose Line' }); 每次添加新选择时都必须调用插件
  • 我添加了它,但第一次尝试时没有显示。我点击第二次点击后会显示。检查这个小提琴jsfiddle.net/qfxtvrtu/6
  • 您必须在将选择添加到 DOM 之后添加它 - 看看这个,我只是将它移到函数的末尾 - jsfiddle.net/studiotime/c2q838xv
  • 知道了。谢谢达伦!你真是太棒了。
【解决方案2】:

如果您将新元素添加到 HTML 文档中,则需要再次将事件附加到新添加的元素。添加新元素后,您可以调用该函数。但是当您使用 ID 时,jQuery 很可能会将函数附加到具有该 ID 的第一个元素。如果你想对一堆元素使用相同的函数,那么你可以使用类标识符。

// Using ID
$("#category").on("change", function() {
// Your code here
})

// using class
$(".category").on("change", function() {
// your code here
})`

【讨论】:

  • 看小提琴,不是这个问题
  • jsfiddle.net/jh5xoo7a/1 我已将计数器添加到 select 和 input 元素的 id 以获得正确的引用。可能可以使用 parent --> next element 方法避免将计数器附加到 id。
【解决方案3】:

将类别监听器替换为

$(document).on('change', "#category",function () {
    var unit = $(this).find(':selected').data('number');
    $(this).parent().parent().find('#numbervalue').val(unit);
});

【讨论】:

  • 看OP上的小提琴
  • @DarrenSweeney 除非我在问题中遗漏了第二层,否则这在 OP 的小提琴中似乎工作得很好。即使使用相同的 ID,委托事件也适用于所有选择并将 this 设置为正确的范围,并且由于仅在定义的范围内搜索第二个 ID,因此可以将文本框设置在同一行中。授予 OP 应该尽量避免使用相同的 id,但似乎答案本身并没有错。
  • @Me.Name - 我明白你的意思 - 我试图强调这一点,而不是向用户展示正确的方法,也许我们应该尝试向他们展示他们的错误方式开始吧。将反转 -1 - 加上这是我刚刚注意到的上面答案的精确副本 - 从来都不好
【解决方案4】:

请试试这个代码

$(document).on('change',"#category",function () {
var unit = $(this).find(':selected').data('number');
$(this).parent().parent().find('#numbervalue').val(unit);
});

【讨论】:

  • 再次,只是错了 - 这不是问题 - 看看小提琴
  • 是的。我查看了它并检查了我的代码。它正在按他的预期工作
猜你喜欢
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多