修复「四川大学综合教务系统」只支持 IE9 以下版本浏览器的 Bug

注:本文中的代码并不能完全修复在 Chrome / Firefox 等现代化浏览器下打开四川大学综合教务系统的  bug ,为了解决之后我发现的另一个问题,我写了这篇文章的后续更新:修复「四川大学综合教务系统」只支持 IE9 以下版本浏览器的 Bug(2),在这篇后续更新中提供的代码可以完全修复综合教务系统在现代化浏览器下的 Bug 。

如果您只需要能用的成品的代码,请直接访问那篇后续更新文章。

  在大学中,有一些事情是潜移默化中就不得不接受的,比如每天早晨起来时面对枕头上脱落头发的心痛,比如晚上 12 时后想洗澡却没热水的尴尬,比如在校园里漫步时周围全是情侣自己却只能做单身狗的无奈,比如说登录综合教务系统时却看到下面这个提示:


  四川大学的 URP 综合教务系统要求使用 IE9 以下的浏览器访问,也就是说最高支持到 IE8 ,至于 IE8 是什么年代的浏览器……

  在还有半年就到 2019 年的今天,它居然只支持 2009 年推出的 IE8 ……但 IE9+ 起码还有个「兼容性视图」能够模拟老版本 IE 访问,Firefox、Chrome 这些浏览器就完全没办法了。我平时的主力浏览器是 Firefox,开发时用 Chrome,省电时用 Edge,每次都要专门开 IE 让我觉得很是麻烦。

  终于,在一个深邃的夜晚,我突然间意识到,作为一个程序员,却只能被动的接受这种学校的设定,是一件十分不合理的事情,我决定研究一下这个 Bug 究竟来自于什么地方。因为即使在 Firefox、Chrome 或 Edge 等现代化浏览器下,这个综合教务系统登录是没有问题的,登陆后的界面显示也没什么问题,唯一的问题就是——顶部菜单栏无法点击切换,左侧菜单无法显示,所以这个 Bug 应该只是个小问题。

  我一开始猜测,会不会是 Ajax 连接上用了一些史前的方法,比如在那个 jQuery 还没有一统天下的时代,有的网页在手写 Ajax 方法时只用了 ActiveXObject,却没有写 XMLHttpRequest 做兼容处理,于是在当下这个 ActiveX 已经随着 IE 一起没落的时代,用这种 Ajax 实现方式的网页也就凉了。但我看了下网络请求后发现我想多了,Ajax 毫无问题,爱情也是这样,总会因为自己想多而浪费时间走弯路。

  那么就打开网页后直接看 Console 吧。

  第一个错误我点进去看了看,是一个没有被调用过的函数里,在调用另一个函数时少打了一个括号,但这看样子不会有什么影响。因此我推断,第二个错误应该是造成 bug 的元凶。

  点进去后果然看到了一个不兼容现代浏览器的写法:window.frames(),我们都知道,window.frames 可以返回当前窗口,是一个类数组对象,列出了当前窗口的所有直接子窗口。通过 window.frames 访问子窗口时,既可以用数组下标访问,也可以用属性访问(如果设定了 name 的话)。在老版本 IE 中,window.frames 还是个 function,可以用传函数参数(子窗口的 name)的方式访问,但之后这种不合标准的解释方式就被废除了,因此这段代码在老版本 IE 中执行正常,在新版本 IE,以及 Firefox、 Chrome 等浏览器中就会报错,因为 window.frames 已经不是一个 function 了,这样得到的结果一定是 undefined。

  我再试试看点击菜单栏切换时会报什么错:

  相同的问题。我们看看这个函数:

  确实是简单粗暴的写法……那么只需要替换了这个函数,然后执行一下这个函数,应该就能正常的切换菜单栏了:

  果然,执行后效果立竿见影,菜单栏立马就能切换了,左侧菜单也显示正常了:

  不过很显然,我不可能每次登陆后,都进 Console 粘贴一下这段代码……有这时间我还不如去打开 IE。

  所以我把这个包装了一下,加上了运行过程中的提示,做成了一个「javascript: 伪协议」的链接,放到书签栏上调用。我们只需要把下面这个超链接直接拖动到收藏栏即可:

修复 SCU URP

  效果如图:

javascript:(function(){var href=window.location.href;if(href==='http://202.115.47.141/loginAction.do'||href==='http://zhjw.scu.edu.cn/loginAction.do'){var topFrame=window.frames.topFrame;var bottomFrame=window.frames.bottomFrame;var menuFrame=bottomFrame.frames.menuFrame;topFrame.changeLeftMenu=function(){if(bottomFrame&&menuFrame&&menuFrame.menus){menuFrame.menus.index=topFrame.moduleNum;menuFrame.menus.show();menuFrame.menus.click()}};topFrame.changeLeftMenu();window.alert('恭喜!修复成功!')}else{window.alert('抱歉,您当前不处于四川大学 URP 登陆后的页面。请登陆后再使用哦。')}})();

  当然,如果新建一个书签,手动把上面那段代码粘贴到书签的地址中,保存到书签栏上,也是完全可以的,就是麻烦了一点。或者也可以直接把上面这段代码复制到浏览器地址栏里,然后回车运行。只不过现在很多浏览器会自动删去代码前的「javascript:」伪协议标识符,需要粘贴后手动补上。

  不过,每次点击一下也不是那么方便,因此我编写了一个 Userscript,放在了 Greasy Fork 上,经测试在 Chrome/Firefox 浏览器 + Tampermonkey 插件下运行无问题,可以在登陆综合教务系统后静默修复该 Bug。安装地址为:

https://greasyfork.org/en/scripts/368192-%E5%9B%9B%E5%B7%9D%E5%A4%A7%E5%AD%A6%E6%9C%AC%E7%A7%91%E6%95%99%E5%8A%A1%E7%B3%BB%E7%BB%9F%E5%8A%A9%E6%89%8B

  注:该脚本不支持 Greasemonkey,只支持 Tampermonkey!

  总之,作为程序猿,对于学校教务系统这种长久以来也没有修正的 Bug,不应该默默接受,而是要充分发挥主观能动性来解决问题。

修复「四川大学综合教务系统」只支持 IE9 以下版本浏览器的 Bug》有11个想法

  1. Pingback引用通告: 修复「四川大学综合教务系统」只支持 IE9 以下版本浏览器的 Bug(2) | 一个兆基

  2. Pingback引用通告: 修复「四川大学综合教务系统」只支持 IE9 以下版本浏览器的 Bug(2) | 一个兆基

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注