[2008-04-24 04:35:53] vBulletin with JSONP(Javascript跨域问题及基于vbb单点登录浅谈)
出于浏览器安全考虑,javascript是不能跨域访问的,即是说js使用XMLHTTPRequest的访问对象只限于同一域名,统一端口,统一协议下的数据。如果未加任何处理,js会报错nsresult: "0x8057001e (NS_ERROR_XPC_JS_THREW_STRING)"。
但事实上大型系统往往需要跨越多台服务器传递数据,那么如何解决这一问题,时下有如下的若干解决方法:
- 隐蔽iFrame
实现成本:低
被访问端控制权限:不需要
实现方法:在页面上创建一个不可见的iframe,将所要访问的页面包含进来,然后通过操作iframe来获得所需数据。实际上这种解决方法已经和钓鱼网站没什么区别了,只不过是非恶意的而已。除非是做数据采集,否则不推荐。 - document.domain
实现成本:中
被访问端控制权限:不需要
实现方法:假如要访问ave7.net的数据,在代码开始时加入一行
document.domain = 'ave7.net';
即可。这大概是js本身提供的解决方案,但实用性并不高,尤其是多浏览器对document.domain的支持参差不齐,至今也没有一个像样的案例出现,不推荐。 - 包含远程文件
实现成本:中
被访问端控制权限:需要
实现方法:假如要访问ave7.net的数据,编写相应xxx.js文 件上传至ave7.net,在本地使用<script type="text/javascript" src="http://ave7.net/xxx.js"></script>将访问对象包含进来即可。这样等于完全绕开了ajax 访问,是一个较为实用的解决方案。缺点也很明显,需要两端都有控制权限,代码被迫分离给维护带来了不便,另外无法像Ajax一样判断程序执行到那个阶段, 如果远程服务器暂时无法访问,则可能产生致命性错误。 - JSONP
实现成本:高
被访问端控制权限:需要
JSONP是JSON的一个子集,目前还是非官方的协议。形如
callback({jsondata});
即是把json数据用一对圆括号括住,前面加上回调函数实现,目前像jquery,dojo等js库都提供了jsonp的支持。
JSONP虽然是简单的通讯协议,但已经实现了很好的接口定义,虽然被访问段需要重新编写接口,但如果是比较复杂的程序应用,就显得十分有必要了。
以我的Blog动态调用vBulletin论坛信息实现简单单点登录为例。通信过程如下,括号内为传递的值:
Blog发起AJAX请求(session)->vBulletin接受请求(用户信息)->JSONP将用户信息与传入的session通过加密算法生成一个hash值(用户信息,hash)->Blog将接受到的用户信息以及session通过同样的加密算法计算hash值,如果和传入的hash值相同,则作为用户登录。
Read More
[2008-04-22 09:02:03] JQuery TagClouds Plugin
JQuery TagClouds Plugin Ver0.1
功能:将一个元素内的所有链接转换为Tag Clouds(标签云)形式,字体大小和颜色同时渐变。
Demo:见首页
Sample:
$(".tag_clouds").tagClouds();
更复杂一点的例子:
var option = {
fontmax:22, //可选 默认值为22, TagCloud的最大fontsize(单位px)
fontmax:11, //可选 默认值为11, TagCloud的最小fontsize(单位px)
colorfrom:"#CACAFF", //可选 默认值为"#CACAFF", TagCloud的渐变颜色1(要突出显示的颜色)
colorto:"#F8B3D0", //可选 默认值为"#F8B3D0", TagCloud的渐变颜色2
patrn:/\(\d+\)$/ //可选 将Tag权值从链接中分离的正则表达式,默认形式为 标签(10)
}
$(".tag_clouds").tagClouds(option);
Plugin Source
/*
* jQuery TagClouds Plugin
* version: 0.1
* @requires jQuery v1.2.2 or later
*
* Copyright (c) 2008 AlloVince
* Examples at: http://allo.ave7.net/JQuery_TagClouds_Plugin
* Licensed under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*
*/
if(jQuery) (function($){
$.fn.tagClouds = function(option) {
var fontmax = 21;
var fontmin = 11;
var colorfrom = "#CACAFF";
var colorto = "#F8B3D0";
var patrn=/\(\d+\)$/;
if(option) {
fontmax = option.fontmax ? option.fontmax : fontmax;
fontmin = option.fontmin ? option.fontmin : fontmin;
colorfrom = option.colorfrom ? option.colorfrom : colorfrom;
colorto = option.colorto ? option.colorto : colorto;
patrn = option.patrn ? option.patrn : colorto;
}
var tags = Array();
var fontsize = Array(),fontcolor = Array();
var i = 0;
$(' > a',this).each(function(){
var tag_count = patrn.exec($(this).text());
var num=/\d+/;
tags[i] = num.exec(tag_count);
i++;
});
//数组复制
var tmp = tags.slice(0);
tmp.sort(function(a, b) {return b - a;});
var max = tmp[0];
var min = tmp[tmp.length-1];
for(i = 0; i < tags.length ; i++) {
if(tags[i] == max) {
fontsize[i] = fontmax;
}
else if(tags[i] == min) {
fontsize[i] = fontmin;
}
else {
fontsize[i] = parseInt( (fontmax - fontmin)*(tags[i] - min)/(max - min) + fontmin);
}
fontcolor[i] = color(colorfrom,colorto,max - min + 1,tags[i] - min + 1);
}
i = 0;
$(' > a',this).each(function(){
$(this).css("font-size",fontsize[i] + "px");
$(this).css("color",fontcolor[i]);
$(this).mouseover(function(){
$(this).animate({
fontSize: fontmax + "px"
}, 500);
});
i++;
});
// 颜色#FF00FF格式转为Array(255,0,255)
function color2rgb(color){
var r = parseInt(color.substr(1, 2), 16);
var g = parseInt(color.substr(3, 2), 16);
var b = parseInt(color.substr(5, 2), 16);
return new Array(r, g, b);
}
// 颜色Array(255,0,255)格式转为#FF00FF
function rgb2color(rgb) {
var s = "#";
for (var i = 0; i < 3; i++) {
var c = Math.round(rgb[i]).toString(16);
if (c.length == 1)
c = '0' + c;
s += c;
}
return s.toUpperCase();
}
function color(from,to,all,step){
var Gradient = new Array(3);
var A = color2rgb(from);
var B = color2rgb(to);
for (var i = 0; i < 3; i++) {
Gradient[i] = A[i] + (B[i]-A[i]) / all * step;
}
return rgb2color(Gradient);
}
}
})(jQuery);
---code end---
Read More[2008-04-21 08:34:56] JQuery SyntaxHighlighter plugin
$.SyntaxHighlighter('./SyntaxHighlighter/');
to instead of this :
<script language="javascript" src="SyntaxHighlighter/Scripts/shCore.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushCSharp.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushXml.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushCpp.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushCss.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushDelphi.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushJava.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushJScript.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushPhp.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushPython.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushRuby.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushSql.js"></script> <script language="javascript" src="SyntaxHighlighter/Scripts/shBrushVb.js"></script>
dp.SyntaxHighlighter.ClipboardSwf = 'SyntaxHighlighter/Scripts/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
====Demo====
Here is the [lab:/highlighter/demo.html|Demo link], compare to the [lab:/highlighter/without_plugin.html|page without plugin].
====Useage====
$.SyntaxHighlighter('./SyntaxHighlighter/'); //the path of SyntaxHighlighter files
<pre class="js"> ... some code here ... </pre>Advance Options,and the [lab:/highlighter/advance_demo.html|Advance Demo].
var option = {
dir:'./SyntaxHighlighter/', //required. path of SyntaxHighlighter
/**
* Set SyntaxHighlighter default options on this page
* You can get more info at :
* http://code.google.com/p/syntaxhighlighter/wiki/HighlightAll
*/
name:"SyntaxHighlighter", //optional, default:"SyntaxHighlighter"
showGutter:true, //optional, default:true
showControls: false, //optional, default:false
collapseAll:false, //optional, default:false
firstLine : 1, //optional, default:false
showColumns:false, //optional, default:false
/**
* Options of this Plugin
*/
apptoall:false, //optional, default:true. enable default options to all elements instead of elements self option.
autofind:false, //optional, default:true.
//auto enable highlighter to <pre> and <textarea> elements with 'class' attribute on this page whether with 'name'.
jspath:'./SyntaxHighlighter/Scripts/', //optional, default:dir + 'Scripts/'. path of SyntaxHighlighter Js files
csspath:'./SyntaxHighlighter/Styles/', //optional, default:dir + 'Styles/'. path of SyntaxHighlighter Css files
swfpath:'./SyntaxHighlighter/Scripts/' //optional, default:dir + 'Scripts/' path of SyntaxHighlighter clipboard.swf file
};
$.SyntaxHighlighter(option);
====Downloads====
[http://cid-01e48df64f8bd957.skydrive.live.com/embedrowdetail.aspx/Source/highlighter.7z|Download Link]
Or get this plugin in [http://plugins.jquery.com/project/Jlighter|JQuery Plugin Site]
Read More
[2008-04-17 06:30:41] あしたの年男
[2008-04-14 08:33:56] Hello Blog
[2008-04-08 17:44:15] OOXX baidu v0.1 release(百度空间转Wordpress搬家程序)
$start_page = 1; //起始页 $end_page = 17; //结束页,即blog的总页数 在blog点击 更多文章>>,再点击尾页,在这里填写尾页的页码 $baiduId = 'tsost'; //你的baidu空间名 例:我的空间url是http://hi.baidu.com/tsost,这里值就为tsost====注意==== 尽管使用了自动刷新防止超时,但视网络情况仍然有可能发生超时,此时手动刷新即可。 程序运行会产生大量临时文件,建议单独放置一个文件夹 程序运行完毕会显示Baidu has been OOXX,运行结果为同目录下的export.xml 随便写的,没有严格按wp标准生成,在wp2.5下导入成功。当然也可以委托我负责转换,只需花费七街论坛1000RP,详见[http://forum.ave7.net/showthread.php?t=18628|这里] [http://cid-01e48df64f8bd957.skydrive.live.com/embedrowdetail.aspx/Source/ooxxbaidu.7z|猛击我]下载 Read More
