Greasy Fork

Greasy Fork is available in English.

解决哈工程查成绩网站在现代浏览器上显示不出来具体成绩对话框的问题

只是一个 `window.showModalDialog()` 和 `<dialog>` 的 Polyfill

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         解决哈工程查成绩网站在现代浏览器上显示不出来具体成绩对话框的问题
// @namespace    https://github.com/Lifeni
// @version      0.0.2
// @description  只是一个 `window.showModalDialog()` 和 `<dialog>` 的 Polyfill
// @author       Lifeni
// @match        http*://*.hrbeu.edu.cn/*
// @require      https://unpkg.com/[email protected]/dist/dialog-polyfill.js
// @license      MIT
// @grant        none
// ==/UserScript==

// 这只是一个 window.showModalDialog() 和 <dialog> 的 Polyfill
// 查成绩页面用到了 window.showModalDialog() 这个方法,
// 但是这个方法在现代的浏览器中已经不用了,
// 所以点击成绩的时候就加载不出来那个对话框,
// 因此只要添加一个“腻子脚本(Polyfill)”,把这个方法补上就行。

// 另外,在 Firefox 浏览器上,<dialog> 这个标签已经被删除了,
// 但是上面的腻子脚本用到了这个标签,
// 所以还要添加 <dialog> 的腻子脚本。

// **注意** 右上角的才是关闭按钮。

// 引用的两个腻子脚本分别是
// https://github.com/niutech/showModalDialog
// https://github.com/GoogleChrome/dialog-polyfill

(function () {
    window.spawn = window.spawn || function(gen) {
        function continuer(verb, arg) {
            var result;
            try {
                result = generator[verb](arg);
            } catch (err) {
                return Promise.reject(err);
            }
            if (result.done) {
                return result.value;
            } else {
                return Promise.resolve(result.value).then(onFulfilled, onRejected);
            }
        }
        var generator = gen();
        var onFulfilled = continuer.bind(continuer, 'next');
        var onRejected = continuer.bind(continuer, 'throw');
        return onFulfilled();
    };

    window.showModalDialog = window.showModalDialog || function(url, arg, opt) {
        url = url || ''; //URL of a dialog
        arg = arg || null; //arguments to a dialog
        opt = opt || 'dialogWidth:300px;dialogHeight:200px'; //options: dialogTop;dialogLeft;dialogWidth;dialogHeight or CSS styles
        var caller = showModalDialog.caller.toString();

        // <dialog> 的 Polyfill 需要先注册一下
        var el = document.createElement('dialog');
        var dialog = document.body.appendChild(el);
        dialogPolyfill.registerDialog(el);

        dialog.setAttribute('style', opt.replace(/dialog/gi, ''));
        dialog.innerHTML = '<a href="#" id="dialog-close" style="position: absolute; top: 0; right: 5px; font-size: 20px; color: #000; text-decoration: none; outline: none;">&times;</a><iframe id="dialog-body" src="' + url + '" style="border: 0; width: 100%; height: 100%;"></iframe>';
        document.getElementById('dialog-body').contentWindow.dialogArguments = arg;
        document.getElementById('dialog-close').addEventListener('click', function(e) {
            e.preventDefault();
            dialog.close();
        });
        dialog.showModal();
        //if using yield or async/await
        if(caller.indexOf('yield') >= 0 || caller.indexOf('await') >= 0) {
            return new Promise(function(resolve, reject) {
                dialog.addEventListener('close', function() {
                    var returnValue = document.getElementById('dialog-body').contentWindow.returnValue;
                    document.body.removeChild(dialog);
                    resolve(returnValue);
                });
            });
        }
        //if using eval
        var isNext = false;
        var nextStmts = caller.split('\n').filter(function(stmt) {
            if(isNext || stmt.indexOf('showModalDialog(') >= 0)
                return isNext = true;
            return false;
        });
        dialog.addEventListener('close', function() {
            var returnValue = document.getElementById('dialog-body').contentWindow.returnValue;
            document.body.removeChild(dialog);
            nextStmts[0] = nextStmts[0].replace(/(window\.)?showModalDialog\(.*\)/g, JSON.stringify(returnValue));
            eval('{\n' + nextStmts.join('\n'));
        });
        throw 'Execution stopped until showModalDialog is closed';
    };
})();