Quizlet Test Lag Remover

Remove lag-causing test logic in Quizlet test

  1. // ==UserScript==
  2. // @name Quizlet Test Lag Remover
  3. // @version 1.0
  4. // @author refracta
  5. // @description Remove lag-causing test logic in Quizlet test
  6. // @match https://quizlet.com/*
  7. // @icon https://www.google.com/s2/favicons?sz=64&domain=quizlet.com
  8. // @license MIT
  9. // @run-at document-end
  10. // @namespace https://gf.qytechs.cn/users/467840
  11. // ==/UserScript==
  12. (async function () {
  13. 'use strict';
  14. function waitFor(checkFunction, checkDelay = 100) {
  15. return new Promise(resolve => {
  16. let i = setInterval(_ => {
  17. try {
  18. let check = checkFunction();
  19. check ? clearInterval(i) || resolve(check) : void 0
  20. } catch (e) {}
  21. }, checkDelay);
  22. });
  23. }
  24. if (location.pathname.endsWith('/test')) {
  25. await waitFor(_ => document.querySelector('div[role="dialog"]'));
  26. await waitFor(_ => document.querySelector('div[role="dialog"]') === null);
  27. let listInputs = Array.from(await waitFor(_ => document.querySelectorAll('.AssemblyInput input')));
  28. let clones = [];
  29. for (let i = 0; i < listInputs.length; i++) {
  30. let e = listInputs[i];
  31. const index = i;
  32. let clone = e.cloneNode(true);
  33. clone.addEventListener('keydown', function (e) {
  34. if (e.code === 'Enter') {
  35. setTimeout(_ => {
  36. clones[index + 1].focus();
  37. }, 325);
  38. }
  39. });
  40. clones.push(clone);
  41. e.parentNode.replaceChild(clone, e);
  42. }
  43.  
  44. let submit = document.querySelector('#testCTA');
  45. let submitClone = submit.cloneNode(true);
  46. submit.parentNode.replaceChild(submitClone, submit);
  47. submitClone.addEventListener('click', function (e) {
  48. function setValue(element, value) {
  49. let setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value").set;
  50. setter.call(element, value);
  51. let event = new Event('input', {
  52. bubbles: true
  53. });
  54. element.dispatchEvent(event);
  55. }
  56.  
  57. for (let i = 0; i < clones.length; i++) {
  58. clones[i].parentNode.replaceChild(listInputs[i], clones[i]);
  59. setValue(listInputs[i], clones[i].value);
  60. }
  61. submitClone.parentNode.replaceChild(submit, submitClone);
  62. submit.click();
  63. });
  64. }
  65. })();

QingJ © 2025

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