XMLHTTP对象封装技术

Ajax技术的实现主要依赖于xmlhttprequest,但我们在调用其来进行异步数据的传输时,由于xmlhttp是个短线过程(处理事件完成后就销毁)如果不对该对象进行包装处理的话,就不得不在需要调用的地方重新构建xmlhttprequest,每次调用都要写一大段的代码,实在不是个好办法。好在现在很多开源的ajax框架都提供了对xmlhttp封装的方案。这里以ajaxtags自带的prototype-1.4.0.js为母版,来看看如何将xmlhttp对象封装成一个可复用的方法。

在prototype.js中,首先定义了一个变量:
var Ajax = {
getTransport: function() {
return Try.these(
function() {return new ActiveXObject(‘Msxml2.’)},
function() {return new ActiveXObject(‘Microsoft.XMLHTTP’)},
function() {return new XMLHttpRequest()}
) || false;
},

activeRequestCount: 0
}

变量返回了一个xmlhttprequest,可以看到,如果我们调用了Ajax.getTransport(),每次都会返回一个新的xmlhttprequest对象。
(更多…)

标签Tags:, , , , , , , , , , , , , , , , , , , , , , ,

ajax的缺点

下面是我对一部分缺陷的看法:

为Ajax而Ajax(Using for the sake of .)

很同意这点,当一个技术本身的生存意义由于它自身的亮点而被抹杀,不知道是这个技术的幸运还是不幸。

干掉了back按钮(Breaking the back button)

back按钮是一个标准的web站点UI的重要功能。然后,后退按钮没法和js很好的合作……
gmail似乎作的很好?不过没去仔细看过gmail如何实现后退和js相容的,被这个mistake一提醒,也许这也是ue的一个切口哦。

点击的时候没有提供一个可视化的提示(Not giving immediate visual cues for clicking widgets)

……也许是我没看懂,觉得写这段的人自相矛盾。。他说没提供可视化提示,不过是拿gmail右上角的红色提示作为例子。 (更多…)

标签Tags:, , , , , , , , , , , , , , , , , , , , , , , , , , ,

基于JSON的高级AJAX开发技术

一、 引言

  毫无疑问,AJAX已经成为当今Web开发中一种强有力的用户交互技术,但是它的许多可能性应用仍然鲜为人知。在本文中,我们将来共同探讨如何使用JavaScript对象标志(JSON)和JSON分析器在服务器和客户端AJAX引擎之间创建复杂而强有力的JSON数据传输层。我们将详细讨论如何创建一组对象(在其它语言中经常被当作一个包),如何把这些对象串行化为JSON以发送到服务器端,以及如何把服务器端JSON反串行化为客户端JavaScript对象。

  提示:你可以在Douglas Crockford的网站上找到本文中使用的JSON分析器。

  在继续阅读前,本文假定你已经掌握了JavaScript技术并且了解如何创建一个基本的AJAX引擎,并经由AJAX技术向服务器端发出请求和从服务器端接收响应。为了更好地理解本文中示例,你需要下载本文相应的源码文件。 (更多…)

标签Tags:, , , , , , , , , , , , , , , , , , , , , , , , , , ,

PHP安全之数据过滤

在指南的开始,我们说过数据过滤在任何语言、任何平台上都是WEB应用安全的基石。这包含检验输入到应用的数据以及从应用输出的数据,而一个好的软件设计可以帮助开发人员做到:

确保数据过滤无法被绕过,确保不合法的信息不会影响合法的信息,并且识别数据的来源。

关于如何确保数据过滤无法被绕过有各种各样的观点,而其中的两种观点比其他更加通用并可提供更高级别的保障。
(更多…)

标签Tags:, , , , , , , , , , , , , , , , , , , , , , ,

CSS 中的太极拳口诀

在做网站过程中,常常要修改网站模板,而模板受css控制。如果在用CSS设计布局时遇到BUG,请认真阅读以下内容,非常容易记忆的,不知道哪位高人把CSS BUG编成了*****了!看看好不好记住呢?
一、IE边框若显若无,须注意,定是高度设置已忘记;
二、浮动产生有缘故,若要父层包含住,紧跟浮动要清除,容器自然显其中;
三、三像素文本慢移不必慌,高度设置帮你忙;
四、兼容各个浏览须注意,默认设置行高可能是*****;
五、独立清除浮动须铭记,行高设无,高设零,设计效果兼浏览;
六、学布局须思路,路随布局原理自然直,轻松驾驭html,流水布局少hack,代码清爽,兼容好,友好引擎喜欢迎。
七、所有标签皆有源,只是默认各不同,span是无极,无极生两仪—内联和块级,img较特殊,但也遵法理,其他只是改造各不同,一个*号全归原,层叠样式理须多练习,万物皆规律。
八、图片链接排版须小心,图片链接文字链接若对齐,padding和vertical-align:middle要设定,虽差微细倒无妨。
九、IE浮动双边距,请用display:inline拘。
十、列表横向排版,列表代码须紧靠,空隙自消须铭记。

标签Tags:, , , , , , , , , , , , ,

各种浏览器的userAgent


而IE各个版本典型的userAgent如下:
/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
其中,版本号是MSIE之后的数字。

Firefox几个版本的userAgent大致如下:
Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12  其中,版本号是Firefox之后的数字。
Opera
Opera典型的userAgent如下:
Opera/9.27 (Windows NT 5.2; U; zh-cn)
Opera/8.0 (Macintosh; PPC Mac OS X; U; en)
Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0
其中,版本号是靠近Opera的数字。
Safari
Safari典型的userAgent如下:
Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13
Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3
其版本号是Version之后的数字。
Chrome
Chrome的userAgent是:
Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13
其中,版本号在Chrome之后的数字。
Navigator
目前,Navigator的userAgent是:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6
其中,版本号在Navigator之后的数字。

标签Tags:, , , , , , , ,

图片轮换类,IE7、OP、FF、Chrome测试通过

<>
<head><>新闻图片轮换类</>
<script type=”text/javascript”>
var fs = new FadeSlideClass();
fs.Width = 430;
fs.Height = 250;
fs.AddImage(“http://www.5bay.cn/Test/Image/001.jpg“, “#”, “新闻标题”);
fs.AddImage(“http://www.5bay.cn/Test/Image/002.jpg“, “#”, “新闻标题”);
fs.AddImage(“http://www.5bay.cn/Test/Image/003.jpg“, “//g.cn”, “去Google”);
fs.AddImage(“http://www.5bay.cn/Test/Image/004.jpg“, “#”, “新闻标题”);
fs.AddImage(“http://www.5bay.cn/Test/Image/005.jpg“, “#”, “新闻标题”);
fs.RenderTo(“divStage”);

/* 以下代码构造轮换类 */
function FadeSlideClass()
{
this.Width = 450;
this.Height = 300;
this.BorderColor = “#ddd”;
this.CurrentColor = “green”;
this.Delay = 5000;
var divContainer = document.createElement(“”);
var divImage = document.createElement(“div”);
var ulList = document.createElement(“ul”);
var me = this;
var arrImg = new Array;
this.Tag = divContainer;
this.AddImage = function(strImageUrl, strLink, strTitle)
{
   arrImg.push(arguments);
}
this.RenderTo = function(container)
{
   if(typeof container == “string”) container = document.getElementById(container) || container;
   if(typeof container == “string”) return setTimeout(function(){ me.RenderTo(container); }, 100);
   if(!arrImg.length) throw new Error(“尚未添加图片。”);
   var cssFloat = typeof ulList.style.cssFloat == “string” ? “cssFloat” : “styleFloat”;
   divContainer.style.width = this.Width + “px”;
   divContainer.style.height = this.Height + “px”;
   divImage.style.width = Math.round(this.Width * (arrImg.length – 1) / arrImg.length) + “px”;
   divImage.style.height = this.Height + “px”;
   divImage.style[cssFloat] = “left”;
   ulList.style.width = (this.Width – parseInt(divImage.style.width)) + “px”;
   ulList.style.height = this.Height + “px”;
   ulList.style.margin = “0px”;
   ulList.style.padding = “0px”;
   ulList.style[cssFloat] = “left”;
   divContainer.style.overflow = “hidden”;
   divImage.style.overflow = “hidden”;
   ulList.onmouseover = function(){ clearTimeout(me.Handler) };
   ulList.onmouseout = function(){ AutoPlay(); };
   InitImage(2);
   InitList(arrImg.length);
   container.appendChild(divContainer);
   divContainer.appendChild(divImage);
   divContainer.appendChild(ulList);
   LiMouseOver.call(ulList.firstChild);
   AutoPlay();
   this.AddImage = function(){ throw new Error(“该方法已过时。”); }
}
this.Display = function(imgThumb)
{
   var img = divImage.lastChild.lastChild;
   var opa = new OpacityClass(img);
   opa.Set(20);
   img.src = imgThumb.src;
   img.parentNode.href = imgThumb.parentNode.href;
   img.parentNode.title = imgThumb.parentNode.title;
   clearInterval(ulList.Handler);
   ulList.Handler = setInterval(function(){
    if(opa.Add(5) >= 100)
    {
     divImage.firstChild.lastChild.src = img.src;
     clearInterval(ulList.Handler);
    }
   }, 25);
}
function LiMouseOver()
{
   if(this == ulList.oldLi) return;
   if(ulList.oldLi) ulList.oldLi.style.borderColor = me.BorderColor;
   this.style.borderColor = me.CurrentColor;
   ulList.oldLi = this;
   me.Display(this.firstChild.firstChild);
}
function InitImage(count)
{
   if(–count) arguments.callee(count);
   var a = document.createElement(“a”);
   a.target = “_blank”;
   divImage.appendChild(a).style.position = “absolute”;
   var img = new Image;
   img.width = parseInt(divImage.style.width);
   img.height = me.Height;
   img.border = 0;
   if(!a.appendChild(img).filters) img.style.opacity = 1;
   else img.style.filter = “alpha(opacity=100)”;
}
function InitList(count)
{
   if(–count) InitList(count);
   var isIeNoDtd = document.compatMode != “1Compat” && /msie/i.test(navigator.userAgent);
   var data = arrImg[count];
   var thumbWidth = parseInt(ulList.style.width);
   var thumbHeight = Math.round(me.Height / arrImg.length);
   var li = document.createElement(“li”);
   li.style.overflow = “hidden”;
   li.style.width = (isIeNoDtd ? thumbWidth : thumbWidth – 4) + “px”;
   li.style.height = (isIeNoDtd ? thumbHeight : thumbHeight – 4) + “px”;
   li.style.borderWidth = “2px”;
   li.style.borderStyle = “solid”;
   li.style.borderColor = me.BorderColor;
   var a = document.createElement(“a”);
   a.target = “_target”;
   a.href = data[1];
   a.title = data[2];
   var img = new Image;
   img.border = 0;
   img.width = thumbWidth;
   img.height = thumbHeight;
   img.src = data[0];
   img.style.verticalAlign = “top”;
   img.style.margin = “-2px”;
   a.appendChild(img);
   li.appendChild(a);
   li.style.listStyle = “none”;
   li.onmouseover = LiMouseOver;
   ulList.appendChild(li);
}
function AutoPlay()
{
   me.Handler = setTimeout(function()
   {
    LiMouseOver.call(ulList.oldLi.nextSibling || ulList.firstChild);
    AutoPlay();
   }, me.Delay);
}
function OpacityClass(tag)
{
   var isFilter = !!tag.filters;
   var obj = isFilter ? tag.filters.alpha : tag.style;
   this.Set = function(value)
   {
    obj.opacity = isFilter ? value : value / 100;
    return this;
   }
   this.Add = function(value)
   {
    var opa = isFilter ? obj.opacity : obj.opacity * 100;
    opa += value;
    if(opa > 100) opa = 100;
    obj.opacity = isFilter ? opa : opa / 100;
    return this;
   }
   this.valueOf = function()
   {
    return isFilter ? obj.opacity : obj.opacity * 100;
   }
}
}
</script>
</head>
<body>
<div id=”divStage”></div>
</body>
</html>

标签Tags:, , , , , , , , , , , , , , , ,

nginx的rewrite规则

正则表达式匹配,其中:

* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配
文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行
flag标记有:

* last 相当于Apache里的[L]标记,表示完成rewrite
* break 终止匹配, 不再匹配后面的规则
* redirect 返回302临时重定向 地址栏会显示跳转后的地址
* permanent 返回301永久重定向 地址栏会显示跳转后的地址
一些可用的全局变量有,可以用做条件判断(待补全) (更多…)

标签Tags:, , , , , , , , , , , , , , , , , , , , , , , , , , ,

nginx 通过user-agent判断手机终端

user-agent 收集:

http://www.developershome.com//detection/detection.?page=userAgentHeader

http://search.cpan.org/~cmanley/Mobile-UserAgent-1.05/lib/Mobile/UserAgent.pm

http://www.zytrax.com/tech//mobile_ids.

http://en.wikipedia.org/wiki/List_of_user_agents_for_mobile_phones

nginx

location = / {

root /var/www/;
if ($http_user_agent ~* “Nokia”) { rewrite . /index.html break; }

if ($http_user_agent ~* “Mobile”) { rewrite . /index.html break; }

if ($http_user_agent ~* “SAMSUNG”) { rewrite . /index.html break; } }

if ($http_user_agent ~* “SonyEricsson”) { rewrite . /index.html break; }
if ($http_user_agent ~* “MOT”) { rewrite . /index.html break; } }
if ($http_user_agent ~* “BlackBerry”) { rewrite . /index.html break; }
if ($http_user_agent ~* “LG”) { rewrite . /index.html break; } }
if ($http_user_agent ~* “HTC”) { rewrite . /index.html break; }

if ($http_user_agent ~* “J2ME”) { rewrite . /index.html break; }
if ($http_user_agent ~* “Opera Mini”) { rewrite . /index.html break; } }
index index.html;
}

标签Tags:, , , , , , ,

URLSEO patchs for PHPOK3.0 simple

作者: 江小邪      [主页]
演示: 点击查看
适用版本: 3.0 Simple
添加日期: 2008-11-16 20:01
说明:

phpok基于php自身的伪静态补丁。提供形如下面演示地址的形式的链接。有bugs请跟评论,谢谢~

1、请先删除 data/lock. 文件
2、 压缩包内文件覆盖 phpok目录下的文件
3、运行 http://yoursite/setup.php 进行参数设置。注意务必正确设置phpok安装目录,最后以”/”结束
4、完成后请删除 setup.php
5、程序在phpok 3.0 Simple 下测试成功。
注意:打此补丁前请注意备份,否则所造成后果概不负责。

演示地址:http://phpok3.5bay.cn/html.php/home.html

下载地址:http://mydoc.5bay.cn/phpok3/UrlSeo_patchs_for_phpok3.0S.rar

标签Tags:, , , , , , , , , , , , , ,