From ff3b7c85db1596ff0ca279902154505ec526d2c1 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Thu, 15 Mar 2012 14:24:46 +0000 Subject: [PATCH] MDL-32064 quiz navigation: JS form submit must fire submit event handlers. --- mod/quiz/module.js | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/mod/quiz/module.js b/mod/quiz/module.js index 63c44d65d8d..3ac6032be1d 100644 --- a/mod/quiz/module.js +++ b/mod/quiz/module.js @@ -143,6 +143,29 @@ M.mod_quiz.nav.init = function(Y) { var form = Y.one('#responseform'); if (form) { + function find_enabled_submit() { + // This is rather inelegant, but the CSS3 selector + // return form.one('input[type=submit]:enabled'); + // does not work in IE7, 8 or 9 for me. + var enabledsubmit = null; + form.all('input[type=submit]').each(function(submit) { + if (!enabledsubmit && !submit.get('disabled')) { + enabledsubmit = submit; + } + }); + return enabledsubmit; + } + + function nav_to_page(pageno) { + Y.one('#followingpage').set('value', pageno); + + // Automatically submit the form. We do it this strange way because just + // calling form.submit() does not run the form's submit event handlers. + var submit = find_enabled_submit(); + submit.set('name', ''); + submit.getDOMNode().click(); + }; + Y.delegate('click', function(e) { if (this.hasClass('thispage')) { return; @@ -157,22 +180,20 @@ M.mod_quiz.nav.init = function(Y) { } else { pageno = 0; } - Y.one('#followingpage').set('value', pageno); var questionidmatch = this.get('href').match(/#q(\d+)/); if (questionidmatch) { form.set('action', form.get('action') + '#q' + questionidmatch[1]); } - form.submit(); + nav_to_page(pageno); }, document.body, '.qnbutton'); } if (Y.one('a.endtestlink')) { Y.on('click', function(e) { e.preventDefault(); - Y.one('#followingpage').set('value', -1); - Y.one('#responseform').submit(); + nav_to_page(-1); }, 'a.endtestlink'); }