疑难杂症:Webbrowser访问某些网页脚本执行不成功的问题
典型的测试网站:http://mp3.sogou.com/,测试IE内核版本,IE10
用IE打开,点击一首歌曲,会先跳出一个空白页,接着,这个空白页导航到歌曲播放。如果此时从主页点击另外一首歌曲,会关闭之前打开的播放页面,重新打开空白页,导航到播放歌曲……
如果用webbrowser来做这件事情,不拦截任何新窗口的话,现象是这样的:点击一首歌曲,会先跳出一个空白页,这个空白页保持不变,接着又跳出一个新页面,在这个页面中播放歌曲。如果此时从主页点击另外一首歌曲,会关闭之前的空白页,但之前播放歌曲的页面没有关闭,再打开一个播放歌曲的新页面。说起来比较混乱,测试一下即可明白。
测试了几个浏览器(双核浏览器的话切换到IE内核测试),都是这个现象。如果说所有浏览器(IE内核)都是这样,那么似乎可以放弃了。但测试到GB浏览器的时候,和IE表现一样完美!于是又燃起一丝希望,所以来此求助。
看了一下脚本:
点击一个链接的时候,调用:
// 播放单首歌曲的方法:由于参数较短,可以采用类jsonp的方式访问跨域的qqcgi.jsp
function openQQPlayer(songList)
{
openEmptyWindow("_webQQMusicPlayer");
songList = songList.replace(/\"/g, "");
songList = songList.replace(/#/g,"\"");
var ajaj =document.createElement("script");
ajaj.src="http://mp3.sogou.com/qqcgi.jsp?d="+window.location.host+"&songlist=" + encodeURIComponent(songList);
ajaj.charset="gb18030";
document.body.appendChild(ajaj);
}
这个函数调用了:
function openEmptyWindow(sWindowName)
{
var ua = navigator.userAgent.toLowerCase();
if (typeof sWindowName !== "string") {
sWindowName = "_webQQMusicPlayer";
}
try{
if(!ua.ie)
{
if(top.window.win)
{
top.window.win.close();
top.window.win = null;
}
}
}
catch(e)
{
}
try{
if(!top.window.win || top.window.win.closed == true)
{
top.window.win = window.open("about:blank", sWindowName);
if (!top.window.win && !(ua.tt>=5))
{
showMsgbox("弹出窗口被拦截,请取消拦截!", 1, 2000);
}
}
}
catch(e)
{
}
}
上述openQQPlayer里面好像openEmptyWindow是成功的,但后续就不一样了。
经过反复测试,已知结论如下:
1、与IE渲染模式无关。即FEATURE_BROWSER_EMULATION项无关。
2、FEATURE_SCRIPTURL_MITIGATION这项设置是必须的。在IE8下,应该设置这项注册表即可正常。但在IE10下,设置了也不正常。
3、早期开源的GB代码用VC6编译后都是正常的,可以正常访问。但从GB源码中也找不到关键点。