starrin
小狐狸
小狐狸
  • UID39387
  • 注册日期2013-04-16
  • 最后登录2015-08-30
  • 发帖数21
  • 经验24枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
阅读:1733回复:2

【求助】有办法在UC脚本中取消掉3XX跳转并且加上新的数据么?

楼主#
更多 发布于:2013-10-10 13:16
我的需求其实也不复杂,网站A上的部分页面会用302跳转跳转到网站B上,但是我希望能够在保证标签页网址是网站A的原始网址的情况下,让页面的内容显示为网站C上的特定页面的内容
如果不涉及302跳转就一点难度都没有,UC脚本中使用nsITraceableChannel接口就可以很轻松地对网页的数据进行修改
只需要监测http-on-examine-response事件,然后在Listener中的onDataAvailable里面就可以替换进新的数据,这样就能在不改变页面网址的情况下替换页面数据了。
但是涉及到3XX跳转的时候这个方法就没法用了
如果不对响应头进行处理的话,页面会直接跳到新页面上去
如果在http-on-examine-response里面删除掉Location字段的话,会得到一个空白页面,onDataAvailable根本不会执行
在MDN上翻了半天看到关于nsIChannelEventSink接口的介绍,里面提到了asyncOnChannelRedirect这个函数,说跳转发生时会调用这个函数,并且说“如果发生异常的话,旧channel是不会自动停止的,而是会像接到了200响应一样继续载入,可能会在屏幕上显示内容,如果需要停止的话请用cancel()手动停止”,我就很兴奋地写了一大堆,在asyncOnChannelRedirect中抛出了一个异常,结果得到了一个空白页面,并且这个页面的地址还是跳转后的……差点喷血
今天折腾了一天,最好的结果也不过就是在标签页网址为网站B的情况下显示出了网站C的页面……
病急乱求医的时候我连mason的代码我都扒出来看过了,那个切换channel的方式确实很好,但是会把标签页的地址一起切过去,这样就没什么意义了……
有没有人有方法实现这个功能的,求助

EDIT:用了个笨办法勉强实现了这个功能。在gBrowser里面监听load事件,然后加入网址判断并且看网页内容是否为空,为空的话就就用asyncFetch获取需要的网页内容,然后再创建script节点用document.body.appendChild注入,在注入的代码中执行document.write。
但是这样还是有问题,httpfox会监测到大量的NS_ERROR_DOCUMENT_NOT_CACHED错误(都是在请求原网址时出现的,应该是因为用了笨办法导致页面没有缓存的原因),而且页面上的部分js脚本也运行不正常。
starrin
小狐狸
小狐狸
  • UID39387
  • 注册日期2013-04-16
  • 最后登录2015-08-30
  • 发帖数21
  • 经验24枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
1楼#
发布于:2013-10-10 13:16
笨办法我也试过
有一次试图在删除Location之后用这个函数
getWindowForRequest: function(request){
	if(request instanceof Ci.nsIRequest){
		try{
			if(request.notificationCallbacks){
				return request.notificationCallbacks.getInterface(Ci.nsILoadContext).associatedWindow;
			}
		} catch(e) {}
		try{
			if(request.loadGroup && request.loadGroup.notificationCallbacks){
				return request.loadGroup.notificationCallbacks.getInterface(Ci.nsILoadContext).associatedWindow;
			}
		} catch(e) {}
	}
	return null;
}

来获取到页面的window对象,然后用document.write直接写入内容
页面的window对象倒是能获取到,但是接下来的document.write就完全没效果……(趴
hzzhaiqi
火狐狸
火狐狸
  • UID30112
  • 注册日期2009-08-18
  • 最后登录2015-09-15
  • 发帖数279
  • 经验180枚
  • 威望1点
  • 贡献值44点
  • 好评度28点
2楼#
发布于:2013-10-10 13:16
没研究,除非经常碰到 3XX 才需要。
游客

返回顶部