【问题标题】:How to remember a form is extended?如何记住一个表格是扩展的?
【发布时间】:2015-11-07 14:09:36
【问题描述】:

我的项目中有一个多步骤表单,第一步有一个 javascript 扩展字段功能,用户可以在其中添加其他字段。如果用户进行下一步,数据当然会存储在 Session 中,直到最终提交。但是,不会记住扩展形式。如果用户从下一步返回附加字段并且其数据不显示,更糟糕的是,如果附加字段中的数据无效,用户将看不到它,因为消息显示在消失的字段下方(我'正在使用 Cakephp 默认验证)。

有没有办法,比如将设置存储在会话中,让它保持不变?

var counter = 0;
function moreFields(val1, val2, val3) {
	counter++;
	var newField = document.getElementById(val1).cloneNode(true);
	newField.id = '';
	newField.style.display = 'block';
	var newFields = newField.querySelectorAll('[name], [id], [for], [data-display]');
		for (var i=0;i<newFields.length;i++) {
			var theNames = newFields[i].name
			if (theNames)
				newFields[i].name = "data[" + val3 + "][" + counter + "][" + theNames + "]";
			var theNames2 = newFields[i].id;
	        if (theNames2)
	            newFields[i].id = theNames2 + counter;
	        	console.log(newFields[i].id); 
	        var theNames3 = newFields[i].htmlFor;
	        if (theNames3)
	            newFields[i].htmlFor = theNames3 + counter;
	        	//console.log(newFields[i].htmlFor);  
    		var theNames4 = newFields[i].dataset.display;
	        if (theNames4)
	            newFields[i].dataset.display = theNames4 + counter;
	        	console.log(newFields[i].dataset.display);  	
		}			
	var insertHere = document.getElementById(val2);
	insertHere.parentNode.insertBefore(newField,insertHere);
}
<span id="readroot" style="display: none">
<div class="row">
	<div class="col-lg-6">
		<div class="form-group required">
            <label for="Student1Grade">Grade</label>
            <select name="grade" data-display="#display_student_1_grade" class="form-control" id="Student1Grade" required="required">
                <option value="">Please Select</option>
                <option value="1">Grade 1</option>
                <option value="1">Grade 2</option>
            </select>
        </div>						
	</div>
	<div class="col-lg-6">
		<div class="form-group">
            <label for="Student1Gender">Gender</label>      
            <select name="gender" data-display="#display_student_1_gender" class="form-control" id="Student1Gender">
                <option value="1">Male</option>
                <option value="2">Female</option>
            </select>
        </div>
	</div>	
</div>
<input class="btn btn-default" type="button" value="Remove" onclick="this.parentNode.parentNode.removeChild(this.parentNode);" /><br /><br />
</span>
<span id="writeroot"></span>		
<input class="btn btn-default" type="button" onclick="moreFields('readroot', 'writeroot', 'Student')" value="Add Field" />

【问题讨论】:

  • 在进行下一步之前,您是否在会话中存储了其他字段详细信息以及数据?
  • 是的。所有数据每一步都保存在会话中,典型的多步表单方法。但是当用户返回时,附加字段消失了,即使用户再次点击“添加字段”,新附加字段的 id 也可能不一样。
  • 如果我们在浏览器会话中保存数据,那对你有好处?????
  • 我希望浏览器记住用户已经添加了额外的字段并让它们保持不变,所以当用户从下一步返回或者当他/她点击“下一步”时被验证停止时,附加字段不会消失。

标签: javascript jquery session


【解决方案1】:

您需要为您的页面实现 sessionStorage 或 localStorage。

localStorage - 存储没有过期日期的数据

sessionStorage - 存储一个会话的数据(关闭浏览器选项卡时数据丢失)

在这里,我只是发布示例代码以供您帮助,您可以通过它来完成您想要的任务。您只需要遵循以下代码中的逻辑概念并在您的代码中实现即可。

还有一个示例仅包含id,但您可以通过其他方式实现它,以完成您的任务。

click here

【讨论】:

  • 如果您在修改代码时遇到问题,您可以随时询问
  • 谢谢。这正是我所需要的。但是..我可以厚颜无耻地要求更多提示吗?我试图让你的代码适应我的需要,但是我想不通。如果一个表单被克隆,我可以为其分配一个唯一的 id,并将它与所有相关的递增字段 id 一起保存到 sessionStorage。但是,如果 sessionStorage 返回 true 表示 id 存在,假设用户创建了两个表单,我是否将 moreFields() 设置为自动再次运行克隆方法两次?你能否就我如何去做更多的建议?非常感谢。
  • 是的,我在修改它时遇到了问题……想了一个小时尝试……我真的不想再打扰你了,但是……
  • 首先从 sessionStrorage 中获取变量,然后检查它是否为 null.... get null 表示您已经为这个唯一变量设置了值,现在您可以使用它附加新的表单数据,当您需要时,您可以交叉检查元素
  • 我了解'check id if null'位,但我不知道当它返回值时我该怎么办,我是否将函数设置为自动克隆表单?不知道有没有帮助,我正在尝试做this
猜你喜欢
  • 2012-11-29
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2013-07-27
  • 1970-01-01
相关资源
最近更新 更多