本问题由吴越洋同学首先解决,在阅读了吴越洋同学的博客和他编写的Tempermonkey插件脚本代码后,完成了本项目。
吴越洋同学的博客地址为修复NENU教务系统“不能创建对象”等兼容性问题 - YorkWu's Blog
吴越洋同学的插件地址为东北师范大学本科生、研究生教务系统修复
1 问题描述
在访问NENU研究生教务系统网站(http://dsyjs.nenu.edu.cn)时,使用360浏览器和QQ浏览器可以正常打开网站,但使用Chrome浏览器和Firefox浏览器则无法正常打开网站并且报错信息为“系统不能创建对象!(请使用360浏览器的兼容模式)”,如图1所示。
2 原因分析
为了确定在什么条件下会触发图1所示的错误信息 ,检查网页的源代码。
在core.js文件中的send_request()函数中找到了图1所示的提示信息文字。
为了方便分析在Chrome浏览器中打开网站时总会提示图1所示的错误信息的原因,将包含图1所示错误信息文字的代码以及上下文展示在下方。
http_request = false;
if(window.XMLHttpRequest && 1==2 )
{
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType)
{
http_request.overrideMimeType("text/xml");
}
}
else if (window.ActiveXObject)
{
try
{
http_request = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (ei)
{}
}
}
if (!http_request)
{
window.alert("系统不能创建对象!(请使用360浏览器的兼容模式)!");
return false;
}
下面分析以上代码的逻辑。
http_request的初始值为布尔类型的值,false;
第一个if的判断条件为“window.XMLHttpRequest && 1==2 ”,由于1 == 2的值为false,所以一定无法执行if结构体中的代码;
接着判断else if 的判断条件“window.ActiveXObject”是否为真;
通过访问微软官网以及查看JavaScript的API参考文档了解到,ActiveXObject只支持IE浏览器以及以IE浏览器为内核的浏览器。
所以在Chrome浏览器和Firefox浏览器中访问时,else if的判断条件不满足,else if结构体中的代码无法编译执行。
http_reques的值仍然为false;
第2个if的判断条件为“!http_request” ,“!http_request”的值true;
第2个if结构体中的代码成功执行,弹出弹窗提示用户“系统不能创建对象!(请使用360浏览器的兼容模式)!”,且函数返回false。
以上为在Chrome浏览器和Firefox浏览器中访问 NENU研究生教务系统网站(http://dsyjs.nenu.edu.cn)时产生错误提示的分析过程,总结原因为在NENU研究生教务系统网站的源代码中,使用了只有以IE浏览器为内核的浏览器支持的JavaScript的API,导致使用非IE内核的浏览器访问网站时,提示错误信息。
3 解决方法
选择编写Tempermonkey脚本的方法,使用可支持非IE内核的浏览器的API替换网页源代码中仅支持IE内核的API,并且不影响研究生教务系统网站任何其他功能的正常使用。
为了保证不影响研究生教务系统网站任何其他功能的正常使用,对 NENU研究生教务系统网站(http://dsyjs.nenu.edu.cn)做了自动化回归测试。
3.1 Tempermonkey原理
Tempermonkey的原理为当用户在浏览器访问一个网页时,Tempermonkey会检查该网页是否与用户编写的脚本中所包含的网页匹配。
如果匹配成功, Tempermonkey将会在网页的DOM树中注入用户编写的脚本,以实现对网页某些元素的修改。
3.2 解决过程
TODO
3.2 回归测试
TODO
4 收获技术
TODO
5 致谢
TODO