我有一个问答网站,有大约30个问题,网站是这样的,一次显示一个问题。当你按下一个按钮时,你只会转到下一个问题。
我有一个问题,当我点击下一个按钮时,表单会自动发送表单到php_script,然后将数据提交给数据库,
下面是jquery文件,它使表单一次显示一个问题。但问题是当单击下一个按钮(在表单元素中)时,即使其他必填字段为空,表单也会提交。
在数据库中,我最终得到第一个响应,其余的都是null或零
我非常感谢你帮助我的努力。我不知道该怎么做
var q = 1;
$(document).ready(function() {
var selectedOption = $('input[name=options]:checked').val();
$(".questions").hide();
$("#question1").show();
$("#next").click(function() {
$("#question" + q).hide();
q = q + 1;
if(q > 30) {
$("#next").remove();
$("body").append("<input type='submit' value='Submit'>");
} else {
$("#question" + q).show();
}
});
if ((selectedOption == '')){
e.preventDefault();
}
});
答案 0 :(得分:1)
您当前的验证码位于:
$(document).ready(...)
在浏览器解析完所有HTML后立即执行。这不是验证表单元素的正确时间。
您需要在<form>
元素的submit
事件中使用此逻辑,以便您可以在合适的时间验证表单元素,然后e.preventDefault()
可能会取消{{1}事件。
此外,不要将变量设置为等于HTML元素的属性值,就像使用此行一样:
submit
因为这将在那个时刻仅存储元素的值。当值稍后更改时,您的变量将不具有该数据。
即使你有正确的事情,你的实际事件取消代码:
var selectedOption = $('input[name=options]:checked').val();
不起作用,因为您没有将事件对象引用捕获为事件处理函数参数。 e.preventDefault();
将是e
。
这是您应该使用的更多结构(有关详细信息,请参阅内联注释):
undefined
答案 1 :(得分:0)
我重新发明了一下这个轮子,原始代码在html方面有点模糊,所以我挥霍并写下了如何通过严重依赖jQuery和事件处理程序来完成类似的事情。也没有提交按钮,用jQuery处理它。
的index.html
$(function() {
// Namespace to not pollute, be good to your browser environment, but still allow access from the outside
window.QUESTIONS = window.QUESTIONS || {};
// Save references, because it's not my memory, but my time
QUESTIONS.form = $('#questionForm')
// Disable everything from the start
QUESTIONS.next = $('#next').prop('disabled', true);
QUESTIONS.previous = $('#previous').prop('disabled', true);
QUESTIONS.complete = $('#complete').prop('disabled', true);
// We start at 1
QUESTIONS.position = 1;
QUESTIONS.max = 3; // Could compute this with jquery, but this is an example
QUESTIONS.current = undefined; // The current question jquery reference
// Never auto submit, but we have a way around this ;)
QUESTIONS.form.submit (function() {
return false;
});
// Hide everything
$(".question", QUESTIONS.form).hide();
function checkButtons() {
var checked = QUESTIONS.current && $('input[type=radio]:checked', QUESTIONS.current).length == 1;
// Complete
if (checked && QUESTIONS.position == QUESTIONS.max) { // Only check if set
QUESTIONS.complete.prop('disabled', false);
} else {
QUESTIONS.complete.prop('disabled', true);
}
// Next
if (checked && QUESTIONS.position < QUESTIONS.max) { // Only check if set
QUESTIONS.next.prop('disabled', false);
} else {
QUESTIONS.next.prop('disabled', true);
}
}
function activateQuestion(position) {
// Hide the old question
if (QUESTIONS.current) {
QUESTIONS.current.hide();
}
// Save the position
QUESTIONS.position = position - 0;
// Save the reference
QUESTIONS.current = $('.question[questionIndex=' + QUESTIONS.position + ']', QUESTIONS.form).show();
// Can we go back?
QUESTIONS.previous.prop('disabled', !(QUESTIONS.position > 1));
// setup buttons
checkButtons();
}
QUESTIONS.form.on('click', 'input[type=radio]', function(){
// When I check something, work on buttons
checkButtons();
});
// Stop enter from submitting
$('.question input[type=radio]', QUESTIONS.form).keypress(function(e) {
if(e.which == 13) {
e.preventDefault();
}
});
// Next event
QUESTIONS.next.click(function() {
activateQuestion(QUESTIONS.position + 1)
});
// Previous event
QUESTIONS.previous.click(function() {
activateQuestion(QUESTIONS.position - 1)
});
QUESTIONS.complete.click(function(){
QUESTIONS.form[0].submit();
});
// Show the first
activateQuestion(1);
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="somewhere.php" id="questionForm" method="POST">
<div class="questions">
<div class="question" questionIndex="1">
<h1>Question Title 1</h1>
<p>
<input type="radio" name="question1" id="question1_1" value="A"/> <label for="question1_1">Answer A</label>
</p>
<p>
<input type="radio" name="question1" id="question1_2" value="B"/> <label for="question1_2">Answer B</label>
</p>
<p>
<input type="radio" name="question1" id="question1_3" value="C"/> <label for="question1_3">Answer C</label>
</p>
</div>
<div class="question" questionIndex="2">
<h1>Question Title 2</h1>
<p>
<input type="radio" name="question2" id="question2_1" value="A"/> <label for="question2_1">Answer A</label>
</p>
<p>
<input type="radio" name="question2" id="question2_2" value="B"/> <label for="question2_2">Answer B</label>
</p>
<p>
<input type="radio" name="question2" id="question2_3" value="C"/> <label for="question2_3">Answer C</label>
</p>
</div>
<div class="question" questionIndex="3">
<h1>Question Title 3</h1>
<p>
<input type="radio" name="question3" id="question3_1" value="A"/> <label for="question3_1">Answer A</label>
</p>
<p>
<input type="radio" name="question3" id="question3_2" value="B"/> <label for="question3_2">Answer B</label>
</p>
<p>
<input type="radio" name="question3" id="question3_3" value="C"/> <label for="question3_3">Answer C</label>
</p>
</div>
<button id="previous">Previous</button>
<button id="next">Next</button>
<button id="complete">Complete</button>
</div>
</form>
&#13;
答案 2 :(得分:-1)
编辑3:
修改示例以隐藏上一个问题,因此一次只显示一个问题。
编辑2:
正如Scott Marcus所指出的,我将把事件处理程序移到 app.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-type');
res.setHeader('Access-Control-Allow-Headers', 'X-Signature');
res.setHeader('Access-Control-Allow-Headers', 'X-Key');
next();
}
);
将.custom-form .form-control{
width:100%;
}
按钮处理程序移到 <div class="container">
<div class="row">
<div class="col-xs-12">
<h1 class="margin-bottom-30">Get Instant Essay Writing / Editing Help</h1>
</div> <!-- end col-xs-12 -->
</div> <!-- end row -->
<div class="row">
<form class="form-inline custom-form">
<div class="form-group col-xs-2">
<input type="text" class="form-control input-sm " placeholder="Your Title">
</div>
<div class="form-group col-xs-4">
<select class="form-control input-sm">
<option value="0" selected="" disabled="">Choose Assignment Type</option>
<option value="1">Essay</option>
<option value="18">Admission / Scholarship Essay</option>
<option value="12">Research Paper</option>
<option value="26">Research Proposal</option>
<option value="4">Coursework</option>
<option value="2">Term paper</option>
<option value="5">Article</option>
<option value="22">Literature / Movie review</option>
<option value="9">Reports</option>
<option value="3">Dissertation</option>
<option value="29">Thesis</option>
<option value="30">Thesis Proposal</option>
<option value="13">Creative Writing</option>
<option value="11">Business Plan</option>
<option value="15">Speech / Presentation</option>
<option value="7">Outline</option>
<option value="14">Annotated Bibliography</option>
<option value="6">Dissertation Proposal</option>
<option value="17">Proofreading</option>
<option value="25">Paraphrasing</option>
<option value="28">PowerPoint Presentation</option>
<option value="27">Personal Statement</option>
<option value="24">Non-word Assignments</option>
<option value="23">Math Assignment</option>
<option value="21">Lab Report</option>
<option value="20">Code</option>
<option value="19">Case Study</option>
<option value="16">Other types</option>
</select>
</div>
<div class="form-group col-xs-3">
<input type="text" class="form-control input-sm mg-up1 col-xs-3" placeholder="Your Email Address">
</div>
<div class="form-group col-xs-2 mg-up">
<button type="submit" class="form-control input-sm col-xs-3">Check The Price</button>
</div>
</form></div>
<div class="row">
<h3 class="margin-top-30">Over 7000 Writers and Editors Available 24/7 To Help You Out.</h3>
</div>
</div>
处理程序之外,并添加了一个.submit表单处理程序,以便您可以在那里处理表单提交。
这将帮助您使用单点代码来管理所有表单提交情况(验证,消息,清理等)
.ready
在前面的代码行中,我们检查以名称问题开头的每个问题(它匹配问题1,问题2,问题3,问题11,问题XX等),并且对于每个问题,我们测试它们的值(由用户,如果这些问题中的任何一个为空,您将阻止使用.next
提交表单,如果一切正确,您只需让他们提交表单。
.document.ready
$("[id^='question']").each(function(i){
希望它有所帮助!