可是那些破站点让人太郁闷了...不是弹出广告,就是满屏幕飘浮动广告....气死我了...
所以做了一个超简陋的浏览器,把页面中的 JS 基本上全禁掉了(禁用JS的正则不是很好,此外CSS里的没禁掉,不过目前反正够俺用就好了),顺便把 iframe 也全部干掉
还可以自动记得上次浏览的页面,打开就直接进入,看书的时候就不怕打断了
因为超简陋,所以连 表单也不支持,只支持链接,哈哈,看书倒是够用了....
代码中的 伪session 处理 和 俺自己封装的 xmlhttp 值得一看
不能直接运行,保存到本地,另存为 HTA 使用,哈哈
<head>
<title>Book Viewer</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<style>
body { margin:0px; padding:0px; overflow:auto; border-style:none; font-size:12px; background-color:buttonface; }
iframe { width:100%; border-style:none; position:absolute; top:25px; }
#i1 { height:22px; line-height:18px; width:100%; border:1px solid #666; margin:0px 2px; padding:0px 10px; }
</style>
<script>
strSessionName="bookviewer_lastURL";
lastURL="";
xp=new xmlhttp();
function checkMe(){
if(i1.value!=lastURL){
lastURL=i1.value;
session_set(strSessionName,lastURL);
}
try{
for(var i=0;i<f1.document.links.length;i++)f1.document.links[i].onclick=n0;
}catch(e){}
if(/book/.5seecn/i.test(lastURL))f1.document.body.onkeydown=chkKey;
}
function chkKey(){
var allLinks;
if(f1.event.keyCode==39){
allLinks=f1.document.links;
for(var i=0;i<allLinks.length;i++)if(/下一页/.test(allLinks[i].innerHTML)){
i1.value=allLinks[i].href; n2(); return;
}
}else if(f1.event.keyCode==37){
allLinks=f1.document.links;
for(var i=0;i<allLinks.length;i++)if(/上一页/.test(allLinks[i].innerHTML)){
i1.value=allLinks[i].href; n2(); return;
}
}
}
function init(){
i1.onkeydown=function(){ if(event.keyCode==13)n2(); }
resizeWin();
i1.focus();
i1.select();
if(session_exists(strSessionName)){ i1.value=session_get(strSessionName); n2(); }
setInterval(checkMe,200);
}
function resizeWin(){
document.getElementById("f1").style.height=document.body.clientHeight-25;
}
function n0(){
n1(this.href);
return(false);
}
function n1(str){
i1.value=str;
n2();
}
function n2(){
str=i1.value;
if(i1=="")return;
if(!/^http://///i.test(str))str="http://"+str;
document.title="Book Viewer - Loading...";
xp.open("get",str);
xp.onreadystatechange=n22;
xp.send("");
}
function n22(){
var str;
if(this.readyState==4){
if(this.status==200){
str=adodb_binary2string(this.getAttribute("responseBody"));
str=str.replace(/<script[/s/S]+?//script>/gi,"").replace(/<iframe[/s/S]+?//iframe>/gi,"").replace(/on(load|mouseover|mouseout|mousemove|focus|blur|keydown|keyup|keypress|change|readystatechange|click|dblclick|mousewheel) *= */"[/s/S]+?/"/gi,"");
f1.document.open();
f1.document.write("<base href=/""+i1.value.substring(0,i1.value.lastIndexOf("/")+1)+"/" //>");
try{
f1.document.write(str);
}catch(e){}
f1.document.close();
f1.document.body.focus();
document.title="Book Viewer - Ready";
}
}
}
function cancelErr(){ return(true); }
html_encode=function(strV){
return(strV.replace(/&/g,"&").replace(/"/g,""").replace(/ /g," ").replace(//t/g," ").replace(/</g,"<").replace(/>/g,">").replace(//r/n/g,"<br>"));
}
function adodb_binary2string(b){
var adodbStream=new ActiveXObject("ADODB.Stream");
adodbStream.Type=1;//1=adTypeBinary
adodbStream.Open();
adodbStream.write(b);
adodbStream.position=0;
adodbStream.Type=2;
adodbStream.charset="_autodetect_all";
var re=adodbStream.readText();
adodbStream=null;
return(re);
}
function session_delete(strName){
var str, reg, expt, dt;
if(!session_exists(strName))return;
strName=escape(strName);
strValue="";
dt=new Date();
dt.setYear(1980);
expt=";expires="+dt.toGMTString()+";";
str=strName+"="+strValue+expt;
document.cookie=str;
}
function session_get(strName){
var str, reg;
str=document.cookie;
strName=escape(strName);
reg=new RegExp(strName+"=([^;]+)");
if(!reg.test(str))return;
return(unescape(str.match(reg)[1]));
}
function session_set(strName,strValue,blnExpireAfterClose){
var str, reg, expt, dt;
strName=escape(strName);
strValue=escape(strValue);
dt=new Date();
dt.setYear(2099);
expt=blnExpireAfterClose?"":";expires="+dt.toGMTString()+";";
str=strName+"="+strValue+expt;
document.cookie=str;
}
function session_exists(strName){
var str, reg;
str=document.cookie;
strName=escape(strName);
reg=new RegExp(strName+"=(.+);?");
if(!reg.test(str)){return(false);}else{return(true);}
}
function xmlhttp(){
// declare all the private variable
var aryArgu, aryOnPropertyChange_AttachedEvents, aryRequestHeaders, blnAsyn, objRequest, objSelf, objThat, strMethod, strProtocol, strToBeSend, strUID, strUrl;
// declare all the private functions
var defaultEvent_onreadystatechange, getXMLRequester, init, realEvent_onreadystatechange, uid;
// declare public variable
this.blnSendDefaultHeader=false;
this.readyState=0;
this.responseText="";
this.responseXML="";
this.status=-1;
// public event
this.onreadystatechange=defaultEvent_onreadystatechange;
// public method
this.attachEvent=function(eventHandle,functionHandle){
var eventHandle=String(eventHandle).toLowerCase();
switch(eventHandle){
case "onreadystatechange":
if(this.onreadystatechange!=defaultEvent_onreadystatechange){
this.onreadystatechange=defaultEvent_onreadystatechange;
aryOnPropertyChange_AttachedEvents=new Array();
}
aryOnPropertyChange_AttachedEvents.push(functionHandle);
return(true);
break;
default:
return("Not reallized yet.");
break;
}
}
this.deleteRequestHeader=function(strName){
delete aryRequestHeaders[strName];
}
this.detachEvent=function(eventHandle,functionHandle){
var eventHandle=String(eventHandle).toLowerCase();
switch(eventHandle){
case "onreadystatechange":
if(this.onreadystatechange!=defaultEvent_onreadystatechange){
this.onreadystatechange=defaultEvent_onreadystatechange;
aryOnPropertyChange_AttachedEvents=new Array();
return(true);
}
for(var i=0;i<aryOnPropertyChange_AttachedEvents.length;i++){
if(aryOnPropertyChange_AttachedEvents[i]==functionHandle){
aryOnPropertyChange_AttachedEvents.splice(i,1);
break;
}
}
return(true);
break;
default:
return("Not reallized yet.");
break;
}
}
this.flush=function(){
try{ this.readyState=objRequest.readyState; }catch(e){}
try{ this.responseText=objRequest.responseText; }catch(e){}
try{ this.responseXML=objRequest.responseXML; }catch(e){}
try{ this.status=objRequest.status; }catch(e){}
}
this.getAllResponseHeaders=function(){
return(objRequest.getAllResponseHeaders());
}
this.getAttribute=function(strName,strRef){
switch(strName){
case "allHeaders":
return(objRequest.getAllResponseHeaders());
case "asyn":
return(blnAsyn);
case "header":
return(objRequest.getResponseHeader(strRef));
case "method":
return(strMethod);
case "protocol":
return(strProtocol);
case "readyState":
return(objRequest.readyState);
case "responseBody":
return(objRequest.responseBody);
case "responseText":
return(objRequest.responseText);
case "responseXML":
return(objRequest.responseXML);
case "send": case "sendString": case "strSend":
return(strToBeSend);
case "status":
return(objRequest.status);
case "uid":
return(strUID);
case "url":
return(strUrl);
default:
return(false);
}
}
this.getResponseHeader=function(strHeaderName){
return(objRequest.getResponseHeader(strHeaderName));
}
this.init=init;
this.open=function(method,url,asyn){
var theURL;
strMethod=String(method).toLowerCase()=="POST"?"POST":"GET";
strUrl=String(url);
blnAsyn=String(asyn).toLowerCase()=="false"?false:true;
strProtocol=strUrl.match(/http://///i)?"http":"other";
theURL=strUrl
//if(strProtocol=="http")theURL=strUrl+(strUrl.indexOf(".")==-1?"//":"")+(strUrl.indexOf("?")==-1?"?":"&")+uid()+"=true";
objRequest.open(strMethod,theURL,blnAsyn);
}
this.reset=init;
this.send=function(strSend){
strToBeSend=String(strSend);
for(var i in aryRequestHeaders){
objRequest.setRequestHeader(i,aryRequestHeaders[i]);
}
if(this.blnSendDefaultHeader){
objRequest.setRequestHeader("Content-Length",strToBeSend.length);
}
objRequest.onreadystatechange=realEvent_onreadystatechange;
objRequest.send(strToBeSend);
}
this.setRequestHeader=function(strName,strValue){
aryRequestHeaders[strName]=strValue;
}
// private functions
function defaultEvent_onreadystatechange(){}
function getXMLRequester(){
var xmlhttp_request = false;
try{
if( window.ActiveXObject ){
for( var i = 5; i > -1; i-- ){
try{
if( i == 2 ){
xmlhttp_request = new ActiveXObject( "Microsoft.XMLHTTP" );
}else{
xmlhttp_request = new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" );
}
break;
}catch(e){
xmlhttp_request = false;
}
}
}else if( window.XMLHttpRequest ){
xmlhttp_request = new XMLHttpRequest();
}
}catch(e){
xmlhttp_request = false;
}
return xmlhttp_request;
}
function init(){
// init private variable
aryArgu=new Array();
aryOnPropertyChange_AttachedEvents=new Array();
aryRequestHeaders=new Array();
blnAsyn=true;
objRequest=getXMLRequester();
objSelf=this;
objThat=this;
strMethod="GET";
strProtocol="unknown";
strResponseText="";
strToBeSend="";
strUID=strUID?strUID:uid();
strUrl="";
// init public variable
this.blnSendDefaultHeader=false;
// regist this object to window
window[strUID]=this;
}
function realEvent_onreadystatechange(){
objThat.flush();
if(objThat.onreadystatechange==defaultEvent_onreadystatechange){
for(var i=0;i<aryOnPropertyChange_AttachedEvents.length;i++){
try{
if(typeof(aryOnPropertyChange_AttachedEvents[i])=="function"){
aryOnPropertyChange_AttachedEvents[i].call(objThat);
}else if(typeof(aryOnPropertyChange_AttachedEvents[i])=="string"){
eval(aryOnPropertyChange_AttachedEvents[i]);
}
}catch(e){alert("004"+e.description)}
}
}else{
try{
if(typeof(objThat.onreadystatechange)=="function"){
objThat.onreadystatechange();
}else if(typeof(objThat.onreadystatechange)=="string"){
eval(objThat.onreadystatechange);
}
}catch(e){alert("005"+e.description)}
}
}
function uid(){
return("u"+(new Date()).getTime().toString(35)+parseInt(Math.random()*999999).toString(35));
}
// do init
this.init();
}
window.onload=init;
window.onresize=resizeWin;
window.onerror=cancelErr;
</script>
</head>
<body>
<input id="i1"><br>
<iframe id="f1"></iframe>
</body>