阅读:1733回复:2
【求助】有办法在UC脚本中取消掉3XX跳转并且加上新的数据么?
我的需求其实也不复杂,网站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脚本也运行不正常。 |
|
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就完全没效果……(趴 |
|
2楼#
发布于:2013-10-10 13:16
没研究,除非经常碰到 3XX 才需要。
|
|