javascript - 如何在jquery中获取动态创建的文本框的动态ID

标签 javascript jquery html

我想通过文本框ID执行keyup事件,并且所有文本框都是通过onclick按钮事件动态创建的。为此我必须制作 20 个 keyup 函数。如果我使用 20 keyup 函数,那么我的代码将变得过于冗长和复杂。相反,我想对所有文本框使用通用函数。谁能建议我该怎么做..谢谢

这是我正在做的解决方案:

<div class="input_fields_wrap">
<button class="add_field_button">Add Booking</button></div>
<div id='TextBoxesGroup'>
    <div id="TextBoxDiv1">
    </div>
    </div>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> 
<script>
$(document).ready(function() {
    var counter = 2;
    $(".add_field_button").click(function() {
        if (counter > 10) {
            alert("Only 10 textboxes allow");
            return false;
        }

        var newTextBoxDiv = $(document.createElement('div'))
            .attr("id", 'TextBoxDiv' + counter);

        newTextBoxDiv.after().html('<div id="target"><label>Textbox #' + counter + ' : </label>' +
            '<input type="text" name="textbox' + counter +
            '" id="firsttextbox' + counter + '" value="" >&nbsp;&nbsp;<input type="text" name="textbox' + counter +
            '" id="secondtextbox' + counter + '" value="" >  <a href="#" id="remove_field">Remove</a><input type="text" id="box' + counter + '" value="">sum</div>');
        newTextBoxDiv.appendTo("#TextBoxesGroup");

        counter++;

    });

    function check(a, b) {
        var first = a;
        var second = b;
        var temp = temp;
        var novalue = "";
        result = parseInt(first) + parseInt(second);
        if (!isNaN(result)) {
            return result;
        } else {
            return novalue;
        }
    }


    $(this).on("keyup", "#firsttextbox2", function(e) {
        e.preventDefault();
        var a = document.getElementById('firsttextbox2').value;
        var b = document.getElementById('secondtextbox2').value;
        var number = 2;
        result = check(a, b);
        document.getElementById('box2').value = result;

    });

    $(this).on("keyup", "#firsttextbox3", function(e) {
        var number = 3;
        e.preventDefault();
        var a = document.getElementById('firsttextbox3').value;
        var b = document.getElementById('secondtextbox3').value;
        result = check(a, b);
        document.getElementById('box3').value = result;
    });

    $(this).on("keyup", "#firsttextbox4", function(e) {
        var number = 4;
        e.preventDefault();
        var a = document.getElementById('firsttextbox4').value;
        var b = document.getElementById('secondtextbox4').value;
        result = check(a, b);
        final = document.getElementById('box4').value = result;
    });

    $(this).on("keyup", "#secondtextbox2", function(e) {
        e.preventDefault();
        var a = document.getElementById('firsttextbox2').value;
        var b = document.getElementById('secondtextbox2').value;

        result = check(a, b);
        document.getElementById('box2').value = result;

    });

    $(this).on("keyup", "#secondtextbox3", function(e) {
        e.preventDefault();
        var a = document.getElementById('firsttextbox3').value;
        var b = document.getElementById('secondtextbox3').value;
        result = check(a, b);

        document.getElementById('box3').value = result;
    });

    $(this).on("keyup", "#secondtextbox4", function(e) {
        e.preventDefault();
        var a = document.getElementById('firsttextbox4').value;
        var b = document.getElementById('secondtextbox4').value;
        result = check(a, b);

        document.getElementById('box4').value = result;
    });


    $(this).on("click", "#remove_field", function(e) { //user click on remove text
        e.preventDefault();
        $(this).parent('#target').remove();
        counter--;

    });


});
</script>

最佳答案

请参阅下面的代码片段,了解如何使此实现更加模块化和可用。诀窍是思考:我想做什么?我希望能够添加多个输入并添加它们的值,在另一个输入中打印结果。

归结为使用 classes - 因为我们将为每一行使用相同类型的东西。然后应用适用于所有类别的东西。连身份证都没有!您甚至可以使用name包含要保存的值的输入的属性。使用[]在该属性中甚至会在发布时向您传回一个不错的数组!

我知道这看起来令人望而生畏,但是删除我的注释,行数会大大减少,而且这种代码几乎可以无限扩展和重用。

但是看看,这很有效,而且很简单 - 最重要的是 - 它很干燥( don't repeat yourself 0 一旦你这样做了,请重新评估,因为应该有更好的方法!)!

更新

您还可以使用<ol>作为包装器,然后添加 <li>每次都这样做,这样您就可以在前端自动计数盒子,而无需您做任何努力!事实上,这太好了,我已经改变了我的实现。

var add = $('#add_boxes');
var all = $('#boxes');
var amountOfInputs = 2;
var maximumBoxes = 10;

add.click(function(event){
    
    // create a limit
    if($(".box").length >= maximumBoxes){
        alert("You cannot have more than 10 boxes!");
        return;
    }
        
    var listItem = $('<li class="box"></li>');
    // we will add 2 boxes here, but we can modify this in the amountOfBoxes value
    for(var i = 0; i < amountOfInputs; i++){
        listItem.append('<input type="text" class="input" />');
    }
    listItem.append('<input type="text" class="output" name="value" />');
    // Lets add a link to remove this group as well, with a removeGroup class
    listItem.append('<input type="button" value="Remove" class="removeGroup" />')
    listItem.appendTo(all);
});

// This will tie in ANY input you add to the page. I have added them with the class `input`, but you can use any class you want, as long as you target it correctly.
$(document).on("keyup", "input.input", function(event){
    // Get the group
    var group = $(this).parent();
    // Get the children (all that arent the .output input)
    var children = group.children("input:not(.output)");
    // Get the input where you want to print the output
    var output = group.children(".output");
    // Set a value
    var value = 0;
    // Here we will run through every input and add its value
    children.each(function(){
        // Add the value of every box. If parseInt fails, add 0.
        value += parseInt(this.value) || 0;
    });
    // Print the output value
    output.val(value);
});

// Lets implement your remove field option by removing the groups parent div on click
$(document).on("click", ".removeGroup", function(event){
    event.preventDefault();
    $(this).parent(".box").remove();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<ol id="boxes">
</ol>
<input type="button" value="Add a row" id="add_boxes" />

关于javascript - 如何在jquery中获取动态创建的文本框的动态ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30706820/

相关文章:

javascript - 简单的javascript,对象中的函数

javascript - 设置 Suitelet 表单的请求 URL

javascript - 不使用 document.write 如何在当前 JS 正在执行的位置插入 DOM 节点?

javascript - 使用 jQuery 在 HTML <select/> 中将键值对保持在一起?

javascript - 需要在页面加载之前将值添加并读取到 cookie 中,因为页面项目需要根据值显示

javascript - 使用类时 jQuery Popup Overlay 不显示

javascript - 循环脚本

javascript - D3 放大图表

javascript - 悬停在导航栏上时下拉菜单?

jquery - 使用css和jquery创建提醒框