【问题标题】:Trying to use a template tag to extend forms using javascript尝试使用模板标签来使用 javascript 扩展表单
【发布时间】:2021-03-15 21:08:30
【问题描述】:

我要做的是在这个 HTML 页面中添加一个“添加项目按钮”,该页面将采用模板并在提交按钮上方生成它。

但是,在我创建了一个附加对象之后,我在newFields.id = ''; 线上遇到了一个错误。所以它运行一次然后中断。错误是:Uncaught TypeError: Cannot set property 'id' of null at moreProducts (Survey.html:26) at HTMLInputElement.onclick (Survey.html:113)这是我第一次使用JavaScript,希望是一个简单的错误。

这是我的代码调查.HTML

<!--  NOTE: Please add the following <META> element to your page <HEAD>.      -->
<!--  If necessary, please modify the charset parameter to specify the        -->
<!--  character set of your HTML page.                                        -->
<!--  ----------------------------------------------------------------------  -->

<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8">

<!--  ----------------------------------------------------------------------  -->
<!--  NOTE: Please add the following <FORM> element to your page.             -->
<!--  ----------------------------------------------------------------------  -->

<form action="https://webto.WebToLead?encoding=UTF-8" method="POST">


<script language="javascript">
    var counter = 0;

function moreProducts()
{
    counter++;
    var template = document.getElementsByTagName("template")[0];
    newFields = template.content.querySelector("div");
    newFields.id = '';
    newFields.style.display = 'block';
    var newField = newFields.childNodes;
    for( var i=0; i<newField.length; i++)
    {
        var theName = newField[i].name
        if(theName)
        {
            newField[i].name = theName + counter;
        }
    }
    var insertHere = document.getElementById('submit');
    insertHere.parentNode.insertBefore(newFields,insertHere);
}
</script>

<!--  ----------------------------------------------------------------------  -->
<!--  NOTE: These fields are optional debugging elements. Please uncomment    -->
<!--  these lines if you wish to test in debug mode.                          -->
 <input type="hidden" name="debug" value=1>                             
<!--  ----------------------------------------------------------------------  -->

<label for="first_name">First Name</label><input  id="first_name" maxlength="40" name="first_name" size="20" type="text" /><br>

<label for="last_name">Last Name</label><input  id="last_name" maxlength="80" name="last_name" size="20" type="text" /><br>

<label for="email">Email</label><input  id="email" maxlength="80" name="email" size="20" type="text" /><br>

<label for="phone">Phone</label><input  id="phone" maxlength="40" name="phone" size="20" type="text" /><br>

<label for="company">Company</label><input  id="company" maxlength="40" name="company" size="20" type="text" /><br>

<label for="url">Website</label><input  id="url" maxlength="80" name="url" size="20" type="text" /><br>

<label for="street">Street</label><textarea name="street"></textarea><br>

<label for="city">City</label><input  id="city" maxlength="40" name="city" size="20" type="text" /><br>

<label for="state">State/Province</label><input  id="state" maxlength="20" name="state" size="20" type="text" /><br>

<label for="zip">Zip</label><input  id="zip" maxlength="20" name="zip" size="20" type="text" /><br>

Project Name:<input  id="00N3a00000COzOT" maxlength="50" name="00N3a00000COzOT" size="20" type="text" /><br>

<template>
    <div>
        <input type="button" value="Remove Item" onclick="this.parentNode.parentNode.removeChild(this.parentNode);" /><br /><br />

        Product Description:<textarea  id="00N3a00000COzOY" name="00N3a00000COzOY" rows="15" type="text" wrap="soft"></textarea><br>

        Product Name:<input  id="00N3a00000CP0vo" maxlength="25" name="00N3a00000CP0vo" size="20" type="text" /><br>

        Product Weight:<input  id="00N3a00000COzOd" name="00N3a00000COzOd" size="20" type="text" /><br>

        Product Width:<input  id="00N3a00000COzOi" name="00N3a00000COzOi" size="20" type="text" /><br>

        Product Length:<input  id="00N3a00000COzOn" name="00N3a00000COzOn" size="20" type="text" /><br>

        Product Height:<input  id="00N3a00000COzOs" name="00N3a00000COzOs" size="20" type="text" /><br>

    </div>
</template>

<div id= "First Product">
    <input type="button" value="Remove Item" onclick="this.parentNode.parentNode.removeChild(this.parentNode);" /><br /><br />

    Product Description:<textarea  id="00N3a00000COzOY" name="00N3a00000COzOY" rows="15" type="text" wrap="soft"></textarea><br>

    Product Name:<input  id="00N3a00000CP0vo" maxlength="25" name="00N3a00000CP0vo" size="20" type="text" /><br>

    Product Weight:<input  id="00N3a00000COzOd" name="00N3a00000COzOd" size="20" type="text" /><br>

    Product Width:<input  id="00N3a00000COzOi" name="00N3a00000COzOi" size="20" type="text" /><br>

    Product Length:<input  id="00N3a00000COzOn" name="00N3a00000COzOn" size="20" type="text" /><br>

    Product Height:<input  id="00N3a00000COzOs" name="00N3a00000COzOs" size="20" type="text" /><br>

</div>





<input id="submit" type="submit" name="submit">

<input type="button" id="moreFields" value="Add Another Item" onclick="moreProducts()"/>

</form>


【问题讨论】:

    标签: javascript html forms templatetags


    【解决方案1】:

    原因:您直接在 DOM 上工作,而不是在模板中创建它的克隆。所以它得到原始的DOM,将它插入另一个div,下次它不会找到DOM。

    解决方案: 改JS如下,

        function moreProducts()
    {
        counter++;
        var template = document.getElementsByTagName("template")[0].cloneNode(true); // THIS change will create clone of DOM instead of working on it directly
        newFields = template.content.querySelector("div");
        newFields.id = '';
        newFields.style.display = 'block';
        var newField = newFields.childNodes;
        for( var i=0; i<newField.length; i++)
        {
            var theName = newField[i].name
            if(theName)
            {
                newField[i].name = theName + counter;
            }
        }
        var insertHere = document.getElementById('submit');
        insertHere.parentNode.insertBefore(newFields,insertHere);
    }
    

    【讨论】:

    • 达拉你太棒了!谢谢!这解决了它。
    • 很高兴为您提供帮助。请选择此作为答案,以便对其他人有所帮助:) 编码愉快。!!
    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多