本帖最后由 foolant 于 2011-6-11 04:38 编辑
测试网站时,发现用 chrome 登录 X2 时不会跳转 (登录discuz.net时就不会跳转,刷新一次页面后发现已经登录成功,而我本地的测试站根本就不能登录,JS 报 ajaxpost 里面元素未找到错误
Uncaught TypeError: Cannot call method 'indexOf' of undefined
chrome/EventBindings:183Error in event handler for 'undefined': TypeError: Cannot set property 'display' of null
错误发生在 common.js 660 行(ajaxpost函数内)
google以后搜索到这篇 " 在Chrome下面Ajax有问题,不能正确获取数据。"
https://discuz.dismall.com/thread-2099043-1-1.html
官方的回复是没有发现问题, 但是经过对 netroby 在此帖的回复中提供的方案进行测试后发现可以解决问题, 查看google提供的其他帖子,发现在discuz.net 上报告的也是有人遇到有人没有遇到问题. 因为我新装的是 chrome 12 稳定版,感觉不可能是因为chrome版本的问题, 后来想到既然存在差异,有没有可能是因为安装的chrome扩展/插件导致的不兼容?
随后的测试验证了此猜测, 先打开chrome隐私模式(此时默认是不会加载扩展/插件的)发现可以正常登陆,X2 ajax 无问题, 插件冲突的想法得到确认,逐一排除使用中的扩展插件, 发现是和 Better Pop Up Blocker 这个弹出窗口拦截插件有冲突 ( Better Pop Up Blocker, 秒杀国内流氓网站弹出带极度令人厌恶的有声音 flash 网页游戏弹出广告的有效插件,拦截得非常干净),其他人在遇到相同问题时安装的插件是否包含这个不太清楚,但应该也是类似的插件.
Better Pop Up Blocker 并没有拦截所有X2 用ajax弹出的窗口层,而是只拦截一部分,其中就包括了登录时的代码,导致此冲突比较难以发现.附上一个改良的解决方案(并非最好,但是可以解决问题), 只需一句代码即可搞定.
修改 static/js/common.js , 从大约 646 行代码开始(位于 ajaxpost 函数体内)
try {
s = $(ajaxframeid).contentWindow.document.XMLDocument.text;
} catch(e) {
try {
s = $(ajaxframeid).contentWindow.document.documentElement.firstChild.wholeText;
if(!s) s = $(ajaxframeid).contentWindow.document.firstChild.textContent;
} catch(e) {
try {
s = $(ajaxframeid).contentWindow.document.documentElement.firstChild.nodeValue;
} catch(e) {
s = '内部错误,无法显示此内容';
}
}
}
绿色那行为添加的代码,(我这里显示是在650行后面,请以代码为参考进行修改而不是行号)
添加后即可解决此问题, Better Pop Up Blocker正常工作,X2 正常使用.
|