【问题标题】:HTML/Javascript Form How do I serialize "li" data when submitted? [closed]HTML/Javascript 表单提交时如何序列化“li”数据? [关闭]
【发布时间】:2017-05-15 17:57:14
【问题描述】:

这是我的问题:

当用户点击“提交”时,我需要将表单序列化,JSON数据显示在class="debug"中,如果添加了用户,包括列表项数据。

目前,我看到的唯一数据是点击“提交”时输入字段中的当前数据,而不是添加用户时的列表项。除了在输入字段中提交的内容之外,我还需要列表项(如果我添加用户)。

如何使用我当前的 Javascript 执行此操作?

无法使用 jQuery。无法编辑 HTML。只有纯 Javascript。

来自美国的感谢和新年快乐!

HTML

<div class="builder">
    <ol class="household"></ol>
    <form>
        <div>
            <label>Age
                <input type="text" name="age">
            </label>
        </div>
        <div>
            <label>Relationship
                <select name="rel">
                    <option value="">---</option>
                    <option value="self">Self</option>
                    <option value="spouse">Spouse</option>
                    <option value="child">Child</option>
                    <option value="parent">Parent</option>
                    <option value="grandparent">Grandparent</option>
                    <option value="other">Other</option>
                </select>
            </label>
        </div>
        <div>
            <label>Smoker?
                <input type="checkbox" name="smoker">
            </label>
        </div>
        <div>
            <button class="add">add</button>
        </div>
        <div>
            <button type="submit">submit</button>
        </div>
    </form>
</div>
<pre class="debug"></pre>

JS

function go() {
        var debug_class = document.querySelectorAll(".debug");
        for (var i = 0; i < debug_class.length; i++) {
            var element = debug_class[i];
            element.innerText = JSON.stringify(serializeArray(document.querySelector("form")));
        }

    }

    function serializeArray(form) {
        var field, l, s = [];
        if (typeof form == 'object' && form.nodeName == "FORM") {
            var len = form.elements.length;
            for (i = 0; i < len; i++) {
                field = form.elements[i];
                if (field.name && !field.disabled && field.type != 'file' && field.type != 'reset' && field.type != 'submit' && field.type != 'button') {
                    if (field.type == 'select-multiple') {
                        l = form.elements[i].options.length;
                        for (j = 0; j < l; j++) {
                            if (field.options[j].selected)
                                s[s.length] = {
                                    name: field.name,
                                    value: field.options[j].value
                                };
                        }
                    } else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) {
                        s[s.length] = {
                            name: field.name,
                            value: field.value
                        };
                    }
                }
            }
        }
        return s;
    }


    function validate(form) {
        fail = validateAge(form.age.value)
        fail += validateRel(form.rel.value)

        if (fail == "") return true
        else {
            alert(fail);
            return false
        }
        go();
    }

    function validateAge(field) {
        if (isNaN(field)) return "No age was entered. \n"
        else if (field < 1 || field > 200)
            return "Age must be greater than 0. \n"
        return ""
    }

    function validateRel(field) {
        if (field == "") return "Please select a relationship \n"
        return ""
    }

    document.querySelector("form").onsubmit = function() {
        return validate(this)
    }

    document.querySelector(".add").onclick = function(event) {
        go();
        event.preventDefault();
        createinput()
    }

    count = 0;

    function createinput() {
        field_area = document.querySelector('.household')
        var li = document.createElement("li");
        var p1 = document.createElement("p");
        var p2 = document.createElement("p");
        var p3 = document.createElement("p");
        var x = document.getElementsByName("age")[0].value;
        var y = document.getElementsByName("rel")[0].value;
        var z = document.getElementsByName("smoker")[0].checked;
        if (!z) {
            z = "Non smoker \n";
        } else {
            z = "Smoker \n";
        }
        p1.innerHTML = x;
        p2.innerHTML = y;
        p3.innerHTML = z;
        li.appendChild(p1);
        li.appendChild(p2);
        li.appendChild(p3);
        field_area.appendChild(li);
        //removal link
        var removalLink = document.createElement('a');
        removalLink.onclick = function() {
            this.parentNode.parentNode.removeChild(this.parentNode)
        }
        var removalText = document.createTextNode('Remove Field');
        removalLink.appendChild(removalText);
        li.appendChild(removalLink);
        count++
    }

    // serialize form

    var data = {};
    var inputs = [].slice.call(inputs.target.querySelector('form'));
    inputs.forEach(input => {
        data[input.name] = input.value;
    });

【问题讨论】:

  • 你没有 HTML 类 debug,所以你的 go() 函数不会做任何事情。
  • 嘿 @obsidian Age 忘记完全复制和粘贴我的 html。刚刚更新了 HTML 部分。请让我知道你在想什么。我在这个问题上摸不着头脑。我不知道我错过了什么。
  • 嘿@ObsidianAge 忘了完全复制和粘贴我的html。刚刚更新了 HTML 部分。请让我知道你在想什么。我在这个问题上摸不着头脑。我不知道我错过了什么。除了用户点击提交时表单字段中的内容之外,我所需要的只是提交的动态列表项值。

标签: javascript html json forms


【解决方案1】:

JavaScript 本质上不能通过典型的 HTML“提交”按钮发布动态表单元素。使用 jQuery 会相当简单,但你说你不能使用它。此外,您的 HTML 结构使得通过原始 JavaScript 处理表单提交相当笨拙,因为您无法编辑它以将函数附加到表单提交(也无法更改 HTML)。

您还需要在提交之前对表单进行序列化,如果没有 jQuery,这很笨重。有很多库可以做到这一点,但您可能需要基于您的代码结构的特定库。可以在here 找到很多关于如何做到这一点的示例。

// Sample serialization function structure
function serialize(form) {
    // Serialize
}

然后您需要从表单创建一个 JavaScript 元素,手动附加一个事件监听器,阻止表单提交,序列化数据,然后手动重新提交。

const element = document.querySelector('form');
 element.addEventListener('submit', event => {
   event.preventDefault();
   serialize(element);
   element.submit();
 });

这是一个复杂的过程,您可能希望从整个过程中寻找一种替代方法。但是,我希望这能够解决您的问题:)

【讨论】:

  • 酷。谢谢(你的)信息。我也习惯于做所有这些 jQuery 方式,只是不确定如何做 Javascript 路由,因为我更多地是设计/开发之间的混合体。新年快乐!
  • 也祝你新年快乐,祝你的项目好运:)
猜你喜欢
  • 2013-07-07
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多