JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://code.jquery.com/ui/1.11.3/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css">
<form action="javascript:void(0)" method="post" id="myForm">
<div id="accordion">
<h3>Section 1</h3>
<div>
<p>Field 1: <input type="text" name="text1" required="required" /></p>
<p>Field 2: <input type="text" name="text2" required="required" /></p>
<p>Field 3: <input type="text" name="text3" required="required" /></p>
<p>Field 4: <input type="text" name="text4" /></p>
</div>
<h3>Section 2</h3>
<div>
<p>Field 5: <input type="text" name="text5" required="required" /></p>
<p>Field 6: <input type="text" name="text6" required="required" /></p>
</div>
<h3>Section 3</h3>
<div>
<p>Field 7: <input type="text" name="text7" required="required" /></p>
<p>Field 8: <input type="text" name="text8" required="required" /></p>
</div>
<h3>Section 4</h3>
<div>
<p>Field 9: <input type="text" name="text9" required="required" /></p>
<p><input type="submit" value="Send" /></p>
</div>
</div>
</form>
JavaScript
// save the accordion in a variable as you'll need it later
$accordion = $("#accordion").accordion();
// when the submit is clicked
$("#myForm input[type='submit']").on("click", function(event) {
// traverse all the required elements looking for an empty one
$("#myForm input[required='required']").each(function() {
// if the value is empty, that means that is invalid
if ($(this).val() == "") {
// find the index of the closest h3 (divide by 2 because it goes in pairs h3-div. A bit hacky, sorry)
var item = $(this).closest(".ui-accordion-content").prev().index() / 2;
// open that accordion section that contains the required field
$accordion.accordion("option","active", item);
// stop scrolling through the required elements
return false;
}
});
});