最近放假刚好有点时间,帮朋友做了个图片站。因为纯兴趣所致,所以抛弃了不少以前积累的代码框架,玩了玩现在比较流行的web2.0设计。都是很简单的技术,但是的确给浏览者带来很好的体验。这里做一下小结。
php实现ajax示例
Ajax称作异步javascript和xml,具体工作原理就是利用XMLHttpRequest
这个浏览器内建JS对象,把用户的操作传递到后台脚本,然后后台脚本把数据在用XML传递到这个对象中来做处理,最终显示到浏览器上.这么做的最大优点就是可以不用刷新页面,直接操纵DOM这个HTML框架来改变页面的现实,这样一方面减少了浏览器和服务器之间的数据传输(因为只需要用XML把必要的数据丢回来),当然相应的用户体验很好(因为速度快,页面也不用刷新).
相应的特点就是大幅度的使用div
这个标签和css来组织页面结构,因为要操作DOM框架中的HTML元素,getElementById()
这个函数估计是用得最频繁的,div
既简洁又容易组织,看起来很好使.
下边写一个利用ajax进行页面交互的简单例子:
- main.js 使用
XMLHttpRequest
对象来接收query.php?xxx
请求丢过来的XML并解析,同时异步塞到front.html的DOM结构里边,这块是ajax的核心 - query.php 后台脚本,由main.js中的
request(url)
调用,然后把一份XML丢给main.js处理 - front.html 前端html页面,里边有一些带id的
div
或者其他html元素,main.js中的requestAction()
将解析该html,异步显示后台脚本的请求结果
几个主要的js函数如下:
function request(url) {
oReq = false;
if (window.XMLHttpRequest) { // check browser
oReq = new XMLHttpRequest();// check XML mime-type header :)
if (oReq.overrideMimeType) {// if XML mime-type header is missing...
oReq.overrideMimeType('text/xml');// correct it.
}
} else if (window.ActiveXObject) { // if IE?
try {
oReq = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
oReq = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!oReq) {// init XML request
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
oReq.onreadystatechange = requestAction; // event handle when readyState changed.
oReq.open('POST', url, true);
oReq.send();
}
function requestAction() {
if (http_request.readyState < 4) {// transforing...
document.getElementById("loading").style.display = "";
document.getElementById("loading").innerHTML = "Loading...";
}else{
document.getElementById("loading").style.display = "none";
}
if (http_request.readyState == 4) {// transfored.
if (http_request.status == 200) {
var xmlRoot = http_request.responseXML; // use XML format
var xmlNode = xmldoc.documentElement;
var xmlElements = xmldoc.getElementsByTagName("elem");
var count = book.getElementsByTagName("count")[0].childNodes[0].nodeValue;
var content="";
for(var i=0; i < xmlelements.length();i++){
content += getValue(xmlNode,"content",i);
}
document.getElementById("content").innerHTML = content;
//...
} else {
alert('There was a problem with the request.');
}
}
}
function getValue(node,name,i){
var value;
if(root.getElementsByTagName(name)[i].childNodes[0]){
value = root.getElementsByTagName(name)[i].childNodes[0].nodeValue;
}else{
value = '';
}
return value;
}
几个ajax框架
列举几个Prototype、moofx、lightbox等,其中prototype是个基础库,搭配json来处理dom,一方面简化了代码,一方面避免了一些安全问题。后者在javascript hijacking这篇文章中有称述。
几个php框架
CodeIgniter 我觉得是入门最快的一个php框架,理由它提供了俩视频讲解,呵呵。不过发觉框架只提供前端应用,后台该如何操作还没有仔细研究 :P
如何使用mod_rewrite
用完之后才发觉apache的 mod_rewrite 实在很好用,一方面你可以直接用正则式直接在.htaccess
配置中搞定url解析;当然也可以使用php对字符串操作的威力,把解析url的任务交给php,这样就是分析 $_SERVER[“REQUEST_STRING”]`,这个全局变量是用来获取URL请求的。后者是从wordpress中学来的 :P
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
javascript传递url中文乱码
当需URL中传递的参数包含中文的时候,建议还是完全用UTF-8编写站点最方便,因为javascript本身就是用UTF-8来处理多字节字符的,只需要加上一个encodeURI就ok了。如果用GBK的话,当php端接收到参数的时候需要使用iconv("UTF-8","GBK",$arg)
转码一下才能正确显示。可是这样转来转去,如果中间再涉及到数据库的编码,准把自己绕晕了。
使用php生成css和js
把服务器脚本和css以及js整合到一起,实在是很好用。因为当friend url的时候,常常会搞乱css和js中的一些相对路径,于是使用php脚本来动态生成它们实在很方便。唯一值得注意的是,需要给浏览器提供正确的mime type:
- 比如css:
header("Content-Type: text/css");
- 比如javascript:
header("Content-Type: application/javascript");
或者header("Content-Type:application/x-javascript");
使用cookie交互
当涉及到表单应用的时候,cookie是一个很好的保存临时和非安全数据的办法,并且可以减轻服务器端的压力。javascript中处理cookie还不是很方便,封装两个函数会方便很多。另外,再次建议使用utf-8编码,这样在firefox或者ie或者不同语言浏览器上,会避免很多麻烦。
function setCookie(c_name,value,expiredays) {
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +encodeURI(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}
function getCookie(c_name) {
if (document.cookie.length>0) {
c_start=document.cookie.indexOf(c_name + "=");
if (c_start!=-1) {
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(";",c_start);
if (c_end==-1) c_end=document.cookie.length;
return decodeURI(document.cookie.substring(c_start,c_end));
}
}
return "";
}
而在php中操作cookie会方便很多,cookie也是php和js交换数据的一种方式。