Wanikani Mistake Delay

Adds a delay after wrong answers to prevent double-tapping <enter>

  1. // ==UserScript==
  2. // @name Wanikani Mistake Delay
  3. // @namespace wkmistakedelay
  4. // @description Adds a delay after wrong answers to prevent double-tapping <enter>
  5. // @include https://www.wanikani.com/review/session*
  6. // @include https://www.wanikani.com/lesson/session*
  7. // @version 2.1.1
  8. // @author Robin Findley
  9. // @copyright 2017+, Robin Findley
  10. // @license MIT; http://opensource.org/licenses/MIT
  11. // @run-at document-end
  12. // @grant none
  13. // ==/UserScript==
  14.  
  15. window.wkmistakedelay = {};
  16.  
  17. (function(gobj) {
  18.  
  19. //==[ Settings ]=====================================================
  20. var settings = {
  21.  
  22. // Amount of time to delay (in milliseconds).
  23. delay_period: 2000,
  24.  
  25. // Delay when answer is slightly off (e.g. minor typo).
  26. delay_slightly_off: 1,
  27.  
  28. // Delay when multiple answers are available.
  29. delay_multiple: 1
  30. };
  31. //===================================================================
  32.  
  33. // The amount of time to disable 2nd <enter> after a mistake (in milliseconds).
  34. var old_submit_handler, old_answer_checker, ignore_submit = false;
  35.  
  36. function new_answer_checker() {
  37. // Call the original answer checker.
  38. var result = old_answer_checker.apply(this, arguments);
  39.  
  40. // Check if we have any reason to delay.
  41. var delay = false;
  42. if ((!result.passed && !result.exception) || (settings.delay_multiple && result.multipleAnswers))
  43. delay = true;
  44.  
  45. // Perform a delayed check to see if the answer exception message pops up.
  46. if (!delay && settings.delay_slightly_off) {
  47. setTimeout(function(){
  48. if (($('#answer-exception').length > 0) && ($('#answer-exception').text().match(/a bit off/) !== null)) {
  49. console.log('Delaying due to "a bit off"');
  50. do_delay();
  51. }
  52. }, 1);
  53. }
  54.  
  55. // Initiate the delay if needed.
  56. if (delay) do_delay();
  57.  
  58. function do_delay() {
  59. console.log('Delaying...');
  60. ignore_submit = true;
  61. setTimeout(function() {
  62. ignore_submit = false;
  63. $('#user-response').attr('disabled','disabled');
  64. }, settings.delay_period);
  65. }
  66.  
  67. return result;
  68. }
  69.  
  70. function new_submit_handler(e) {
  71. if (ignore_submit) return false;
  72. return old_submit_handler.apply(this, arguments);
  73. }
  74.  
  75. function startup() {
  76. // Check if we can intercept the submit button handler.
  77. try {
  78. old_submit_handler = $._data( $('#answer-form button')[0], 'events').click[0].handler;
  79. old_answer_checker = answerChecker.evaluate;
  80. } catch(err) {
  81. }
  82. if (typeof old_submit_handler !== 'function' || typeof old_answer_checker !== 'function') {
  83. alert('Wanikani Mistake Delay script is not working.');
  84. return;
  85. }
  86.  
  87. // Replace the handlers.
  88. $._data( $('#answer-form button')[0], 'events').click[0].handler = new_submit_handler;
  89. answerChecker.evaluate = new_answer_checker;
  90. }
  91.  
  92. // Run startup() after window.onload event.
  93. if (document.readyState === 'complete')
  94. startup();
  95. else
  96. window.addEventListener("load", startup, false);
  97.  
  98. })(window.wkselfstudy);

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址