AWUI - 一个简单的具有 AJAX 支持的 Web 用户界面库






4.33/5 (5投票s)
关于创建自定义 JavaScript 控件集和跨浏览器支持库的文章
目录
引言
目前有很多方法可以使您的Web应用程序对用户更具吸引力和实用性,例如雅虎提供的Yahoo User Interface - 这是一个不错的选择,可以使您的网页更像桌面应用程序,谷歌也提出了自己的控件集等等。
自定义JavaScript控件库的主要要求是能够支持广泛的图形浏览器:Internet Explorer,Mozilla/Firefox,Safari和Opera。另一个要求基于第一个,意味着自定义控件在不同浏览器中的视图和行为一致。此外,该库可以提供枚举自定义控件、记录不同消息(来自控件的事件)、异常处理等的通用方法。
本文描述了一个尝试实现一组简单的Web控件,以帮助自定义您的Web应用程序。目前,该库有四个控件和一个实现AJAX交互机制的组件(它支持同步和异步调用)。
所有库控件均可在IE6、Firefox 1.5+、Opera 9下运行。
库的内容
- awui.js
库核心包含常用函数的实现。定义
aObject
- 所有自定义控件的基类 - awui_consts.js
一组有用的命名常量 - 现在它包含键盘代码的定义
- awui_xml.js
一组XML处理函数(为非IE浏览器实现了
selectNodes
和selectSingleNode
) - aselect.js
Combobox
控件(在单选模式下类似于标准的<select>
) - aslider.js
Slider控件(模拟Windows滑块控件)
- afileuploader.js
标准
<input type="file">
控件的包装器,具有可自定义的样式 - acheckbox.js
图形化复选框,支持三态模式
- ahttpclient.js
一组对象 - AJAX功能的跨浏览器实现
库的架构
库核心是全局JavaScript对象AWUI
,定义在awui.js中,因此所有使用该库控件的页面都应该包含此文件。所有通用函数都定义为该对象的成员函数,可以调用为AWUI.global_function(...)
。
所有控件都继承自aObject
- 继承实现方式与Yahoo UI相同 - AWUI拥有extend
方法,该方法将superclass
属性添加到JavaScript对象prototype
。父类的方法可以通过构造object.prototype.method(...)
来调用。
// call of superclass constructor
aSlider.superclass.constructor.call (this);
// call of superclass method
aSlider.superclass.processError (this, 'Cannot find slider object',
AWUI.ERROR_OBJECT);
库代码按照以下几条规则编写:
- 常量使用大写命名
- 函数参数使用“_”后缀命名
- 被视为私有的对象方法(仅由其他公共方法调用的方法)使用“_”前缀命名
- 变量使用驼峰式命名
通用AWUI方法
extend(subclass_, superclass_)
实现继承机制 - 向subclass_.prototype
添加superclass
属性el(id_)
document.getElementById(id_)
的别名crel(type_)
document.createElement (type_)
的别名crtext(str_)
document.createTextNode (str_)
的别名crimg(src_, id_, width_, height_, alt_)
创建DOM Image对象并设置其属性absPos(obj_)
返回一个具有top
和left
属性的对象,这些属性是所有对象父级的offsetTop
和offsetLeft
的总和 - 这是对象的绝对位置(如果对象没有"position:absolute
样式)appendRow(tbl_, pos_)
在指定位置向HTML表添加行并返回它 - 比TABLE.insertRow(pos_)
更快stopPropagation(e_)
取消DOM事件向父节点的传播this.label.onmousedown = astOnMouseDown; this.label.ondragstart = AWUI.stopPropagation; this.label.onselectstart = AWUI.stopPropagation; this.label.onkeydown = astOnKeyDown; this.label.onkeyup = astOnKeyUp;
setUnselectable(obj_)
禁止选择obj_quoteXml(str_)
转义字符串中的XML特殊符号(<,>,&)getWuiObj(id_)
通过选定的ID返回AWUI
对象
AJAX支持
XML HTTP请求发送功能由类aXmlHttpClient
实现,并支持类aXmlHttpRequest
。aXmlHttpClient
有两个主要方法call(request_ /*url*/, method_, resultFormat_)
和callAsync (request_/*url*/, handler_, method_, resultFormat_)
,其中request_
是一个准备好的aXmlHttpRequest
对象,它可以定义目标URL、POST内容体、请求超时(由aXmlHttpClient
控制)、HTTP方法(“GET”、“POST”)以及结果格式(“text/xml”或“text/plain”)。
如果这些方法的第一个参数是字符串,那么它将被视为目标URL,并且将使用选定的method_
和resultFormat_
创建一个新的请求对象。这些方法将HTTP请求发送到服务器,并在结果格式为“text/xml”时返回XML文档对象,否则返回文本。
在ASPX页面中,它可以这样使用:
var TAG_SERVER_ERROR = "ServerError";
var SERVER_REQUEST_TIMEOUT = 1000;
function getServerInfo() {
var url = "<%= Response.ApplyAppPathModifier
(Request.Path + "?cmd=get_info") %>";
httpClient.callAsync (url, onLoadServerInfo);
}
function onLoadServerInfo (data) {
if (data && data.documentElement) {
var lblInfo = AWUI.el ("lblProcessing");
var message = "";
var doc = data.documentElement;
var item = null,
size = 0,
name = "",
loaded = false;
if (doc.tagName != TAG_SERVER_ERROR) {
var items = AWUI.xmlSelectNodes (doc, "//DocumentInfo");
for(var ndx=0; ndx<items.length; ++ndx) {
if (ndx > 0) message += "<br />";
item = items[ndx];
if (item) {
size = parseInt (AWUI.xmlGetText
( AWUI.xmlSelectSingleNode (item, "./Size")));
loaded = (AWUI.xmlGetText
( AWUI.xmlSelectSingleNode
(item, "./IsLoaded")).toLowerCase() == "true");
name = AWUI.xmlGetText
( AWUI.xmlSelectSingleNode (item, "./Name"));
message += "Name: ";
if (loaded)
message += "<a href='javascript:void(0)'
title='Open' onclick=\"openDocument
('" + name + "')\">" + name + "</a><br />";
else
message += name + "<br />";
if (size < 0) {
message += "loading...<br />";
} else {
message += "Size: " + AWUI.xmlGetText
( AWUI.xmlSelectSingleNode
(item, "./Size")) + "<br />";
message += "RequirementsCount: " + AWUI.xmlGetText
( AWUI.xmlSelectSingleNode
(item, "./RequirementsCount")) + "<br />";
message += "Paragraphs: " + AWUI.xmlGetText
( AWUI.xmlSelectSingleNode
(item, "./LoadedParagraphsCount")) +
"/" + AWUI.xmlGetText
( AWUI.xmlSelectSingleNode
(item, "./ParagraphsCount"))
"<br />";
};
};
}
} else {
// process error
message = "<span class='error'>" + "Error: " +
AWUI.xmlGetText ( AWUI.xmlSelectSingleNode
(doc, "./Message")) + "<br />" +
AWUI.xmlGetText ( AWUI.xmlSelectSingleNode
(doc, "./Type")) + "<br />" +
AWUI.xmlGetText ( AWUI.xmlSelectSingleNode
(doc, "./StackTrace")) + "</span>" ;
}
lblInfo.innerHTML = message;
}
window.setTimeout("getServerInfo()", SERVER_REQUEST_TIMEOUT);
}
使用代码
请参阅附带的演示文件,了解所有AWUI
控件的用法。
aCheckBox
<h1>Simple CheckBoxes</h1>
Graphical CheckBox: <script language="JavaScript">
var cb = new aCheckBox(1); cb.draw();</script><br>
Graphical CheckBox (2): <script language="JavaScript">
var cbcircle = new aCheckBox(1);
cbcircle.imgPath="img/cb_circle"; cbcircle.draw();</script><br>
Win98 CheckBox: <script language="JavaScript">
var cb2 = new aCheckBox(); cb2.imgPath="img/cb_win98";
cb2.draw();</script><br>
WinXP CheckBox: <script language="JavaScript">
var cbxp = new aCheckBox(); cbxp.imgPath="img/cb_winxp";
cbxp.draw();</script>
<h1>Tristate CheckBoxes</h1>
Graphical CheckBox: <script language="JavaScript">
var cb3 = new aCheckBox(1, true);
cb3.draw();</script><br>
WinXP CheckBox: <script language="JavaScript">
var cbxp3 = new aCheckBox(-1, true);
cbxp3.imgPath="img/cb_winxp";
cbxp3.draw();</script>
aFileUploader (ASP.NET)
<script language="JavaScript" src="js/awui.js"></script>
<script language="JavaScript" src="js/afileuploader.js"></script>
<script language="JavaScript"> afuPrintStyles(); </script>
...
<%
HttpFileCollection files = Request.Files;
string[] keys = files.AllKeys;
for (int ndx = 0; ndx < keys.Length; ndx++)
{
Response.Write("<b>File</b>: " + Server.HtmlEncode(keys[ndx]) + "<br>");
HttpPostedFile file = Request.Files [keys[ndx]];
Response.Write("path: " + Server.HtmlEncode(file.FileName) + "<br>");
}
%>
...
<form name="form1" method="POST" enctype="multipart/form-data">
<table border=0>
<tr>
<td><script>var file = new aFileUploader("file", 300, 20); file.draw();
</script> </td>
<td><input type="submit" class="btn" value="Upload" style="height: 20px;">
</td>
</tr>
</table>
</form>
aSelect
<script language="JavaScript" src="js/awui.js"></script>
<script language="JavaScript" src="js/awui_consts.js"></script>
<script language="JavaScript" src="js/aselect.js"></script>
...
<script language="JavaScript" >
function onSelChange (newVal, oldVal, sel) {
window.status = sel.name + " changed to: " + newVal + ", from: " +
oldVal;
}
</script>
...
<script>
var data = ["A", "B", "C", "D"];
var sel1 = new aSelect("sel1", data, 0);
sel1.onselchange = onSelChange;
sel1.draw();
</script>
aSlider
<script language="JavaScript" src="js/awui.js"></script>
<script language="JavaScript" src="js/aslider.js"></script>
<script language="JavaScript" >
function onScroll(obj_, pos_){
window.status = obj_ + ": " + pos_;
}
</script>
...
<script>
var slider = new aSlider(50);
slider.onscroll = onScroll;
slider.draw("", 300, 30);
</script>
再分发
AWUI
的所有部分都可以无限制地在您的项目中使用(如果您认为这样做值得的话...)。如果您发现代码中有错误,我也将非常感谢您的反馈。
历史
- 2007年1月25日 -
AWUI
- 一个Web用户界面库 v0.1.0.0。