Ajax认识,和动态生成 代码

Ajax控件和类库现在真的太多了,不知不觉中增加了Ajax的神秘性和复杂性,看到版内很多人为此费解和伤神,决定发此贴谈谈本人对Ajax的观点,希望能让大家对Ajax有一个本质的Ajax。

观点一:Ajax和服务器端技术毫不相关

严格的说,与传统web开发相比,Ajax是完完全全的客户端技术。由于很多控件封装了客户端和服务器端的通信过程,因此很多问题也因通信而起。事实上,不论何种Ajax技术,服务器端都是返回的一个纯文本流,再由客户端来处理这个文本。这段文本可以是xml格式,也可以是一个Html片段,也可以是一段JavaScript脚本,或者仅是一个字符串。服务器端仅仅是作为一个数据接口,客户端使用XMLHttpRequest对象来请求这个页面,服务器端在页面内写入结果文本,这个过程和普通的web开发没有任何区别。所不同的只是,客户端在异步获取结果后,不是直接显示在页面,而是由客户端的Javascript脚本处理后再显示在页面。至于各种控件所谓的能返回DataSet对象,Date对象,或者其他的数据类型,都是封装了这个处理过程的结果。

观点二:DOM模型是Ajax最本质的技术

之所以没有把XMLHttpRequest列为最本质的技术,因为本人觉得它实在是太简单了,它只是可以让浏览器在后台请求一个页面,并将其内容交给JavaScript处理。真正的核心应该是:DOM模型,即文档对象模型。在DOM模型里,Html标记都被认为是一个对象,例如:div对象,table对象等等。DOM模型就规定了这些对象所具有的属性、方法和事件。通过这些性质,可以对一个已经显示于浏览器的页面进行内容的修改,例如增加节点、修改节点位置,删除节点等等。而不仅仅是一个innerHTML属性这么简单,虽然这是一个很有用的属性。

观点三:在使用Ajax控件前理解它们的实现

使用Ajax控件的确可以提高效率,但如果你空中楼阁般使用控件,那就得不偿失了。从一个控件换到另外一个控件又会有一个漫长的学习曲线。所以应该从底层了解其,况且Ajax实在不是什么高深的技术。其实任何东西的最底层其实都是简单的,但如果封装了这些底层的东西,事情会变得复杂和难以理解。以Asp.net为例,它的定制特性可以使得只要在方法前加上[ajax method]类似这样的标志就可以称为一个异步方法,相信这使得Asp.net的Ajax开发显得更加“高效”或者是“神秘”,而更多的事情则被封装了。同样记住一条,任何对服务器端的请求仅仅是返回纯文本,我们不一定要依赖于封装好的处理过程,而完全可以自己来实现。

观点四:学好JavaScript

在大多数人看来,JavaScript总不是那么一种正规的语言,随便copy一段就碰巧能运行,学过c之类的人,一看也能看懂,而且在浏览器中常常有脚本错误提示,所以潜意识觉得总不能付之以大任。事实上,要学好Ajax,这就完全是一种错误的看法。javascript作为一种脚本语言,其语法的确不是很严格,但并不妨碍其完成诸多复杂的任务,没有JavaScript,就没有Ajax。所以本人强烈建议,学Ajax前,一定要好好研究一番JavaScript,一般来讲,如果能顺利看懂prototype框架的代码(如:prototype-1.3.1.js),你的JavaScript水平就基本过关了。同时对DOM模型也可以算有一个基本的了解。

观点五:Ajax点缀:CSS

用JavaScript控制CSS其实很简单,基本上每个DOM对象都有一个style对象,只要把css属性里的"-"去掉,并让随后的字母变为大写就可以作为属性使用了,例如:element.style.backgroundColor="#f00";在css是:选择符 {background-color:#f00}

一口气说这么多,希望对大家有点用处^_^

 可以使用YUI,就是yahoo提供的一个javascript ui解决方案。
使用的代码:


<link rel="stylesheet" type="text/css" href="build/reset/reset.css">
<link rel="stylesheet" type="text/css" href="build/fonts/fonts.css">
<link rel="stylesheet" type="text/css" href="build/menu/assets/menu.css">
<link rel="stylesheet" type="text/css" href="css/folders/tree.css">

<script type="text/javascript" src="build/yahoo/yahoo.js"></script>
<script type="text/javascript" src="build/event/event.js"></script>
<script type="text/javascript" src="build/dom/dom.js"></script>
<script type="text/javascript" src="build/treeview/treeview.js"></script>
<script type="text/javascript" src="build/animation/animation.js"></script>
<script type="text/javascript" src="build/container/container_core.js"></script>
<script type="text/javascript" src="build/menu/menu.js"></script>

<script>

var g_iUin= 0;
var tree;

/*create namespace for foderTreeViews:*/
YAHOO.namespace("foderTreeView");

function get_folder_list(sFolderName)
{
top._mainfrm.location= "/cgi-bin/get_file_list?path="+sFolderName;
return ;
}


// "render" event handler for the ewe context menu
function onContextMenuRender(p_sType, p_aArgs, p_oMenu) {
//  Add a "click" event handler to the ewe context menu
this.clickEvent.subscribe(onFolderContextMenuClick, p_oMenu, true);
}


// "click" event handler for each item in the ewe context menu
function onFolderContextMenuClick(p_sType, p_aArgs, p_oMenu)
{
var oItem = p_aArgs[1];

if (oItem)
{
switch(oItem.index) {
case 0:     // new sub-directory
//alert("new dir:" + oItem.value);
var sName= window.prompt("输入新目录名称:");
var sUrl = "/cgi-bin/new_dir.cgi?path=" + oItem.value + "&name=" + sName;
alert(sUrl);
top._mainfrm.location= sUrl;
break;

case 1:     // delete directory

var sUrl = "/cgi-bin/delete_dir.cgi?path=" + oItem.value;
alert(sUrl);
top._mainfrm.location= sUrl;

break;
}
}
}


function addNewContextMenu(elID, subPath)
{
var aMenuItems = [
{ text: "新建子目录", value: subPath },
{ text: "删除子目录", value: subPath }
];

var sMenuName = "fcm_"+elID;
var oFolderMenu = new YAHOO.widget.ContextMenu(
sMenuName,
{
trigger: elID,
itemdata: aMenuItems,
lazyload: true,
effect:{
effect:YAHOO.widget.ContainerEffect.FADE,
duration:0.25
}
}
);


oFolderMenu.renderEvent.subscribe(onContextMenuRender, oFolderMenu, true);
}

YAHOO.foderTreeView.foderTree = function() {


function createHttpLoader()
{
var d;
try {
d= new ActiveXObject("microsoft.XMLDOM");
}
catch (e) {
return null;
}
d.async= true;
return d;
}

function loadNodeData(node, fnLoadComplete)
{

var xmlDom= createHttpLoader();

var p = node;
var path = "";
while (p.depth > 0) {
path = "/" + p.label + path;
p = p.parent;
}
//var sUrl = "/cgi-bin/cgi_get_sub_folders.cgi?uin="+g_iUin+"&path=" + path;
var sUrl = "/folder.xml";

xmlDom.onreadystatechange = function ()
{
if (xmlDom.readyState != 4) return;
if (xmlDom.parseError.errorCode != 0) {
alert(xmlDom.parseError.reason);
return;
}

var rootNode = xmlDom.selectSingleNode("data");

var Nodes = xmlDom.selectNodes("/data/folder");

for (i=0; i< Nodes.length; i++)
{
var subPath = path + "/" + Nodes[i].getAttribute("name");
var data = {
"label": Nodes[i].getAttribute("name"),
"href": "javascript:get_folder_list('" + subPath + "')"
};
var newNode = new YAHOO.widget.TextNode(data, node, false);
addNewContextMenu(newNode.labelElId, subPath);
}
fnLoadComplete();
};
xmlDom.load(sUrl);
}

function buildTree() {
   //create a new tree:
   tree = new YAHOO.widget.TreeView("treeContainer");

   //turn dynamic loading on for entire tree:
   tree.setDynamicLoad(loadNodeData, 0);

   //get root node for tree:
   var root = tree.getRoot();

   //add child nodes for tree:
   var newNode = new YAHOO.widget.TextNode("/", root, true);

   //render tree with these five nodes; all descendants of these nodes
   //will be generated as needed by the dynamic loader.
   tree.draw();
}


return {
init: function() {
buildTree();
}
}
} ();

function refresh_menu()
{
tree.refresh();
}


YAHOO.util.Event.addListener(window, "load", YAHOO.foderTreeView.foderTree.init, YAHOO.foderTreeView.foderTree, true);

</script>
<title>Dynamic TreeView foderTreeView</title>
</head>
<body id="yahoo">

<div id="treeContainer"></div>
<br/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值