`
zhangljerry
  • 浏览: 144407 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

prototype-1.3.1.js 开发笔记

阅读更多

或许你还没有用过它, prototype.js 是一个由Sam Stephenson写的JavaScript包。这个构思奇妙编写良好的一段兼容标准的一段代码将承担创造胖客户端, 高交互性WEB应用程序的重担。轻松加入Web 2.0特性。

如果你最近体验了这个程序包,你很可能会发现文档并不是它的强项之一。像所有在我之前的开发者一样,我只能一头扎进prototype.js的源代码中并且试验其中的每一个部分。 我想当我学习他的时候记写笔记然后分享给其他人将会很不错。

我也一起提供了这个包的对象,类,方法和扩展的 非官方参考

这个程序包里面包含了许多预定义的对象和通用性方法。编写这些方法的明显的目的就是为了减少你大量的重复编码和惯用法。

$() 方法是在DOM中使用过于频繁的 document.getElementById() 方法的一个便利的简写,就像这个DOM方法一样,这个方法返回参数传入的id的那个元素。

比起DOM中的方法,这个更胜一筹。你可以传入多个id作为参数然后 $() 返回一个带有所有要求的元素的一个 Array 对象。下面的例子会向你描述这些。

<HTML>
<HEAD>
<TITLE> Test Page </TITLE>
<script src="prototype-1.3.1.js"></script>

<script>
  function test1()
  {
    var d = $(’myDiv’);
    alert(d.innerHTML);
  }

  function test2()
  {
    var divs = $(’myDiv’,’myOtherDiv’);
    for(i=0; i<divs.length; i++)
    {
      alert(divs[i].innerHTML);
    }
  }
</script>
</HEAD>

<BODY>
  <div id="myDiv">
    <p>This is a paragraph</p>
  </div>
  <div id="myOtherDiv">
    <p>This is another paragraph</p>
  </div>

  <input type="button" value=Test1 onclick="test1();"><br>
  <input type="button" value=Test2 onclick="test2();"><br>

</BODY>
</HTML>

这个方法的另一个好处就是你可以传入id字符串或者元素对象自己,这使得在创建可以传入任何形式参数的方法的时候, 它变得非常有用。

上面提到的共通方法非常好,但是面对它吧,它们不是最高级的那类东西。它们是吗?你很可能自己编写了这些甚至在你的脚本里面有类似功能的方法。但是这些方法只是冰山一角。

我很肯定你对prototype.js感兴趣的原因很可能是由于它的AJAX能力。所以让我们解释当你需要完成AJAX逻辑的时候,这个包如何让它更容易。

Ajax 对象是一个预定义对象,由这个包创建,为了封装和简化编写AJAX 功能涉及的狡猾的代码。 这个对象包含一系列的封装AJAX逻辑的类。我们来看看它们的一些。

如果你不使用任何的帮助程序包,你很可能编写了整个大量的代码来创建XMLHttpRequest对象并且异步的跟踪它的进程, 然后解析出响应 然后处理它。当你不需要支持多于一种类型的浏览器时你会感到非常的幸运。

为了支持 AJAX 功能。这个包定义了 Ajax.Request 类。

假如你有一个应用程序可以通过url http://yoursever/app/get_sales?empID=1234&year=1998与服务器通信。它返回下面这样的XML 响应。

<?xml version="1.0" encoding="utf-8" ?>
<ajax-response>
  <response type="object" id="productDetails">
    <monthly-sales>
      <employee-sales>
        <employee-id>1234</employee-id>
        <year-month>1998-01</year-month>
        <sales>$8,115.36</sales>
      </employee-sales>
      <employee-sales>
        <employee-id>1234</employee-id>
        <year-month>1998-02</year-month>
        <sales>$11,147.51</sales>
      </employee-sales>
    </monthly-sales>
  </response>
</ajax-response>

用 Ajax.Request对象和服务器通信并且得到这段XML是非常简单的。下面的例子演示了它是如何完成的。

<script>
  function searchSales()
  {
    var empID = $F(’lstEmployees’);
    var y = $F(’lstYears’);
    var url = ’http://yoursever/app/get_sales’;
    var pars = ’empID=’ + empID + ’&year=’ + y;
    var myAjax = new Ajax.Request(
          url,
          {method: ’get’, parameters: pars, onComplete: showResponse}
          );


  }

  function showResponse(originalRequest)
  {
    //put returned XML in the textarea
    $(’result’).value = originalRequest.responseText;
  }
</script>

<select id="lstEmployees" size="10" onchange="searchSales()">
  <option value="5">Buchanan, Steven</option>
  <option value="8">Callahan, Laura</option>
  <option value="1">Davolio, Nancy</option>
</select>
<select id="lstYears" size="3" onchange="searchSales()">
  <option selected="selected" value="1996">1996</option>
  <option value="1997">1997</option>
  <option value="1998">1998</option>
</select>
<br><textarea id=result cols=60 rows=10 ></textarea>

你看到传入 Ajax.Request构造方法的第二个对象了吗? 参数{method: ’get’, parameters: pars, onComplete: showResponse} 表示一个匿名对象的真实写法。他表示你传入的这个对象有一个名为 method 值为 ’get’的属性,另一个属性名为 parameters 包含HTTP请求的查询字符串,和一个onComplete 属性/方法包含函数showResponse。

还有一些其它的属性可以在这个对象里面定义和设置,如 asynchronous,可以为true 或 false 来决定AJAX对服务器的调用是否是异步的(默认值是 true)。

这个参数定义AJAX调用的选项。在我们的例子中,在第一个参数通过HTTP GET命令请求那个url,传入了变量 pars包含的查询字符串, Ajax.Request 对象在它完成接收响应的时候将调用showResponse 方法。

也许你知道, XMLHttpRequest在HTTP请求期间将报告进度情况。这个进度被描述为四个不同阶段:Loading, Loaded, Interactive, 或 Complete。你可以使 Ajax.Request 对象在任何阶段调用自定义方法 ,Complete 是最常用的一个。想调用自定义的方法只需要简单的在请求的选项参数中的名为 onXXXXX 属性/方法中提供自定义的方法对象。 就像我们例子中的 onComplete 。你传入的方法将会被用一个参数调用,这个参数是 XMLHttpRequest 对象自己。你将会用这个对象去得到返回的数据并且或许检查包含有在这次调用中的HTTP结果代码的 status 属性。

还有另外两个有用的选项用来处理结果。我们可以在onSuccess 选项处传入一个方法,当AJAX无误的执行完后调用, 相反的,也可以在onFailure选项处传入一个方法,当服务器端出现错误时调用。正如onXXXXX 选项传入的方法一样,这两个在被调用的时候也传入一个带有AJAX请求的XMLHttpRequest对象。

我们的例子没有用任何有趣的方式处理这个 XML响应, 我们只是把这段XML放进了一个文本域里面。对这个响应的一个典型的应用很可能就是找到其中的想要的信息,然后更新页面中的某些元素, 或者甚至可能做某些XSLT转换而在页面中产生一些HTML。

更完全的解释,请参照 Ajax.Request 参考Ajax选项参考

如果你的服务器的另一端返回的信息已经是HTML了,那么使用这个程序包中 Ajax.Updater 类将使你的生活变得更加得容易。用它你只需提供哪一个元素需要被AJAX请求返回的HTML填充就可以了,例子比我写说明的更清楚。

<script>
  function getHTML()
  {
    var url = ’http://yourserver/app/getSomeHTML’;
    var pars = ’someParameter=ABC’;

     var myAjax = new Ajax.Updater(’placeholder’, url, {method: ’get’, parameters: pars});

  }
</script>

<input type=button value=GetHtml onclick="getHTML()">
<div id="placeholder"></div>

你可以看到,这段代码比前面的例子更加简洁,不包括 onComplete 方法,但是在构造方法中传入了一个元素id。 我们来稍稍修改一下代码来描述如何在客户端处理服务器段错误成为可能。

我们将加入更多的选项, 指定处理错误的一个方法。这个是用 onFailure 选项来完成的。

我们也指定了一个 placeholder 只有在成功请求之后才会被填充。为了完成这个目的我们修改了第一个参数从一个简单的元素id到一个带有两个属性的对象, success (一切OK的时候被用到) 和 failure (有地方出问题的时候被用到) 在下面的例子中没有用到failure属性,而仅仅在 onFailure 处使用了 reportError 方法。

<script>
  function getHTML()
  {
    var url = ’http://yourserver/app/getSomeHTML’;
    var pars = ’someParameter=ABC’;
    var myAjax = new Ajax.Updater(
          {success: ’placeholder’},
          url,
          {method: ’get’, parameters: pars, onFailure: reportError});


  }

  function reportError(request)
  {
    alert(’Sorry. There was an error.’);
  }
</script>

<input type=button value=GetHtml onclick="getHTML()">
<div id="placeholder"></div>

如果你的服务器逻辑是返回JavaScript 代码而不是单纯的 HTML 标记, Ajax.Updater对象可以执行那段JavaScript代码。为了使这个对象对待响应为JavaScript,你只需在最后参数的对象构造方法中简单加入evalScripts: true属性。

更完全的解释,请参照 Ajax.Updater 参考Ajax选项参考

让我们看看这些扩展的具体例子。

<input type=checkbox id=myChk value=1> Test?
<script>
  //declaring the class
  var CheckboxWatcher = Class.create();

  //defining the rest of the class implmentation
  CheckboxWatcher.prototype = {

    initialize: function(chkBox, message) {
      this.chkBox = $(chkBox);
      this.message = message;
      //assigning our method to the event
      this.chkBox.onclick = this.showMessage.bindAsEventListener(this);
    },

    showMessage: function(evt) {
     alert(this.message + ’ (’ + evt.type + ’)’);
    }
  };


  var watcher = new CheckboxWatcher(’myChk’, ’Changed’);
</script>

Table 7. Event 对象的扩展

方法 类别 参数 描述
element(event) static event: 事件对象 返回引发这个事件的元素。
isLeftClick(event) static event: 事件对象 如果鼠标左键单击返回true。
pointerX(event) static event: 事件对象 返回在页面上x坐标。
pointerY(event) static event: 事件对象 返回在页面上y坐标。
stop(event) static event: 事件对象 用这个方法来中止事件的默认行为来使事件的传播停止。
findElement(event, tagName) static event: 事件对象, tagName: 指定标记的名字 向 DOM 树的上位查找,找到第一个给定标记名称的元素, 从这个元素开始触发事件。
observe(element, name, observer, useCapture) static element: 对象或者对象id, name: 事件名 (如 ’click’, ’load’, etc), observer: 处理这个事件的方法, useCapture: 如果true, 在捕捉到事件的阶段处理事件 那么如果 false在bubbling 阶段处理。 加入一个处理事件的方法。
stopObserving(element, name, observer, useCapture) static element: 对象或者对象id, name: 事件名 (如 ’click’, ’load’, etc), observer: 处理这个事件的方法, useCapture: 如果true, 在捕捉到事件的阶段处理事件 那么如果 false在bubbling 阶段处理。 删除一个处理实践的方法。
_observeAndCache( element, name, observer, useCapture) static   私有方法,不用管它。
unloadCache() static (none) 私有方法,不用管它。清除内存中的多有观察着缓存。

让我们看看怎样用这个对象加入处理 window 对象的load事件的处理方法。

<script>
  Event.observe(window, ’load’, showMessage, false);

  function showMessage() {
   alert(’Page loaded.’);
  }
</script>

继承自 Ajax.Base

封装 AJAX 操作

Table 15. Ajax.Request 类

方法 类别 参数 描述
[ctor](url, options) constructor url: 请求的url, options: AJAX 选项 创建这个对象的一个实例,它将在给定的选项下请求url。 重要:如果选择的url受到浏览器的安全设置,他会一点作用也不起。 很多情况下,浏览器不会请求与当前页面不同主机(域名)的url。 你最好只使用本地url来避免限制用户配置他们的浏览器(谢谢Clay)
request(url) instance url: AJAX 请求的url 这个方法通常不会被外部调用。已经在构造方法中调用了。
setRequestHeaders() instance (none) 这个方法通常不会被外部调用。 被这个对象自己调用来配置在HTTP请求要发送的HTTP报头。
onStateChange() instance (none) 这个方法通常不会被外部调用。 当AJAX请求状态改变的时候被这个对象自己调用。
respondToReadyState(readyState) instance readyState: 状态数字 (1 到 4) 这个方法通常不会被外部调用。 当AJAX请求状态改变的时候被这个对象自己调用。

AJAX操作中一个重要的部分就是 options 参数。 本质上没有options类。任何对象都可以被传入,只要带有需要的属性。通常会只为了AJAX调用创建匿名类。

Table 16. options 参数对象

属性 类型 Default 描述
method Array ’post’ HTTP 请求方式。
parameters String ’’ 在HTTP请求中传入的url格式的值列表。
asynchronous Boolean true 指定是否做异步 AJAX 请求。
postBody String undefined 在HTTP POST的情况下,传入请求体中的内容。
requestHeaders Array undefined 和请求一起被传入的HTTP头部列表, 这个列表必须含有偶数个项目, 任何奇数项目是自定义的头部的名称, 接下来的偶数项目使这个头部项目的字符串值。 例子:[’my-header1’, ’this is the value’, ’my-other-header’, ’another value’]
onXXXXXXXX Function(XMLHttpRequest) undefined 在AJAX请求中,当相应的事件/状态形成的时候调用的自定义方法。 例如 var myOpts = {onComplete: showResponse, onLoaded: registerLoaded};. 这个方法将被传入一个参数, 这个参数是携带AJAX操作的 XMLHttpRequest对象。
onSuccess Function(XMLHttpRequest) undefined 当AJAX请求成功完成的时候调用的自定义方法。 这个方法将被传入一个参数, 这个参数是携带AJAX操作的 XMLHttpRequest对象。
onFailure Function(XMLHttpRequest) undefined 当AJAX请求完成但出现错误的时候调用的自定义方法。 这个方法将被传入一个参数, 这个参数是携带AJAX操作的 XMLHttpRequest对象。
insertion Function(Object, String) null 为了把返回的文本注入到一个元素中而执行的方法。 这个方法将被传入两个参数,要被更新的对象并且只应用于 Ajax.Updater的响应文本 。
evalScripts Boolean undefined, false 决定当响应到达的时候是否执行其中的脚本块,只在 Ajax.Updater 对象中应用。
decay Number undefined, 1 决定当最后一次响应和前一次响应相同时在 Ajax.PeriodicalUpdater 对象中的减漫访问的次数, 例如,如果设为2,后来的刷新和之前的结果一样, 这个对象将等待2个设定的时间间隔进行下一次刷新, 如果又一次一样, 那么将等待4次,等等。 不设定这个只,或者设置为1,将避免访问频率变慢。

继承自 Ajax.Request

当请求的url返回一段HTML而你想把它直接放置到页面中一个特定的元素的时候被用到。 如果url的返回<script> 的块并且想在接收到时就执行它的时候也可以使用该对象。含有脚本的时候使用 evalScripts 选项。

继承自 Ajax.Base

这个类重复生成并使用 Ajax.Updater 对象来刷新页面中的一个元素。或者执行 Ajax.Updater 可以执行的其它任务。更多信息参照 Ajax.Updater 参考

Table 20. Ajax.PeriodicalUpdater 类

方法 类别 参数 描述
[ctor](container, url, options) constructor container:可以是元素的id, 也可以是元素自己, 或者可以是带有2个属性的对象 - object.success AJAX请求成功的时候用到的元素(或者id) 否则用到object.failure 中设定的元素(或id) ,url: 请求的url, options: AJAX 选项 创建一个用给定的选项请求给定的url的一个实例。
start() instance (none) 这个方法通常不会被外部调用。 对象为了开始周期性执行任务的时候调用的方法。
stop() instance (none) 这个方法通常不会被外部调用。 对象为了停止周期性执行任务的时候调用的方法。
updateComplete() instance (none) 这个方法通常不会被外部调用。 被当前的 Ajax.Updater 使用,当一次请求结束的时候,它被用作计划下一次请求。
onTimerEvent() instance (none) 这个方法通常不会被外部调用。当到下一次更新时被内部调用。

这个对象提供在操作DOM中元素时使用的功能性方法。

Table 21. Element 对象

方法 类别 参数 描述
toggle(elem1 [, elem2 [, elem3 [...]]]) constructor elemN: 元素对象或id 切换每一个传入元素的可视性。
hide(elem1 [, elem2 [, elem3 [...]]]) instance elemN: 元素对象或id 用设定它的 style.display 为 ’none’来隐藏每个传入的元素。
show(elem1 [, elem2 [, Slem3 [...]]]) instance elemN: 元素对象或id 用设定它的 style.display 为 ’’来显示每个传入的元素。
remove(element) instance element: 元素对象或id 从document对象中删除指定的元素。
getHeight(element) instance element: 元素对象或id 返回元素的 offsetHeight 。
addClassName( element, className) instance element: 元素对象或id, className: CSS类名 向元素的类名中加入给定的类名。
hasClassName( element, className) instance element: 元素对象或id, className: CSS类名 返回 true 如果元素的类名中含有给定的类名
removeClassName( element, className) instance element: 元素对象或id, className: CSS类名 从元素的类名中删除给定的类名。
cleanWhitespace( element ) instance element: 元素对象或id 删除该元素的所有只含有空格的子节点。

相关推荐

    mapstruct-1.3.1.Final-API文档-中文版.zip

    赠送jar包:mapstruct-1.3.1.Final.jar; 赠送原API文档:mapstruct-1.3.1.Final-javadoc.jar; 赠送源代码:mapstruct-1.3.1.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.3.1.Final.pom; 包含翻译后...

    mapstruct-1.3.1.Final-API文档-中英对照版.zip

    赠送jar包:mapstruct-1.3.1.Final.jar; 赠送原API文档:mapstruct-1.3.1.Final-javadoc.jar; 赠送源代码:mapstruct-1.3.1.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.3.1.Final.pom; 包含翻译后...

    jtds-1.3.1.jar包, kettle连接

    标题中的“jtds-1.3.1.jar包,kettle连接”指的是在Kettle数据集成工具中,为了能够连接到SQL Server数据库,需要使用名为jtds的Java数据库连接器(JDBC驱动),其具体版本为1.3.1。jtds是一个开源的JDBC驱动程序,...

    sqlserver驱动包 jtds-1.3.1.jar

    《SQLServer驱动包jtds-1.3.1.jar详解》 在数据库连接的世界里,SQL Server作为一款广泛使用的数据库管理系统,其高效稳定性和强大的功能深受开发者的喜爱。为了与Java应用程序进行交互,通常我们需要依赖数据库...

    Kettle SQL server驱动jtds-1.3.1.zip

    在IT领域,数据库连接是日常开发和数据处理中不可或缺的一部分。Kettle,也称为Pentaho Data Integration(PDI),是一款强大的ETL(提取、转换、加载)工具,它允许用户从各种数据源中提取数据并进行处理,然后将其...

    commons-fileupload-1.3.1.jar

    commons-fileupload-1.3.1.jar

    iceberg-spark-runtime-3.2-2.12-1.3.1.jar

    iceberg-spark-runtime-3.2_2.12-1.3.1.jar 实时数仓 数据湖

    androidx-core-1.3.1.aar

    androidx-core-1.3.1.aar

    nacos-server-1.3.1.tar.gz和zip两个版本

    这里提到的`nacos-server-1.3.1.tar.gz`和`nacos-server-1.3.1.zip`是Nacos的两种不同格式的发行版,分别对应Linux/Unix系统常用的tarball(tar压缩包)和通用的zip压缩格式。 1. **Nacos服务介绍** - Nacos作为...

    jtds-1.3.1.zip

    标题中的"jtds-1.3.1.zip"是一个包含特定版本(1.3.1)的JDBC驱动程序的压缩文件,主要用于连接SQL Server数据库。JDBC(Java Database Connectivity)是Java语言中用于与各种数据库进行交互的标准API。在本例中,...

    jquery-1.3.1.min.rar

    《jQuery 1.3.1.min.js:前端开发的强大工具》 jQuery,作为一款轻量级的JavaScript库,自诞生以来就深受开发者喜爱。这里我们关注的是jQuery的1.3.1.min版本,一个经过压缩优化的文件,名为"jquery-1.3.1.min.js...

    opus-1.3.1.tar.gz

    综上所述,"opus-1.3.1.tar.gz"是一个包含了Opus编码器最新版本源代码的压缩包,对于音频处理领域的开发者和研究者来说,这是一个重要的资源,他们可以借此深入了解Opus的工作原理,进行二次开发或优化。

    commons-cli-1.3.1-API文档-中文版.zip

    赠送jar包:commons-cli-1.3.1.jar; 赠送原API文档:commons-cli-1.3.1-javadoc.jar; 赠送源代码:commons-cli-1.3.1-sources.jar; 赠送Maven依赖信息文件:commons-cli-1.3.1.pom; 包含翻译后的API文档:...

    jtds-1.3.1.jar

    《Java连接Microsoft SQL Server驱动:jtds-1.3.1.jar详解》 在Java编程中,数据库连接是至关重要的部分,特别是对于那些需要处理大量数据或进行复杂查询的应用程序来说。Microsoft SQL Server作为一款广泛应用的...

    JMeterPlugins-ExtrasLibs-1.3.1.zip

    JMeterPlugins-ExtrasLibs-1.3.1.zip 解压后放入安装目录可解决,jmeter导入jmx文件报错:missing class com.thoughtworks.xstream.converters.ConversionException问题

    微信开发用到的jar包:json 解析,dom4j-1.6.1.jar,xstream-1.3.1.jar

    在微信开发过程中,经常会涉及到与服务器的交互,这时就需要用到JSON解析库、XML处理库等工具。以下是对标题和描述中提及的几个关键知识点的详细介绍: 1. JSON解析: JSON (JavaScript Object Notation) 是一种轻...

    qt-creator-linux-x86-opensource-1.3.1.bin

    qt-creator-linux-x86-opensource-1.3.1.bin

    svnant-1.3.1.rar

    【svnant-1.3.1.rar】是一个包含多个组件的压缩包,主要服务于Java开发中的构建工具Ant。Svnant是Subversion(SVN)与Ant集成的库,允许开发者在Ant构建脚本中执行Subversion命令。这个版本是1.3.1,包含了6个jar...

    termcap-1.3.1.tar.gz

    标题中的"termcap-1.3.1.tar.gz"是一个软件包,它是Termcap库的1.3.1版本,采用Unix/Linux系统中常见的tarball压缩格式。Termcap(终端能力库)是C语言编程中用于处理不同类型的文本终端的一个库,它允许程序在不...

    jquery-1.3.1.js

    《jQuery 1.3.1.js:Web开发中的强大工具》 jQuery,作为一款轻量级的JavaScript库,因其简洁的API和强大的功能而深受开发者喜爱。本文将深入探讨jQuery 1.3.1.js这一版本的核心特性、使用场景以及其在Web开发中的...

Global site tag (gtag.js) - Google Analytics