手机登录科大教务处

电脑端的设置

添加快捷菜单

用IE浏览器(或者其他可以登录教务处的浏览器)打开武科大教务处
进入后在空白的地方点击鼠标右键 出现菜单后点击增加快捷菜单

出现如图所示的窗口

选择常用的功能 (教评、选课啥的)提交
刷新教务处页面看快捷菜单是否添加成功

手机上的设置

安装via浏览器

Android版via浏览器下载:点我下载
目前不知道iPhone有什么可以添加脚本的浏览器,所以用iPhone的同学这个教程就没啥用了

新建脚本

打开via浏览器后以此点击: 右下角的菜单→设置→脚本→新建脚本



在域名处输入

1
jwxt.wust.edu.cn

在代码处输入

1
2
3
4
var d=document;
var s=d.createElement('script');
s.setAttribute('src','http://yun.fallingboy.cn/core.js');
d.head.appendChild(s);


完成脚本的添加后可进入教务处看是否可以登录点我去教务处

登录后会出现如下图所示的提示,点击确定就好(小概率会显示无法创建对象,刷新一下就好了)

最后就可以愉快的在手机上登录教务处了

原理分析

关于无法创建对象

在使用火狐浏览器登录教务处时会显示无法创建对象
通过调试页面查看js文件,发现一个名为core.js的js文件中有这样一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
....
function send_request(url,SystemBh)
{
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("不能创建对象!");
return false;
}
....

上面的不能创建对象不就是我们进入的时候看到的不能创建对象嘛,
既然http_request对象无法创建,那我们就去前面看看http_request的创建过程:在代码的第四行声明了http_request这个对象并赋值为false,接着激动人心的代码来了

if(window.XMLHttpRequest && 1==2 )

学过C语言的人应该知道1==2为 false 由于window.XMLHttpRequest和1==2且运算,无论window.XMLHttpRequest是真是假结果都为假(window.XMLHttpRequest的真假表示是否存在这个对象,如果这个对象存在即为真 不存在即为假)。因此第一个if被跳过进入下一个if的判断,也就是第十三行的if。
第十三行的if判断ActiveXObject是否存在,存在则将ActiveXObject赋值给http_request。百度ActiveXObject后发现ActiveXObject只在以IE为内核的浏览器中存在,因此在非IE内核的浏览器中不存在ActiveXObject对象 导致无法创建对象
在手机上设置的脚本就是将第一个if中的1==2去掉的脚本注入到教务处网页中,所以手机上就可以创建对象。但是这也导致了另一个问题——-加载系统应用失败

关于加载系统应用失败

core.js 中的send_request()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
function send_request(url,SystemBh) 
{
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("不能创建对象!");
return false;
}

try
{
http_request.open("POST",url, false);

http_request.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");

http_request.send(null);

var tmpxml = http_request.responseXML;

//加载顶层菜单开始
var topXml = tmpxml.selectNodes("/Menus/topMenus/Menu");
for(i=0;i<topXml.length;i++)
{
topMenuItems[topMenuLength] = new Array();
topMenuItems[topMenuLength][0] = topXml[i].attributes.getNamedItem("parentid").text;
topMenuItems[topMenuLength][1] = SystemBh + "_" + topXml[i].attributes.getNamedItem("id").text;
topMenuItems[topMenuLength][2] = topXml[i].attributes.getNamedItem("name").text;
topMenuItems[topMenuLength][3] = topXml[i].attributes.getNamedItem("title").text;
topMenuItems[topMenuLength][4] = topXml[i].attributes.getNamedItem("path").text;
topMenuItems[topMenuLength][5] = topXml[i].attributes.getNamedItem("imageUrl").text;
topMenuItems[topMenuLength][6] = topXml[i].attributes.getNamedItem("defaultPage").text;
topMenuLength++;
}
//加载顶层菜单结束

//加载一层菜单开始
var menuXml = tmpxml.selectNodes("/Menus/Level1Menus/Menu");
for(i=0;i<menuXml.length;i++)
{
menuItems[menuLength] = new Array();
menuItems[menuLength][0] = SystemBh + "_" + menuXml[i].attributes.getNamedItem("parentid").text;
menuItems[menuLength][1] = SystemBh + "_" + menuXml[i].attributes.getNamedItem("id").text;
menuItems[menuLength][2] = menuXml[i].attributes.getNamedItem("name").text;
menuItems[menuLength][3] = menuXml[i].attributes.getNamedItem("title").text;
menuItems[menuLength][4] = menuXml[i].attributes.getNamedItem("path").text;
menuItems[menuLength][5] = menuXml[i].attributes.getNamedItem("imageUrl").text;
menuLength++;
}

//加载一层菜单结束

//加载二层菜单开始
var linkXml = tmpxml.selectNodes("/Menus/Level2Menus/Menu");
for(i=0;i<linkXml.length;i++)
{
linkItems[linkLength] = new Array();
linkItems[linkLength][0] = SystemBh + "_" + linkXml[i].attributes.getNamedItem("parentid").text;
linkItems[linkLength][1] = SystemBh + "_" + linkXml[i].attributes.getNamedItem("id").text;
linkItems[linkLength][2] = linkXml[i].attributes.getNamedItem("name").text;
linkItems[linkLength][3] = linkXml[i].attributes.getNamedItem("title").text;
linkItems[linkLength][4] = linkXml[i].attributes.getNamedItem("path").text;
linkItems[linkLength][5] = linkXml[i].attributes.getNamedItem("imageUrl").text;
linkLength++;
}

//加载二层菜单结束
}
catch(eii)
{alert("加载编号为"+SystemBh+"的应用系统失败,可能是网络延迟问题!");}

}

在93行中有

alert(“加载编号为”+SystemBh+”的应用系统失败,可能是网络延迟问题!”);

正是用手机登录时的提示,推测原因是ActiveXObject对象和XMLHttpRequest对象的差异导致无法直接使用ActiveXObject加载左上菜单的方法 来用XMLHttpRequest加载左上的菜单,因此手机和非IE内核都无法加载左上的菜单
手机和非IE内核浏览器无法加载

最后

如果你知道怎么解决这个问题,希望能告诉我,将不胜感激
我的邮箱是2573378531@qq.com