Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用jQuery动态“添加另一个产品”表单_Javascript_Jquery_Html - Fatal编程技术网

Javascript 使用jQuery动态“添加另一个产品”表单

Javascript 使用jQuery动态“添加另一个产品”表单,javascript,jquery,html,Javascript,Jquery,Html,我试图创建一个具有输入和选择的动态表单。select值现在将来自JSON数据,我只是使用一个数组,它必须具有添加另一个产品的功能 一个页面必须有两个具有相同功能的表单 当单击“添加另一个产品”时,我克隆了一行,该行本应在父窗体上克隆,但这并没有发生,也不知道为什么 我留下了一个与下面相同的代码 HTML代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <titl

我试图创建一个具有输入和选择的动态表单。select值现在将来自JSON数据,我只是使用一个数组,它必须具有添加另一个产品的功能

一个页面必须有两个具有相同功能的表单

当单击“添加另一个产品”时,我克隆了一行,该行本应在父窗体上克隆,但这并没有发生,也不知道为什么

我留下了一个与下面相同的代码

HTML代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Dynamic Select</title>
</head>
<body>
<form id="myForm" action="" class="dynamic-select">
    <div class="main-clone">
        <select name="myName">
                <option value="">Hi</option>
        </select>
        <input name="myText" type="text">
    </div>
    <p class="clone-btn">Add another product</p>
    <p class="re">Re</p>
</form>

<form id="myForm2" action="" class="dynamic-select">
    <div class="main-clone">
        <select name="myName">
                <option value="">Hi</option>
        </select>
        <input name="myText" type="text">
    </div>
    <p class="clone-btn">Add another product</p>
    <p class="re">Re</p>
</form>
</body>
<script src="js/jquery-3.2.0.min.js"></script>
<script src="js/script.js"></script>
</html>
jQuery表单

$(document).ready(function(){
    var arr = ['Juanma', 'Pepe', 'Esteban', 'Pedro', 'Juan'];
    var arr2 = ['a', 'b', 'c', 'd', 'e'];
    dynamicSelect.init(arr,'#myForm');
    dynamicSelect.init(arr,'#myForm2');

    $('form').on('click','.delete-clone', function(){
        $(this).parent().remove();
    });

});

var dynamicSelect = {
    init: function(arr,id){
        this.cachedDom(id);
        this.bindEvents();
        this.createElement(arr);
    },
    cachedDom : function(id){
        this.$form = $(id);
        this.$select = this.$form.find('select');
        this.$mainClone = this.$form.find(".main-clone");
        this.$cloneBtn = this.$form.find('.clone-btn');
        this.$submit = this.$form.find('.re');
    },
    bindEvents : function(){
        this.$cloneBtn.on('click', this.cloneElement.bind(this));
        this.$submit.on('click', this.getValues.bind(this));
    },
    createElement: function(arr){
        var fragment = document.createDocumentFragment();
        arr.forEach(function(arr, index) {
            var opt = document.createElement('option');
            opt.innerHTML = arr;
            opt.value = arr;
            fragment.appendChild(opt);
        });
        this.$select.append(fragment);
    },
    cloneElement: function(){
        var $clone = this.$mainClone.clone();
        $clone.append('<span class="delete-clone">X</span>');
        $clone.insertAfter(this.$mainClone);
    },
    getValues: function(){
        console.log(this.$form.serialize());
    }
}

快速回答是您没有实例化对象,因此代码中的最后一项将继承所有属性-这就是为什么只有第二个表单被正确激活,并为每个绑定继承正确的this

您需要做的是:

var test = Object.create(dynamicSelect);
var test2 = Object.create(dynamicSelect);
test.init(arr,'#myForm');
test2.init(arr,'#myForm2');
当对象被实例化时,这本质上使每个对象都有自己的对象。在其他有实际类的语言或es6中,您会看到类似于类Dog{}的内容。那么你会:

class Dog {
 bark(){
 }
}    
const fido = new dog();
fido.bark();
这在很大程度上与object.create的作用相同