At the Forge - Scriptaculous
Ajax 是一种热门的新型 Web 开发范例,它使用 JavaScript 发送和处理异步 HTTP 请求。在过去的几个月中,本专栏研究了生成和处理 Ajax 调用的不同方法。最复杂的方法是自己完成,创建 XMLHttpRequest 对象,然后使用它向用户的浏览器发送请求,并指定哪个 JavaScript 函数将处理响应。上个月,我们展示了通过使用 Prototype(一个 JavaScript 库,其中包含许多 JavaScript 程序员有用的快捷方式和实用程序函数)可以大大简化我们的生活。
好消息是 Prototype 确实使 JavaScript 编程更容易、更直接。但是,人们最想用 JavaScript 做的事情之一是创建更灵活的 GUI。现在 Web 应用程序越来越像桌面应用程序,尤其如此;用户期望拥有与非浏览器应用程序相同的反馈和控制感。
正如我们在 Ajax 中看到的那样,有一些方法可以自行创建和重用这些行为。但是,当有库可以为您处理此类任务时,为什么要这样做呢?其中几个是 Scriptaculous、MoochiKit 和 Dojo。(Dojo 实际上是一个完整的端到端 JavaScript 库;我希望在本专栏的未来文章中对其进行探讨。)本月,我们来看看 Scriptaculous,这是一个由 Thomas Fuchs 编写的开源库。Scriptaculous 可以轻松地美化我们的 HTML 文件,而无需深入研究底层的 JavaScript。
安装 Scriptaculous 非常容易。下载最新版本的 Scriptaculous (script.aculo.us),并将包含的六个 JavaScript 文件(在 src 目录中)安装到 Web 服务器的文档根目录中的某个位置。
实际上,安装 Scriptaculous 甚至可以比这更简单。如果您使用最新版本的 Ruby on Rails,则 Scriptaculous 和 Prototype 已经安装。有关如何直接使用这些库以及如何从 Ruby 代码中使用这些库的说明,请参阅 Rails 文档。
请注意,我在本文中使用的 Scriptaculous 1.6.5 需要 Prototype 1.5 或更高版本。尽管 Prototype 1.5 很可能在本专栏发表时发布,但我目前依赖于 Prototype 1.5 RC1。因此,我在此处描述的功能与最终发行版之间可能存在一些差异。
为了使用 Scriptaculous,您需要在 HTML 页面中包含两个 script 标签,以加载 Prototype,然后再加载 Scriptaculous
<script src="/javascripts/prototype.js" type="text/javascript"></script> <script src="/javascripts/scriptaculous.js" type="text/javascript"></script>
那么,您可能想用 Scriptaculous 做什么呢?其最常见的用途之一是创建视觉效果。每个效果都定义为 Effect 对象中的一个方法。您可以通过以下方式创建效果
new Effect.EffectName('id')
我们可以通过调用使其淡出
new Effect.Fade('headline');
当然,只有在特定事件发生时才应该发生这种情况。列表 1 包含一个简单的 HTML 文件 effects.html,其中包含两个标记为“显示标题”和“淡出标题”的按钮。单击第一个按钮会在 ID 为“headline”的节点上调用 Effect.Appear。请注意,我们没有将节点本身传递给 Effect.Fade,而是传递了 ID。Effect.Fade 使用 Prototype 的 $() 函数来检索具有该 ID 的节点。
列表 1. effects.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Special effects</title> <script src="/javascripts/prototype.js" type="text/javascript"></script> <script src="/javascripts/scriptaculous.js" type="text/javascript"></script> </head> <body> <h2 id="headline">Welcome</h2> <p>Welcome to the page of effects!</p> <p><input type="button" value="Fade headline" onclick="new Effect.Fade('headline')" /></p> <p><input type="button" value="Appear headline" onclick="new Effect.Appear('headline')" /></p> </body> </html>
为了使标题淡出,我们设置了以下事件处理程序
onclick="new Effect.Fade('headline')"
每个效果都有许多设置,每个设置都由 Scriptaculous 给出一个默认值。要覆盖一个或多个这些默认值,请在调用中传递一个或多个
onclick="new Effect.Fade('headline', {delay: 2, duration: 10})"
在某些情况下,例如列表 1 中的显示/淡出二人组,有两个按钮似乎有点傻。毕竟,如果我单击淡出两次会发生什么?更合理的是有一个按钮,当标题关闭时打开标题,反之亦然。Scriptaculous 通过切换效果支持这一点。例如,我们可以删除一个按钮,并为第二个按钮提供一个看起来像这样的事件处理程序
onclick="new Effect.toggle('headline', 'appear')"
现在,单击该按钮会切换标题的可见性,使用显示和淡出效果来打开和关闭标题。我们也可以对盲效果(BlindUp 和 BlindDown)和滑动效果(SlideUp 和 SlideDown)执行相同的操作。我们还可以将切换与前面显示的参数结合起来
onclick="new Effect.toggle('headline', 'appear', {delay: 2, duration: 10})"
只有少数效果成对出现。一些效果仅用于删除文本,如下所示
new Effect.Fold("headline")
其他效果旨在引起用户的注意。例如,我们可以通过执行以下操作来突出显示我们的标题
new Effect.Highlight("headline")
效果当然是 Scriptaculous 的重要且令人印象深刻的一部分;该库附带了许多效果,并且有很多方法可以组合和调用它们。但是,Scriptaculous 提供的不仅仅是一堆效果。它还包括一些 JavaScript 程序员可能想要的用户级功能。
Google Suggest(及其在 Firefox 2.0 中的同类)推广的一个示例是自动完成文本字段。这种文本字段允许您输入任何想要的内容,但是如果您到目前为止输入的内容与已知的文本字符串匹配,则会为您提供完成它的机会。这在许多方面类似于长期以来在 Windows 系统上流行的组合框小部件,但 Web 应用程序无法使用。(一些 Scriptaculous 用户创建了 Autocompleter 类的派生类,这些派生类更类似于组合框。)
Scriptaculous 附带两种不同类型的自动完成文本字段,它们仅在完成列表的填充方式上有所不同。在第一种情况下,称为 Autocompleter.Local,匹配列表在 JavaScript 中设置。相关的文本字段 Ajax.Autocompleter 使用 Ajax 从远程 HTTP 服务器检索匹配列表。两者在精神上非常相似,为了简单起见,我在此处仅演示 Autocompleter.Local。
为了使用 Autocompleter.Local,我们首先创建一个文本字段,就像我们在 HTML 表单中一样
<input type="text" id="distro" name="distro_text_field" autocomplete="off" />
请注意,我已包含设置autocomplete="off"在上面的字段中。此处将 autocomplete 属性(仅由 Microsoft 的 Internet Explorer 使用)设置为 off,以确保 IE 用户不会因决斗完成系统而感到不快。
接下来,我们创建一个带有 ID 属性的 <div> 部分。此外,我们将 style 属性设置为保持 div 隐藏,直到我们修改其样式
<div id="distro_complete" style="display:none"></div>
最后,我们添加一些 JavaScript 来创建一个新的 Autocompleter.Local 对象
<script type="text/javascript"> new Autocompleter.Local('distro', 'distro_complete', ['Red Hat', 'Fedora Core', 'Debian', 'Gentoo', 'Knoppix', 'Ubuntu', 'Kubuntu'], { }); </script>
Autocompleter.Local 的构造函数接受四个参数:文本字段的 ID、我们将插入完成项的 div 的 ID、包含完成字符串的数组和一组选项(当前为空)。如果您尝试将此代码放在文档的 <head> 中,它将因奇怪的错误而失败,因为文本字段和 div 必须在代码执行之前存在。
通过将以上内容包含在 HTML 页面中(如列表 2 中所示),您为自动完成工作奠定了基础。每当用户加载页面并在文本字段中键入字母时,Scriptaculous 都会等待 0.4 秒的非活动时间。如果用户没有键入,并且如果文本字段已包含一个或多个字符,则 Autocompleter.Local 会尝试从当前列表中查找匹配项。如果找到匹配项,它将填写文本字段的其余部分。
列表 2. complete.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Special effects</title> <script src="/javascripts/prototype.js" type="text/javascript"></script> <script src="/javascripts/scriptaculous.js" type="text/javascript"></script> </head> <body> <h2>Enter your favorite distribution</h2> <p><input type="text" id="distro" name="distro_text_field" autocomplete="off" /></p> <div class="auto_complete" id="distro_complete" style="display:none"></div> <script type="text/javascript"> new Autocompleter.Local('distro', 'distro_complete', ['Red Hat', 'Fedora Core', 'Debian', 'Gentoo', 'Knoppix', 'Ubuntu', 'Kubuntu'], { }); </script> </body> </html>
如果找到多个匹配项(就像在我们的示例中键入 K 的用户会发生的情况一样,它同时匹配 Kubuntu 和 Knoppix),系统会显示一个选项菜单,用户可以从中通过键入或单击来选择。
Protoype 是一个旨在解决许多程序员需求的 JavaScript 库。但是,Prototype 的功能仅扩展到程序员;它不提供任何直接的 GUI 改进。鉴于 JavaScript 主要用于处理 Web 应用程序中的 GUI,因此毫不奇怪,有几个库构建在 Prototype 之上以处理此类任务。Scriptaculous 似乎是其中最著名的库之一,根据我的经验,这是有充分理由的。
Scriptaculous 有几个我们本月没有探讨的功能,包括拖放和 JavaScript 单元测试。即使对于无意创建 GUI 效果的 JavaScript 程序员来说,最后一项也可能值得注意。
本文的资源: /article/9505。
Reuven M. Lerner,一位长期的 Web/数据库顾问,是伊利诺伊州埃文斯顿西北大学学习科学博士候选人。他目前与妻子和三个孩子住在伊利诺伊州斯科基。您可以在 altneuland.lerner.co.il 阅读他的博客。