Greasy Fork

Greasy Fork is available in English.

【首发】EasyWJX附加-保存问卷星已填写答案,实现企业版断点续答;刷新保留答案;实时保存答案;自动恢复答案;

EasyWJX附加脚本,问卷星问卷保存正在填写的答案,刷新后自动补充上次已填写过的内容,可实现问卷星企业版“断点续答”类似的功能

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         【首发】EasyWJX附加-保存问卷星已填写答案,实现企业版断点续答;刷新保留答案;实时保存答案;自动恢复答案;
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  EasyWJX附加脚本,问卷星问卷保存正在填写的答案,刷新后自动补充上次已填写过的内容,可实现问卷星企业版“断点续答”类似的功能
// @author       MelonFish
// @match        https://ks.wjx.top/*/*
// @match        http://ks.wjx.top/*/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
// @grant        none
// @license      GNU GPLv3
// ==/UserScript==
var ran = 1;
(function() {
    'use strict';
    if (ran == 1) {
        ran++;
        // Your code here...
        setTimeout(function () {
            writeAllAnswer() //加载之后就自动填写保存过的答案
        },1000)
        function writeAnswer_radio(id, answer){
            var all_html = document.querySelectorAll('.field.ui-field-contain')[id]
            var radios = all_html.querySelectorAll('.ui-radio')
            if (radios.length!=0) {
                if (answer.ques_id == id) {
                    for (var j=0; j<radios.length; j++) {
                        var this_radio = radios[j];
                        if (this_radio.querySelector('span input').value == answer.answer) {
                            this_radio.click()
                            return 'success'
                        }
                    }
                }
            }
            return 'not_radio'
        }
        function writeAllAnswer() {
            var localAns_ls = getLocalStorage(getwjid())
            if (localAns_ls == null) {
                return 'no_localstorage'
            }
            for (var i=0; i<localAns_ls.length; i++) {
                if (localAns_ls[i].kind == 'radio') {
                    var ret = writeAnswer_radio(i, localAns_ls[i])
                }
            }
        }
        function getAnswer_radio(id) {
            //var id = parseInt(str_id);
            var all_html = document.querySelectorAll('.field.ui-field-contain')[id]
            var checked_radio = all_html.querySelector('.ui-radio.checked')
            if (checked_radio) {
                // 这里返回两个内容,一个是value,一个是结果
                return [checked_radio.querySelector('span input').value, 'success']
            }
            return [0, 'fail']
        }
        function getAllAnswer(){
            var all_ques_html = document.querySelectorAll('.field.ui-field-contain')
            var answer_ls = []
            for (var i=0; i<all_ques_html.length; i++) {
                try {
                    var [ans,status] = getAnswer_radio(i)
                    }catch {
                        var [ans,status] = [0, 'fail']
                        }
                if (status != 'fail') {
                    answer_ls.push({ques_id: i, answer: ans, kind: 'radio'})
                }
            }
            return answer_ls
        }
        function saveAnswerToLocal() {
            var answer_ls = getAllAnswer()
            if (answer_ls.length==0) {
                return false
            }
            var wj_id = getwjid()
            localStorage.setItem('easywjx_localans_'+wj_id, JSON.stringify(answer_ls))
            console.log(answer_ls)
            return true
        }
        function getwjid() {
            return window.location.pathname.replace('/vm/', '').replace('.aspx', '')
        }
        function getLocalStorage(wj_id) {
            return JSON.parse(localStorage.getItem('easywjx_localans_'+wj_id))
        }

        function sleep(time) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve()
                }, time * 1000)
            })
        }
        setTimeout(async function () {
            while(true){
                await sleep(1)
                saveAnswerToLocal()
                await sleep(1)
            }
        }, 2000)
    }
})();