魔改教务系统JS使其支持Chrome 发表于 2020-02-09 | 分类于 日常记录 | 暂无评论 我校教务系统在非IE浏览器上登录时总会提示"不能创建对象", 主页也不会出现功能菜单。  于是就想着能不能魔改Javascript使其支持非IE浏览器。于是就有了下面这一篇文章内容。 (注:Chrome插件**IE Tab**可以直接在Chrome上**完美**运行我校教务系统,这篇文章只是拿来水的) ## 1.XMLHTTP对象 打开抓包神器Fiddler,设置好监听,然后配置好代理,登录教务系统。(为什么不用Chrome的F12来查JS?因为Fiddler方便) 可以看出,在打开和登录教务系统的时候加载了若干个JS文件。  然后Ctrl+F查找关键字"不能创建对象"  就锁定了`/js/core.js`这个文件。然后查看文件详细内容,找到了提示的相关代码:  向前回溯,可以看到`http_request`这个变量是一个对象:  这就很好办呀!改一下就好咯。 修改后:(注意新增部分) 即非IE浏览器用XMLHttpRequest初始化一个相应的对象。  然后打开Fiddler,使用AutoResponder功能(也就是请求中的文件替换)把`core.js`替换成为本地的版本:  之后再次刷新主页,我们可以发现...确实是可以创建对象了...但是菜单根本加载不出来,对应的还有提示: `加载编号为x的应用系统失败,可能是网络延迟问题!` ## 2.selectNodes方法 同样,先定位位置。经过搜索可以发现:  这就是罪魁祸首。向前回溯可以发现这是一个try语句,里面的语句如果发生了错误就会被捕获到,然后到catch块中进行输出。 那么这么一大块内容, 先是利用AJAX获取菜单信息:  再是分层把菜单信息从AJAX获取到的XML中分别提取到不同的数组中:  究竟是哪里出错了呢? 开始逐步调试。 最后发现是`selectNodes`方法出了错。  这个方法是IE独享,并且下方提示,替代方法是`Document.evaluate()`,那就来看看这个evaluate方法怎么用。  本来想着直接把`selectNodes`方法替换一下就好,结果没想到直接表示`evaluate`方法根本不支持IE.... 所以只能再写一个判断是否IE的方法咯,然后根据判断结构来选择用哪个方法。   改好了以后发现还是不能用!依旧是加载错误。 看了看错误信息以后发现`topMenuItems`这个数组是空的! 经过查阅资料后才发现这个XPathResult对象①要用nextIterate()方法进行遍历...并且②最后text属性要变成textContent属性 最终修改如下:  然后把剩下的两层菜单也修改完毕后,刷新页面。 终于可以正常加载图标和菜单了! 然而,当我测试选课功能的时候,超链接`进入选课`按下后始终没有反应...  打开Chrome的F12开发者工具可以发现,给了一个错误。 `Uncaught TypeError: window.showModalDialog is not a function.` 经查,`showModalDialog`方法作用是打开新窗口。在Chrome37即被废弃。 ## 3.showModalDialog 找到了一个替代函数,放入core.js中,刷新。 然而还是无法点击。 错误依旧,找不到函数。 又在fiddler中看了一眼,发现使用这个函数的页面并未引入core.js....所以放入了jspublic.js中,然后刷新。 最后终于可以用了...但是BUG满满,并且界面也是糊的不成样子...估计是**真的太老了**罢了。  ## 后记 这个问题其实特别好解决。直接在Chrome上安装插件`IE Tab`,然后在其中打开使用教务系统即可。无论是界面的复原程度、简便性和可操作性都比魔改强得多。 这篇文章的主要目的就是娱乐和学习性质的。