2006年04月29日

http://www.booodo.com 博读社区
好像事才开的,内容都比较新,聚合好像是采用服务器去聚合的,所以速和很快。

2006年02月20日

prototype.js开发笔记


覆盖版本 1.3.1

1. Prototype是什么?

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

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

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

2. 通用性方法

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

2.1. 使用 $()方法

$() 方法是在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字符串或者元素对象自己,这使得在创建可以传入任何形式参数的方法的时候, 它变得非常有用。

2.2. 使用$F()方法

$F()方法是另一个非常受欢迎的简写。它可以返回任何输入表单控件的值,如文本框或下拉框。 这个方法可以传入元素的id或者元素自己。

<script>
    function test3()
    {
        alert(  $F('userName')  );
    }
</script>

<input type="text" id="userName" value="Joe Doe"><br>
<input type="button" value=Test3 onclick="test3();"><br>

2.3. 使用Try.these()方法

Try.these() 方法使得实现当你想调用不同的方法直到其中的一个成功正常的这种需求变得非常容易, 他把一系列的方法作为参数并且按顺序的一个一个的执行这些方法直到其中的一个成功执行,返回成功执行的那个方法的返回值。

在下面的例子中, xmlNode.text在一些浏览器中好用,但是xmlNode.textContent在另一些浏览器中正常工作。 使用Try.these()方法我们可以得到正常工作的那个方法的返回值。

<script>
function getXmlNodeValue(xmlNode){
    return Try.these(
        function() {return xmlNode.text;},
        function() {return xmlNode.textContent;)
        );
}
</script>

3. Ajax 对象

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

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

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

3.1. 使用 Ajax.Request

如果你不使用任何的帮助程序包,你很可能编写了整个大量的代码来创建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,可以为truefalse 来决定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选项参考

3.2. 使用 Ajax.Updater

如果你的服务器的另一端返回的信息已经是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选项参考

4. prototype.js参考

4.1. JavaScript 类的扩展

prototype.js 包中加入功能的一种途径就是扩展已有的JavaScript 类。

4.2. 对 Object 类的扩展

Table 1. Object 类的扩展

方法 类别 参数 描述
extend(destination, source) static destination: 任何对象, source: 任何对象 用从 sourcedestination复制所有属性和方法的方式 来提供一种继承机制。
extend(object) instance 任何对象 用从传入的 object 中复制所有属性和方法的方式 来提供一种继承机制。

4.3. 对 Number 类的扩展

Table 2. Number 类的扩展

方法 类别 参数 描述
toColorPart() instance (none) 返回数字的十六进制描述, 当在HTML中转换为RGB颜色组件到HTML中使用的颜色。

4.4. 对 Function 类的扩展

Table 3. 对 Function 类的扩展

方法 类别 参数 描述
bind(object) instance object: 拥有这个方法的对象 返回预先绑定在拥有该函数(=方法)的对象上的函数实例, 返回的方法将和原来的方法具有相同的参数。
bindAsEventListener(object) instance object: 拥有这个方法的对象 返回预先绑定在拥有该函数(=方法)的对象上的函数实例, 返回的方法将把当前的事件对象作为它的参数。

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

<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>

4.5. 对 String 类的扩展

Table 4. String 类的扩展

方法 类别 参数 描述
stripTags() instance (none) 返回一个把所有的HTML或XML标记都移除的字符串。
escapeHTML() instance (none) 返回一个把所有的HTML标记回避掉的字符串。
unescapeHTML() instance (none) escapeHTML()相反。

4.6. 对 document DOM 对象的扩展

Table 5. document DOM 对象的扩展

方法 类别 参数 描述
getElementsByClassName(className) instance className: 关联在元素上的CSS类名 返回给定的具有相同的CSS类名的所有元素。

4.7. 对 Event 对象的扩展

Table 6. Event 对象的扩展

属性 类型 描述
KEY_BACKSPACE Number 8: 常量,退格(Backspace)键的代码。
KEY_TAB Number 9: 常量,Tab键的代码。
KEY_RETURN Number 13: 常量,回车键的代码。
KEY_ESC Number 27: 常量, Esc键的代码。
KEY_LEFT Number 37: 常量,左箭头键的代码。
KEY_UP Number 38: 常量,上箭头键的代码。
KEY_RIGHT Number 39: 常量,右箭头键的代码。
KEY_DOWN Number 40: 常量,下箭头键的代码。
KEY_DELETE Number 46: 常量,删除(Delete)键的代码。
observers: Array 缓存的观察者的列表,这个对象内部具体实现的一部分。

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>

4.8. 在 prototype.js中定义的新对象和类

另一个这个程序包帮助你的地方就是提供许多既支持面向对象设计理念又有共通功能的许多对象。

4.9. PeriodicalExecuter 对象

这个对象提供一定间隔时间上重复调用一个方法的逻辑。

Table 8. PeriodicalExecuter 对象

方法 类别 参数 描述
[ctor](callback, interval) constructor callback: 没有参数的方法, interval: 秒数 创建这个对象的实例将会重复调用给定的方法。

Table 9. PeriodicalExecuter 对象

属性 类型 描述
callback Function() 被调用的方法,该方法不会被传入参数。
frequency Number 以秒为单位的间隔。
currentlyExecuting Boolean 表示这个方法是否正在执行。

4.10. Prototype 对象

Prototype 没有太重要的作用,只是声明了该程序包的版本 。

Table 10. The Prototype object

属性 类型 描述
Version String 包的版本。
emptyFunction Function() 空方法对象。

4.11. Class 对象

在这个程序包中 Class 对象在声明其他的类时候被用到 。用这个对象声明类使得新类支持 initialize() 方法,他起构造方法的作用。

看下面的例子

//declaring the class
var MySampleClass = Class.create();
//defining the rest of the class implmentation
MySampleClass.prototype = {

   initialize: function(message) {
        this.message = message;
   },

   showMessage: function(ajaxResponse) {
      alert(this.message);
   }
};

//now, let's instantiate and use one object
var myTalker = new MySampleClass('hi there.');
myTalker.showMessage(); //displays alert

Table 11. Class 对象

方法 类别 参数 描述
create(*) instance (any) 定义新类的构造方法。

4.12. Ajax 对象

这个对象被用作其他提供AJAX功能的类的根对象。

Table 12. Ajax 对象

方法 类别 参数 描述
getTransport() instance (none) 返回新的XMLHttpRequest 对象。

4.13. Ajax.Base

这个类是其他在Ajax对象中定义的类的基类。

Table 13. Ajax.Base 类

方法 类别 参数 描述
setOptions(options) instance options: AJAX 选项 设定AJAX操作想要的选项。
responseIsSuccess() instance (none) 返回 true 如果AJAX操作成功,否则为 false
responseIsFailure() instance (none) responseIsSuccess() 相反。

4.14. Ajax.Request

继承自 Ajax.Base

封装 AJAX 操作

Table 14. Ajax.Request

属性 类型 类别 描述
Events Array static 在AJAX操作中所有可能报告的事件/状态的列表。这个列表包括: 'Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'
transport XMLHttpRequest instance 携带AJAX操作的 XMLHttpRequest 对象。

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请求状态改变的时候被这个对象自己调用。

4.15. options 参数对象

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,将避免访问频率变慢。

4.16. Ajax.Updater

继承自 Ajax.Request

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

Table 17. Ajax.Updater

属性 类型 类别 描述
ScriptFragment String static 可以判断是否为脚本的正则表达式。
containers Object instance 这个对象包含两个属性:AJAX请求成功执行的时候用到 containers.success , 否则的话用到 containers.failure

Table 18. Ajax.Updater

方法 类别 参数 描述
[ctor](container, url, options) constructor container:可以是元素的id, 也可以是元素自己, 或者可以是带有2个属性的对象 – object.success AJAX请求成功的时候用到的元素(或者id) 否则用到object.failure 中设定的元素(或id) ,url: 请求的url, options: AJAX 选项 创建一个用给定的选项请求给定的url的一个实例。
updateContent() instance (none) 这个方法通常不会被外部调用。 当响应到达的时候,被这个对象自己调用。 它会用HTML更新适当的元素或者调用在 insertion 选项中传入的方法-这个方法将被传入两个参数, 被更新的元素和响应文本。

4.17. Ajax.PeriodicalUpdater

继承自 Ajax.Base

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

Table 19. Ajax.PeriodicalUpdater

属性 类型 类别 描述
container Object instance 这个值将直接传入Ajax.Updater的构造方法。
url String instance 这个值将直接传入Ajax.Updater的构造方法。
frequency Number instance 两次刷新之间的间隔 (不是频率) ,以秒为单位。 默认2秒。 This 当调用 Ajax.Updater 对象的时候,这个数将和当前的 decay 相乘。
decay Number instance 重负执行任务的时候保持的衰败水平。
updater Ajax.Updater instance 最后一次使用的 Ajax.Updater 对象
timer Object instance 通知对象该下一次更新时用到的JavaScript 计时器。

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) 这个方法通常不会被外部调用。当到下一次更新时被内部调用。

4.18. Element 对象

这个对象提供在操作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 删除该元素的所有只含有空格的子节点。

4.19. Abstract 对象

这个对象是这个程序包中其他类的根。它没有任何属性和方法。在这个对象中定义的类可以被视为传统的抽象类。

4.20. Abstract.Insertion

这个类被用作其他提供动态内容插入功能的类的基类,它像一个抽象类一样被使用。

Table 22. Abstract.Insertion

方法 类别 参数 描述
[ctor](element, content) constructor element: 元素对象或id, content: 被插入的HTML 创建一个可以帮助插入动态内容的对象。

Table 23. Abstract.Insertion

属性 类型 类别 描述
adjacency String static, parameter 这个参数指定相对于给定元素,内容将被放置的位置。 可能的值是: 'beforeBegin', 'afterBegin', 'beforeEnd', 和 'afterEnd'.
element Object instance 与插入物做参照元素对象。
content String instance 被插入的 HTML 。

4.21. Insertion 对象

这个对象是其他类似功能的根。它没有任何属性和方法。在这个对象中定义的类仍然可以被视为传统的抽象类。

4.22. Insertion.Before

继承自 Abstract.Insertion

在给定元素开始标记的前面插入HTML。

Table 24. Insertion.Before

方法 类别 参数 描述
[ctor](element, content) constructor element: 元素对象或id, content: 被插入的HTML 继承自 Abstract.Insertion. 创建一个可以帮助插入动态内容的对象。

下面的代码

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>

<script> new Insertion.Before('person', 'Chief '); </script>

将把 HTML 变为

<br>Hello, Chief <span id="person" style="color:red;">Wiggum. How's it going?</span>

4.23. Insertion.Top

继承自 Abstract.Insertion

在给定元素第一个子节点位置插入 HTML。内容将位于元素的开始标记的紧后面。

Table 25. Insertion.Top

方法 类别 参数 描述
[ctor](element, content) constructor element: 元素对象或id, content: 被插入的HTML 继承自 Abstract.Insertion. 创建一个可以帮助插入动态内容的对象。

下面的代码

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>

<script> new Insertion.Top('person', 'Mr. '); </script>

将把 HTML 变为

<br>Hello, <span id="person" style="color:red;">Mr. Wiggum. How's it going?</span>

4.24. Insertion.Bottom

继承自 Abstract.Insertion

在给定元素最后一个子节点位置插入 HTML。内容将位于元素的结束标记的紧前面。

Table 26. Insertion.Bottom

方法 类别 参数 描述
[ctor](element, content) constructor element: 元素对象或id, content: 被插入的HTML 继承自 Abstract.Insertion. 创建一个可以帮助插入动态内容的对象。

下面的代码

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>

<script> new Insertion.Bottom('person', " What's up?"); </script>

将把 HTML 变为

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going? What's up?</span>

4.25. Insertion.After

继承自 Abstract.Insertion

在给定元素结束标记的后面插入HTML。

Table 27. Insertion.After

方法 类别 参数 描述
[ctor](element, content) constructor element: 元素对象或id, content: 被插入的HTML 继承自 Abstract.Insertion. 创建一个可以帮助插入动态内容的对象。

下面的代码

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>

<script> new Insertion.After('person', ' Are you there?'); </script>

将把 HTML 变为

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span> Are you there?

4.26. Field 对象

这个对象提供操作表单中的输入项目的功能性方法。

Table 28. Field 对象

方法 类别 参数 描述
clear(field1 [, field2 [, field3 [...]]]) instance fieldN: 元素对象或id 清除传入表单中项目元素的值。
present(field1 [, field2 [, field3 [...]]]) instance fieldN: 元素对象或id 只有在所有的表单项目都不为空时返回 true
focus(field) instance fieldN: 元素对象或id 移动焦点到给定的表单项目。
select(field) instance fieldN: 元素对象或id 选择支持项目值选择的表单项目的值。
activate(field) instance fieldN: 元素对象或id 移动焦点并且选择支持项目值选择的表单项目的值。

4.27. Form 对象

这个对象提供操作表单和他们的输入项目的功能性方法。

Table 29. Form 对象

方法 类别 参数 描述
serialize(form) instance form: 表单元素或id 返回url参数格式的项目名和值的列表, 如'field1=value1&field2=value2&field3=value3'。
getElements(form) instance form: 表单元素或id 返回包含所有在表单中输入项目的 Array 对象。
getInputs(form [, typeName [, name]]) instance form: 表单元素或id, typeName: 输入项目的类型, name: 输入项目的名称 返回一个 Array 包含所有在表单中的 <input> 元素。 另外, 这个列表可以对元素的类型或名字属性进行过滤。
disable(form) instance form: 表单元素或id 使表单中的所有输入项目无效。
enable(form) instance form: 表单元素或id 使表单中的所有输入项目有效。
focusFirstElement(form) instance form: 表单元素或id 激活第一个表单中可视的,有效的输入项目。
reset(form) instance form: 表单元素或id 重置表单。和调用表单对象的 reset() 方法一样。

4.28. Form.Element 对象

这个对象提供表单对象中的可视和非可视元素的功能性方法。

Table 30. Form.Element 对象

方法 类别 参数 描述
serialize(element) instance element: 表单元素或id 返回元素的 名称=值 对, 如 'elementName=elementValue'。
getValue(element) instance element: 表单元素或id 返回元素的值。

4.29. Form.Element.Serializers 对象

这个对象提供了内部使用的用来协助解析出表单元素的当前值功能性方法。

Table 31. Form.Element.Serializers 对象

方法 类别 参数 描述
inputSelector(element) instance element: 一个带有checked属性的表单元素或id, 如 radio 或 checkbox。 返回带有元素名称和值的 Array , 如 ['elementName', 'elementValue']
textarea(element) instance element: 一个带有value属性的表单元素或id, 如 textbox, button 或 password 项目。 返回带有元素名称和值的 Array , 如 ['elementName', 'elementValue']
select(element) instance element: 一个<select> 元素对象或id。 返回带有元素名称和所有被选择的选项的值或文本的 Array , 如 ['elementName', 'selOpt1 selOpt4 selOpt9']

4.30. Abstract.TimedObserver

这个类是用于其它监听一个元素的值(或者任何类中涉及的属性)变化的类的基类,这个类像一个抽象类一样被使用。

子类可以被创建来监听如输入项目值,或style属性,或表格的行数,或者其他任何对跟踪变化相关的东西。

子类必须实现这个方法来决定什么才是被监听的元素的当前值。

Table 32. Abstract.TimedObserver

方法 类别 参数 描述
[ctor](element, frequency, callback) constructor element: 元素对象或id, frequency: 以秒为单位的间隔, callback: 当元素改变的时候调用的方法。 创建一个监听元素的对象。
registerCallback() instance (none) 这个方法通常不会被外部调用。 被这个对象自己调用来开始监听那个元素。
onTimerEvent() instance (none) 这个方法通常不会被外部调用。 被这个对象自己调用来周期性的检查那个元素。

Table 33. Abstract.TimedObserver

属性 类型 描述
element Object 被监听的元素对象。
frequency Number 每次检查中的以秒为单位的时间间隔。
callback Function(Object, String) 只要元素改变这个方法就会被调用。 会接收到元素对象和新值作为参数。
lastValue String 元素被核实的最后一个值。

4.31. Form.Element.Observer

继承自 Abstract.TimedObserver

Abstract.TimedObserver 的一个实现类用来监听表单输入项目的值的变化。当你想监听一个没有带报告值变化事件的元素的时候使用这个类。否则的话使用 Form.Element.EventObserver 类代替。

Table 34. Form.Element.Observer

方法 类别 参数 描述
[ctor](element, frequency, callback) constructor element: 元素对象或id, frequency: 以秒为单位的间隔, callback: 当元素改变的时候调用的方法。 继承自 Abstract.TimedObserver. 创建一个监听元素值属性的对象。
getValue() instance (none) 返回元素的值。

4.32. Form.Observer

继承自 Abstract.TimedObserver

Abstract.TimedObserver 的一个实现类用来监听表单中任何数据项的值的变化。当你想监听一个没有带报告值变化事件的元素的时候使用这个类。 否则的话使用类Form.EventObserver 代替。

Table 35. Form.Observer

方法 类别 参数 描述
[ctor](form, frequency, callback) constructor form: 表单对象或id, 继承自 Abstract.TimedObserver. 创建一个监听表单变化的对象。
getValue() instance (none) 返回所有表单数据的一系列值。

4.33. Abstract.EventObserver

这个类被用作其他一些类的基类,这些类具有在一个元素的值改变事件发生的时候执行一个回调方法这样的功能。

Abstract.EventObserver 的多个对象可以绑定到一个元素上,不是一个帮其他的擦出了,而是按照他们付给元素的顺序执行这些回调方法。

单选按钮和复选框的触发事件是 onclick ,而文本框和下拉列表框/下拉列表框的是 onchange

子类必须实现这个方法来决定什么才是被监听的元素的当前值。

Table 36. Abstract.EventObserver

方法 类别 参数 描述
[ctor](element, callback) constructor element: 元素对象或id, callback: 当事件发生的时候调用的方法。 创建监听元素的对象。
registerCallback() instance (none) 这个方法通常不会被外部调用。 被对象调用来把自己绑定到元素的事件上。
registerFormCallbacks() instance (none) 这个方法通常不会被外部调用。 被对象调用来把自己绑定到表单中的每一个数据项元素的事件上。
onElementEvent() instance (none) 这个方法通常不会被外部调用。 将被绑定到元素的事件上。

Table 37. Abstract.EventObserver

属性 类型 描述
element Object 被监听的元素对象。
callback Function(Object, String) 只要元素改变就调用的方法。会接收到元素对象和新值作为参数。
lastValue String 元素被核实的最后一个值。

4.34. Form.Element.EventObserver

继承自 Abstract.EventObserver

Abstract.EventObserver 的一个实现类,它在监测到表单中数据项元素的值改变的相应事件时候执行一个回调方法。 如果元素没有任何报告变化的事件,那么你可以使用 Form.Element.Observer 类代替。

Table 38. Form.Element.EventObserver

方法 类别 参数 描述
[ctor](element, callback) constructor element: 元素对象或id, callback: 当事件发生的时候调用的方法。 继承自 Abstract.EventObserver。 创建一个监听元素值属性的对象。
getValue() instance (none) 返回元素的值。

4.35. Form.EventObserver

继承自 Abstract.EventObserver

Abstract.EventObserver 的一个实现类,监听表单对象中包含的任何对象的任何变化,用元素的事件检测值的变化。如果元素没有任何报告变化的事件, 那么你可以使用Form.Observer 类代替。

Table 39. Form.Element.EventObserver

方法 类别 参数 描述
[ctor](form, callback) constructor form: 元素对象或id, callback: 当表单中任何数据项改变的时候调用的方法 继承自 Abstract.EventObserver。 创建一个监听元素值属性的对象。
getValue() instance (none) 返回所有表单数据的一系列值。

4.36. Position 对象 (预备文档)

这个对象提供许多和元素位置相关的方法。

Table 40. Position 对象 (预备文档)

方法 类别 参数 描述
prepare() instance (none) 调整 deltaXdeltaY 属性来协调在滚动位置中的变化。 记得在页面滚动之后的任何调用的withinIncludingScrolloffset 之前调用这个方法。
realOffset(element) instance element: 对象或id 返回这个元素的正确滚动偏差的 Array 对象, 包括所有影响元素的滚动偏差。结果数组类似 [total_scroll_left, total_scroll_top]
cumulativeOffset(element) instance element: 对象或id 回这个元素的正确滚动偏差的 Array 对象, 包含任何被放置的父元素强加偏差。结果数组类似 [total_offset_left, total_offset_top]
within(element, x, y) instance element: 对象, xy: 一个点的坐标 测试给定的点的坐标是否在给定的元素的外部矩形范围之内。
withinIncludingScrolloffsets(element, x, y) instance element: object, x and y: coordinates of a point  
overlap(mode, element) instance mode: 'vertical' 'horizontal', element: 对象 在调用这个方法之前需要调用within() 。这个方法返回0.0到1.0之间的数字,来表示坐标在元素重叠的分数。 举个例子,如果元素是一个边长是100px的正方形的DIV,并且位于(300, 300), 然后 within(divSquare, 330, 330);overlap('vertical', divSquare); 会返回 0.10,意思是那个点位于DIV顶部边框以下 10% (30px) 的位置上。
clone(source, target) instance source: 元素对象或 id, target: 元素对象或id 改变目标元素的大小尺寸和位置与源元素的相同。

如果你发现错误,过失或信息不完全,或平淡无意义的东西,请 通知作者 ,作者会尽可能快的修正它,作者仍然在写其他没写的类,来保持一致。 任何翻译的过失,不足,词不达意,表达含糊等请通知我,我会再加斟酌,找到合适的描述。

2006年02月07日
联盟及中立阵营声望攻略

1、主城声望
  部落和联盟方的各大主城声望是最容易提升的一种。自玩家出生后,凡在主城区域内的任务,完成后都获得一定的声望,这些任务高级低级的都有,当然完成得越多,自身等级与任务等级越接近越好。
  而另一个提升声望的好办法,就是在各大主城裁缝店找军需官交谈,然后捐献需要的布匹,可以持续增加该城的声望。如果你等级在50以上,你在军需官那儿一开始可以接到3个任务,分别是要你捐60个毛料、丝绸、魔纹布。只有在你完成了这3个任务以后,才能获得第4个任务,捐献60符文布。此后,你可以获得任务“更多的符文布”,每次需要捐献20符文布,获得50声望。
  以上是针对所有种族而言的通用任务,而人类则因为有特殊的种族天赋,从出生开始,就比其他种族更容易获得声望点数,因些想做全能型的角色,所有阵营声望全满,对人类来说可能会更容易些。
  几大主城相较而言,雷霆崖和达纳苏斯两地由于拥有各类高级技能师而格外重要,所以这两个地方也设置和特殊的声望任务——晨光麦。

  这是个系列任务,需要做完前2步后才能接到可重复完成的第3个任务。晨光麦的来源,是用任务道具混合在安戈洛环形山找到的安戈洛的泥土,随机制作产生。安戈洛的泥土可以通过打怪掉落,也可以在地上的小土堆里采集到。
  不过总的来说,还是交布料最简单,推荐。下面是每一级声望的大概需要的符文布数量:
  友好到尊敬:2400
  尊敬到崇敬:4800
  崇敬到崇拜:8400
  如果你是人类,需要的数量会少9%。
  此外,战场声望达到崇拜后,继续参战可以提高各种族声望,如联盟方雷矛声望提高,4大主城的声望也会提高。

2、地精与血帆海盗方面
  加基森、棘齿城、永望镇、藏宝海湾这四座中立阵营城镇,是地精的家园,通过完成散落在各处的地精们给予的任务,都可以提升这四个地点的声望。同时,猎杀各种与地精对立的海盗(例如南海海盗、血帆海盗)以及风险投资公司的NPC,也可以提升这四个城镇的声望。
  作为一个地精们仇恨的重要势力,血帆海盗对玩家声望的快速提升可谓大有帮助,但是,同样血帆海盗与玩家间也存在着声望关系,有些人并不注意这一点,所以往往白做了很多的功。下面就着重说说这点。
  首先要清楚血帆海盗的仇家,黑水海盗。杀这些海盗会提升在血帆海盗中的声望,但同时也会减少地精所有势力的声望,主要是减少藏宝海湾的声望。所以如果你希望提升藏宝海湾的声望,就少惹黑水海盗了。部分中立发区有地精守卫,猎杀他们,也会提升血帆海盗的声望,但是所有地精都会开始讨厌你的。
  提升地精声望的势力时,猎杀南海海盗主要提升加基森声望;猎杀风险投资公司会提升藏宝海湾的声望;猎杀血帆海盗也是主要提升藏宝海湾声望。
  总的来说,无等级差别(非灰)时,猎杀1个NPC可以获得5点主要势力声望,非主要相关势力给1点。有等级差别(已灰)时,1个给1点声望。60级去杀地精守卫的话,1只给25点血帆海盗声望。
  当血帆海盗的声望达到友善,在藏宝海湾西侧的血帆营地,就是帅小伙子邓肯那里,你可以获得第一个跑腿任务,任务名叫“嘿,水手!”。完成任务的NPC在藏宝海湾东南的海盗船队两个很近的船上,名字叫“舰队指挥官菲尔拉伦”,他会给你第二个任务“敬礼,舰队司令!”。这是个猎杀目标型的任务,两个任务目标分别是大财主里维加兹和舰队指挥官卡拉·海角,都是60级地精,就在部落分行点左转的船屋上面,他们的战斗力很弱,还不会协力攻击。唯一麻烦的就是中途会引来4个左右的地精守卫。如果是自己单打独斗的话,估计要死两回,如果是找几个人帮忙就会非常容易,任务奖励一顶非常拉风的船长帽子(布甲,全职业装备),帽子可以召唤一只鹦鹉。

3、军队方面
  战场一直是大家获得荣誉的主要途径,在战歌峡谷和奥特兰克山谷这两个战场里做任务,就可以提升相应声望。别人交任务时,你也会获得声望,同时,战场胜利会得到声望。拥有一定的声望,就能够买到相应的物品,在战场门口军需官那里可以察看。通常达到崇拜声望后都有不错的紫装,一点不比几大副本刷来的职业套装差,如果你厌烦了无穷无尽的副本,战场也是个获得装备的好选择。1.7版以后有战场节日设定,在周末时间进战场获得的声望会增加,暴雪也有计划将战场逐步完善,相信以后的战场会更加精彩,而不是单纯的刷荣誉。

4、吉尔吉斯半人马与玛格拉姆半人马
  在凄凉之地,半人马内部正发生大混战,其中两个部族吉尔吉斯半人马与玛格拉姆半人马之间情绪更加紧张。残酷的屠杀在双方间展开,而做为玩家的你,很有趣的可以同时领取到与双方修好的任务。但是,你只能选择与其中一方保持友善关系,从此,你获得的任务都是屠杀另外一方的半人马甚至是首领的工作。猎杀掉其中一方的半人马部族,就可以提升与另一方的声望,而被猎杀方的声望降低。
  这里的任务适合35级左右的玩家进行,有2个大系列任务,可选择其一。理论上可以先完成一大系列,再去提升另一个半人马势力的声望,但是笔者尝试后发现,声望达到友善后就不能够攻击了,而且,友善度越高另一方的仇恨度也越大,所以从难度及任务奖励上说,只选择其一就好。任务奖励普通装备,对玩家升级获取经验还是很有帮助的,大家可以在级低时来此娱乐一下。

5、塞纳里奥议会
  相信德鲁依玩家不会陌生,通过完成月光林地的相关任务,后期玩家可以在希利苏斯接到关于研究虫子的任务,还有一些费伍德森林的任务,可以提升塞纳里奥议会的声望。1.8版本中开放了大量希利苏斯地区的新任务,塞纳里奥要塞为玩家提供全新的、部落和联盟共有的系列任务,可供单人或五人小队完成,这些任务的装备奖励可以说是相当不错。
  玩家可反复完成某些任务,提高自己在塞纳里奥要塞中的声望,而在塞纳里奥议会中的声望达到一定程度之后,塞纳里奥议会也将给那些声明显赫的冒险者提供全新的裁缝、铁匠和高级制皮(龙鳞、异种护甲等)专业技能配方。

6、辛德拉
  完成厄运之槌的相关任务,可提升辛德拉精灵的声望。目前可能尚未开放可重复完成的任务,1.7版本中这也是个神秘的阵营。

7、恶齿巨魔/蛮锤部落
  完成辛特兰的恶齿村(鹰巢山)的相关任务,可提升恶齿巨魔(蛮锤部落)的声望。联盟方有收集项链任务可以无限提高声望,满足声望条件后,在势力范围内被攻击NPC就会出来帮忙。目前没发现声望提高后有什么其他好处,可能将来会开放。辛特兰联盟和部落的斗争也很残酷,因为在祖尔祭坛上有祖尔副本的锤子,还有后期神庙哈卡的任务也要在这完成,所以外出建议结伴而行,而提高声望获得野外的NPC盟友也是件不错的事情。

8、海达希亚水元素
  在艾萨拉东南方海边(79,74)有个小岛,上面的海达克西斯公爵给的系列任务,做任务就可提升声望。通过猎杀希利苏斯的西北角的土元素和风元素,以及燃烧平原的石元素,可以提升水元素的声望(可一直提升到尊敬,60级去杀1只给5点声望)。杀死熔火之心(MC)副本中的各个怪也是如此。
  当你完成如下系列任务:
  [56]被囚禁的水元素
  [57]雷暴和磐石
  [60]艾博希尔之眼[团队]
  [60]熔火之心[团队]
  并且声望达到尊敬,可接到如下系列任务:
  [60]海达克西斯的使者
  [60]敌人之手[团队]
  [60]英雄的奖赏
  完成这些任务的目的不是为了任务奖励,更重要的是,不完成的话,海达克西斯公爵是不会给你用于熄灭熔火之核内的各个火盆的任务道具水,不做这个任务,是见不到MC里第9号和第10号BOSS的。
  艾萨拉在1.7版本变得更加热闹了,新开的50级职业任务要在这里完成,原本很多没来过的玩家对这里慢慢熟悉了起来,加上不时的联盟和部落大工会在这里争夺蓝龙BOSS,相信斗争也会越来越精彩。

9、木喉熊怪
  该势力分布在费伍德森林的木喉要塞(就是连接月光林地和冬泉谷的通道)以及艾萨拉北部。许多首次通过木喉要塞的玩家,都不明就里一路杀将过去,孰不知这大大伤害了熊怪兄弟们的感情,以后他们所兜售的好东东,也不会给你看到了。所以,想通过木喉要塞,最重要的是不要滥杀无辜,而是要先做木喉熊怪的声望任务!
  费伍德森林北部木喉要塞入口旁边的格拉兹,会给一个[48]木喉熊怪的盟友的任务,这个任务可以重复,交完任务后会提升木喉熊怪的声望。当然,在费伍德森林这块联盟和部落必经之地上,做任务的难度是很高的,尤其是死木营地在地图最南端,而交任务的地点却在地图最北端,任何人来到这里,都会郁闷很久,如果不希罕木喉兜售的物品,只是想通过甬道,只要把木喉熊怪的声望提升到冷淡级别就可以了,根据你之前是否对木喉熊怪有攻击行为,大约要做两到三次最多六七次任务就可以。而第一个任务,要达到中立后才会出现。
  完成上述任务多次之后,格拉兹会再给一个[48]北方的死木熊怪的新任务,这次的任务目标在旁边的魔爪村。
  木喉要塞冬泉谷入口的萨尔法,会给你一个任务[56]冬泉熊怪的活动,条件是木喉声望已经达到中立。这个任务也可以重复完成,第一次会获得经验和钱。
  通过杀死木熊怪和冬泉熊怪,每只给5点声望;费伍德森林西南的死木村,杀死主宰洛尔可以获得25点声望;费伍德森林东北的魔爪村,杀死血喉酋长可以获得25点声望;另外,冬泉谷西侧的冰火温泉和木喉岗哨的53~56级冬泉熊怪,还有冬泉谷东部的寒水村56~59级冬泉熊怪,猎杀它们都可以提高木喉熊怪的声望。
  与木喉熊怪声望达到尊敬的50%后,杀普通的死木熊怪或冬泉熊怪都无法再获得声望。通过反复完成任务[56]冬泉熊怪的活动和猎杀冬泉谷寒水村的酋长可以继续提高声望。
  声望达到友善后,玩家可在木喉要塞中的梅罗什(白色熊怪)处进行大师级裁缝的训练,并可以购买裁缝用品。声望尊敬后,可以在木喉要塞中的独眼高恩(黑色熊怪)处购买到两种独特的道具,在梅罗什处购买配方。
  同时,声望友善时,在木喉要塞中的梅罗什处,同样可以交30块符文布来提高声望。第一次做的奖励还有影皮护肩或钢鳞护手二选一。

10、银色黎明
  该势力许多地方都有,黑暗深渊里有,凄凉之地有,联盟那边接触最早,暗夜主城达纳苏斯里就有,不过主要是分布在提瑞期法林地、西瘟疫之地和东瘟疫之地的3个营地里。通过完成银色黎明势力交给的许多任务,可以提升声望。特别是西瘟疫的银色黎明委任徽章任务,可以带上饰品,杀西瘟疫和东瘟疫两地的亡灵天灾,就可以不断呈交爪牙的天灾石、侵略者的天灾石、堕落者的天灾石,来提升声望。这些东西基本上爆率很高,小怪、精英怪、地区首领、BOSS级怪,都会掉落。交过任务后,会获得银色黎明徽章,使用后提高少许声望,通常一直进这两个副本就可以很方便的提升声望了。
  此外,西瘟疫之地的四口瘟疫之锅,这个系列任务也有玄妙,许多人往往容易忽视。其实,在做这四口锅的任务时,并不是拿到钥匙开了锅就结束了。联盟方可以回来与银色黎明营地的化学家阿尔比顿交谈(部落也有相应NPC),选择制造放大镜的一项,只要放在包里,以后猎杀瘟疫之地的各种亡灵天灾,都可能获得可以获得炸锅的媒介物质。询问阿尔比顿四口锅的奥秘,你可以了解到炸锅需要的具体材料,1奥术催化剂、4符文布、20或30个不同的媒介物。需要注意的是,奥术催化剂有一定的活化时间,购买后大概20分钟就会消失掉,所以,一定要在20分钟内凑足炸锅的材料,否则就要浪费钱财了。
  坐落在西瘟疫之地的四口大锅,费尔斯通农场的瘟疫之锅、达尔松之泪的瘟疫之锅、嚎哭鬼屋的瘟疫之锅、盖罗恩农场的瘟疫之锅,可以反复炸,炸一次都会提高银色黎明声望少许。所以边练级边收集材料做任务,是非常方便快捷的提升声望的方式了。
  声望到达崇敬后,NPC会给你一个任务,用若干银色黎明徽章换取给护肩+5点任一抗性的一次性物品。声望崇拜后,会得到另一个任务,用若干银色黎明徽章换取给护肩+5点所有抗性的一次性物品。声望高了,更可以在银色黎明NPC处购买到许多珍贵的配方,1.7版本后,即使声望不够的玩家也能够浏览这些物品,真是谗人哦~

11、瑟银兄弟会
  瑟银兄弟会是一个由精英工匠们组成的组织,当你和他们的声望达到了一定程度后,有机会从他们那里获得许多精良甚至史诗的配方。这些工匠们原本属于黑铁矮人,但是他们离开了黑石深渊并开始探索这个世界。所有的种族和他们的声望都从中立开始。瑟银兄弟会在灼热峡谷有一个基地瑟银哨塔,在那里你可以接到一些48~52级的任务,完成每个任务最多可以增加100点声望。任务相对都很简单,也建议50左右的玩家来这里升级。
  在完成了“绝密配方!”这个任务后,就可以做一个重复任务“炽热助熔剂的补给”,通过反复交纳所需的材料,便可以提升声望。改版以前,只有一种组合方式,而1.7版之后,材料组合增加到了三种。分别是:
  ①2个熏火龙鳞片、4个皇血草、一个煤块
  ②2个熏火龙鳞片、4个铁锭、一个煤块
  ③2个熏火龙鳞片、10个重皮、一个煤块
  熏火龙的鳞片任务,可以在黑铁矮人的洞里找到熏火龙,基本上每只都有掉落。煤块在大铁匠博恩奈特处就有出售。
  在这里铁匠们还可以通过加基森的君王系列图纸任务,来提高瑟银兄弟会声望,相对有些优势。此任务图纸一共7张,全部用瑟银来交换,没有经验,但是会获得一定的声望。
  声望达到友好之后,就可以上交给大铁匠博恩奈特黑铁残油来换取声望了。每4个黑铁残油增加25点声望,一直可以达到尊敬。在声望尊敬后,博恩奈特会提示你去找黑石深渊里的罗克图斯暗契获得进一步的声望提升。
  位于黑石深渊酒吧中的NPC罗克图斯暗契,会给予5个可重复完成任务如下:
  ①兄弟会的好感-黑铁矿石:
  10个黑铁矿石(50点声望)
  1.7新增野外黑铁矿刷新点,有很多,集中在灼热峡谷和燃烧平原
  ②兄弟会的好感-山脉之血:
  1个山脉之血(200点声望)
  在黑铁矿脉中可以挖到,几率约0.5%,另处熔火之心岩浆破坏者掉落,几率约5%
  ③兄弟会的好感-熔火犬皮:
  2个熔火犬皮(150点声望)
  这个任务需要剥皮技能315点,然后在熔岩之心的狗身上取得,使用“芬克的剥皮刀”可加10点剥皮技能,另外再附魔手套+5点,成功几率100%。
  ④兄弟会的好感-熔岩之核:
  1个熔岩之核(200点声望)
  熔火之心火类怪掉落,几率约10%~20%
  ⑤兄弟会的好感-炽热之核:
  1个炽热之核(200点声望)
  熔火之心火类怪掉落,几率约10%~20%
  顺便交代一下黑铁锭的任务。
  熔炼黑铁的任务来自于格鲁雷尔,这个NPC位于黑石深渊的“如唤者之墓”。这个地方在副本的最终国王BOSS之前,酒吧之后,一个有7个灵魂站在四周守着房间,格鲁雷尔在右手第二个。你需要给他20个金锭、2个红宝石、10个真银锭来学会如何将8个黑铁矿石熔炼成为一个黑铁锭(交任务的地方,就在格鲁雷尔身边的一个透明的石坐上)。黑铁锭的熔炼只有在黑铁炉上进行。务必在杀死7个灵魂开门前完成这个任务。
  接下来,你就可以熔炼黑铁锭了,你还要找到黑铁熔炉来熔黑铁。黑铁熔炉位于黑石深渊(BRD)的深处——熔火之心(MC)的深渊入口。就在杀死7人后,进入枪手大厅前,右手边的一条路(也就是做“熔火之心传送门”的地方)。这条路有个小分支(左),可以直接看到熔炉。

12、暗月马戏团
  1.7版本中,联盟的老家暴风城外,到来了一群神秘客人,他们是名为“暗月马戏团”的组织,部落和联盟都因为对他们产生极大的好奇,而使暴风城周边变的腥风血雨。完成暗月马戏团NPC的相关任务,可提升暗月马戏团的声望。
  在三大副本的BOSS和普通50级精英怪身上,玩家有机会打到暗月套牌卡片的一些组成部分,这套牌一共有四组,各八张。据说,收集齐八张一套的暗月套牌后,可以换取极品饰物。
  目前已知饰物有以下四种:
  英雄:督军系列套卡换取,有几率在肉博战中受攻击时治愈120~180点伤害;
  大漩涡:元素系列套卡换取,有几率对肉博对象造成200~300自然伤害(闪电);
  蓝龙:野兽系列套卡换取,在成功施放法术后有2%几率可以触发15秒100%魔法恢复。
  不过此任务与声望似乎无多大关系,我们来看看加声望的部分。
  与其中的占卜师塞格交谈,他会提一些思考题让你回答,然后算出你的命运,每过几小时可以再占卜一次。根据不同的答案,他会给你不同的暗月塔罗牌,上面记载了各种诗句,据说其中的#25号是一个10级任务,在衰嚎洞穴中完成。占卜完毕后,他还会送出一个祝福——塞塔的黑暗塔罗牌力量(随机),效果为某种属性提高10%,持续2个小时(答案不同祝福内容不同)。
  暗月这里可重复完成的声望任务,有两个。
  亚布·尼比盖尔的狩猎任务,杀不同的野兽,然后收集它们的肢体,可以兑换不同数量的暗月马戏团奖券,并同时提高声望。
  毛茸茸的小爪子5个,杀死贫瘠之地或黑海岸的猎豹类生物后有几率获得。
  破损的熊皮5个,杀死灰谷或希尔布莱德丘陵的熊类生物后有几率获得。
  柔软的狼尾5个,杀死凄凉之地或荒芜之地的狼类生物后有几率获得。
  鲜艳的羽毛5个,杀死45级以上的鸟类生物后有一定几率获得,如塔纳利斯沙漠的火鹏。
  邪恶的蝙蝠眼10个,杀死东瘟疫之地的蝙蝠类生物后有一定几率获得。
  如果是学锻造和采矿的人,可以在克莉·希克斯这里接受一些兑换奖券的任务。锻造的人可以用粗制平衡石、绿铁护腕、黑色巨型锤和致密砂轮等物品与她兑换暗月马戏团奖券。其中8个致密砂轮可以兑换20张暗月马戏团奖券,同时提高声望。
  使用奖券,可以在兑换礼品的吉瓦斯·格里加特那里,购买到史诗级的物品,当然,前提是你的声望要满足条件,或者你的奖券足够多。
  另外,这里有个隐藏任务,有个叫摩尔亚的NPC一直在找他的宠物加布加布,并说这只青蛙爱喝黑铁啤酒(黑石深渊酒吧贩卖)。用三个酒杯就可以把它引到主人身边,然后再用一个酒杯就可以换到青蛙卵,不知道宠物收集狂有没有兴趣。马戏团里还有个跑来跑去的小男孩里克,只要你能抓住他,可以看看他出售的一些娱乐物品。
  重皮球:可以丢给其他玩家,用来娱乐。
  树蛙盒:召唤一只树蛙宠物,他还卖限量的脆皮树蛙宠物。

13、阿拉索联军
  这是1.7新增的战场副本,可以从主城的战场指挥官直接进入,输赢都会有荣誉声望(根据资源多少)。胜利后会获得名为阿拉索资源补
以重复做来提高声望。这个战场对级别限制不严,胜利一次交一个物品会获得3300值经验奖励,根据不同职业,所能购买的装备也不一样,可以在军需官那里浏览。

14、赞达拉部族
  1.7新增的阵营,在荆棘谷祖尔格拉布副本杀怪和获得物品都会增加相应声望。他们比较崇拜勇猛的人,凡是在祖尔格拉布中浴血奋战的勇士们,都会获得声望提升的奖励。如果有人能取得祖尔格拉布的权力珍宝,那么就会更加受到赞达拉部族的欢迎。
  权力珍宝有许多等级,从绿色的各部族硬币到蓝色的各色宝石,以及最为珍贵的紫色原始哈卡莱各部护具……根据赞达拉职业导师的任务要求去收集权力珍宝吧!每个职业的勇士都会获得1套史诗级的套装作为奖励。
  玩家可以和一个名叫赞达拉部落的新势力修好,获得丰厚的奖励,这个新的名叫尤亚姆巴岛的小岛坐落在暗礁海的西北方,无数新任务在这里等待着你!岛上有个叫商人林沃斯的NPC,贩卖各种图样和配方,需要友善以上的声望。十分不错哦,新装备除了普通材料以外,需要副本中的一些矿产,大家赶紧努力吧。

15、拉文霍德
  这个势力对于盗贼应该不会陌生,在南海镇上方,鹰巢山的左边山谷里,是个刺客联盟,偷敌对的刺客联盟徽章,就可以把声望加到友善。目前1.7中会有新的盗贼职业任务出现。奖励也十分不错。

目前已知的具有声望关系的阵营有:


部落方面 联盟方面 崇拜:21000声望值
热砂港 热砂港   最高声望等级,可购买或取得特殊物品,折扣20%。
加基森 加基森
棘齿城 棘齿城
永望镇 永望镇 崇敬:12000声望值
藏宝海湾 藏宝海湾   为特殊英雄声望等级,可购买特殊物品。
奥格瑞玛 暴风城
幽暗城 达纳苏斯
雷霆崖 铁炉堡 尊敬:6000声望值
暗矛巨魔 诺莫瑞根流亡者   购买商人物品有10%折扣。
部落军队 联盟军队 友好:3000声望值
战歌氏族 银翼要塞   属于玩家所在阵营的标准声望。
霜狼氏族 雷矛卫队
阿拉索联军 阿拉索联军
其它 其它 中立:0声望值
吉尔吉斯半人马 吉尔吉斯半人马   不属于玩家所在阵营的标准声望。
塞纳里奥议会 塞纳里奥议会
木喉熊怪 木喉熊怪
海达希亚水元素 海达希亚水元素 冷淡:-3000声望值
玛格拉姆半人马 玛格拉姆半人马   无法购买、出售和交谈,但也不会被攻击。
瑟银兄弟会 瑟银兄弟会
血帆海盗 血帆海盗
辛德拉 辛德拉 敌对:-6000声望值
银色黎明 银色黎明   会被主动攻击。
暗月马戏团 暗月马戏团
拉文霍德 拉文霍德 仇恨:-12000声望值
赞达拉部族 赞达拉部族   最低声望等级,所有对立阵营被永久设置为此类。
恶齿巨魔 蛮锤部落

文/家游勇者团·大地行者

2006年02月06日

JSF中使用ajaxanywhere只需要使用标签<aa:zoneJSF id="">来设定刷新的范围,然后进行提交就可以了,十分简单。

例如使用一个commandButton来提交

            <h:form>
                <aa:zoneJSF id="heretoAA">
                    <h:outputText value="#{ToShow.toShow}"/>
                </aa:zoneJSF>
                <h:commandButton action="#{ToShow.show}" value="Here"/>
            </h:form>

设置刷新的ID:

           <script>

            ajaxAnywhere.getZonesToReload = function(url,submitButton) {      
            return "heretoAA";
            }
//这里设置了使用ajax的方式提交表单
            ajaxAnywhere.substituteFormSubmitFunction();
            ajaxAnywhere.substituteSubmitButtonsBehavior(true);
        </script>

说明:show方法改变toShow的值,页面上显示toShow的值。

2006年02月05日

文/徐扬 黄艾禾

  “小孩儿小孩儿你别馋,过了腊八就是年;腊八粥,喝几天,哩哩啦啦二十二;二十三,糖瓜粘;二十四,扫房子;二十五,冻豆腐;二十六,去买肉;二十七,宰公鸡;二十八,把面发;二十九,蒸馒头;三十晚上熬一宿;初一、初二满街走。”一段北方过年的童谣说出了以往过年每天要做的事情。按理说,喝过腊八粥,二十三过小年开始一直到正月十五闹完元宵,这完整的一个年过下来得个把月。但繁忙的现代人哪有时间做完这繁琐的一套?如今的春节假日虽然是各种假中最长的,也只有一周而已。

  腊八粥:腊八粥的传统做法是先将大麦米、白云豆、赤豆、绿豆等捡好洗净,煮成半熟,然后放进稻米、小米、黄米,再用文火熬,是粥稀稠适中,吃时加糖,并拌以预先煮熟的红枣、栗子等。如今市场上物品如此丰富,找齐这些用料并非难事,可是有多少人会了解并有耐心遵循这些传统的做法来熬粥?能记住那天是腊八,并买回一袋配好的粥料放在高压锅里煮的,已经是难得的有心人。

  送灶君:腊月二十三是祭灶的日子。灶君爷一年四季都在厨房,伺候一家老小吃喝,观看男女老少的行为,二十三那天上天禀报玉帝。所以民间有说法要往他嘴巴上抹上糖,有的地方还给他抹上酒糟,意在让他醉了不要乱说话。今天城市里已经没有了灶间,厨房里只有煤气灶,所以想祭灶也不知该把灶君的画贴在哪里,难道贴在抽油烟机上?

  扫尘:腊月二十四是我国民间传统的“扫尘日”,“尘”与“陈”谐音,所以新春扫尘也就有了除旧布新的含义,意在把一切“穷”、“旧”都扫出门外。今天的中年人还能记得儿时随着家长翻箱倒柜大战灰尘的情形。今天的人们越近年关越忙,准备回家的,自然不用扫房,不准备回家的,腊月二十四也还在上班,找一个小时工帮助打扫卫生已经算对得起这个年了。

  穿新衣:曾几何时,还是小孩子的我们老想先穿上新衣裳,可大人不让,非得等到三十晚上,洗完澡再穿。可如今,买件新衣服是件太平常的事,刻意攒好从内衣袜子到棉衣帽子等等到过年一起换上——好像有点傻。

  春联:按规矩春联必须在除夕之前贴出,凡上联贴在进门之右边,下联贴在进门之左边。而末字是仄声的,是上联,末字是平声的,是下联。现在许多春联是印刷品,尽管看起来更加金碧辉煌,但总不及手写的那样让人珍惜;有的对门两家,竟然会碰巧贴了一模一样的春联,更不幸的,甚至将上下联贴反。

  窗花:以前的窗花是贴在纸窗上的,窗花是大姑娘小媳妇巧手裁剪出来的。现在窗花也卖得挺好,甚至在北京天桥都能买到,那是用机器刻制出来的,买回家用不干胶贴在玻璃窗上。玻璃窗没有了纸窗朦胧的美感,我们也不会有剪窗花的创造乐趣,即使电脑打字的速度再快,我们可能永远也学不来剪窗花的巧手艺了。

  爆竹:据说春节爆竹之俗始于汉代,当时没有火药纸张,所谓爆竹,是用火烧竹子,竹子发出的噼噼啪啪的响声。春节气氛与爆竹的声音是不可分的。随着现代禁放范围的扩大,春节变得寂静无声了。据说全国禁放的城市已达到两百多个。这样无声息的春节,不免让人感到落寞。

  年夜饭:这顿饭本来是我们一年到头最期待的也是最丰盛的一顿饭。但是如今,越来越多的家庭把年夜饭搬到了饭店里去吃。在饭店里当然可以吃到自己家里做不出来的山珍海味,更省了做饭与刷碗的麻烦——但岂不知,过年的味道就体现在孩子们围着妈妈看他怎么做好吃的时的过程中。

  包饺子:据说,北方人过年吃饺子的历史已经有1600多年了。饺子形似元宝,有招财进宝之意;饺子是“更岁交子”的谐音,预示着新的一年到来。每到除夕,家家户户剁馅的声音构成春节特有交响曲。老北京人说“好吃不过饺子”,但今天在超市里,冷冻的饺子四时供应,实在已算不上什么稀罕美食。而且,今天的孩子,有多少人还会包饺子?

  戴头花:杨白劳除夕夜回家,再没钱也给女儿带回一段红头绳。过去北方人过年的时候,姑娘媳妇爱戴头花。爱美是女人的天性,现代女性也喜爱发饰,只是现在无论南方北方,时髦的女人在头发上做的很可能是这三件事:烫卷、拉直和染色。

  门神:旧俗中,除夕家家户户要换门神,国人信仰门神早在春秋战国时期就出现了,后来还有了具体的人名,如汉代的神荼、郁垒,唐代的秦叔宝、尉迟敬德,还有钟馗。除了武将,还有文官。今天生活在城市里的人大都住在千篇一律的单元房里,已不用贴两个门神来把门,取而代之的,是一座坚固的防盗门。

  挂千:除夕除了换门神,有的家庭还要挂千图利。挂千又称为“门笺”、“挂签”、“挂钱”等。一般用红纸剪成,呈长方形,上部为各种剪纸图案和吉祥话,底部为流苏式。这种风俗在北宋时已经流行。今天,它又演变成了新时尚——即那些大红的“中国结”是也。

  拜年:从初一开始,到亲朋好友家或者邻居家祝贺新春。晚辈要给长辈磕头,平辈间行拱手礼。这些景象似乎只有在电影里见得到了。今天的人们用更新的手段取代这一切:电话拜年,Email拜年,OICQ聊天拜年……短信拜年更是泛滥,在春节的时候甚至造成频道堵塞。然而方便快捷却千篇一律的格式拜年语又怎能表达得出独一份的亲情?

  贺年卡:宋代城市发展繁荣,为了联络感情,人们在拜年的时候呈上自己的谒刺(类似于名片),附上自己的问候语,久而久之,便以贺刺、贴、笺等名称流行起来。新中国成立后,以贺年片统称代之。贺年卡一度因过分豪华且不环保而遭人抨击,而今天都市的人却更倾向于发送电子贺年卡。见字如面的感觉是什么时候的事情了?

  送橘:在南方,特别是广东福建一带,盛产柑橘,地方话里“橘”与“吉”同音,所以过年的时候大家送橘,家里摆着大橘,请客人吃橘,以示吉祥如意。如今城市中许多年轻人不再送大橘,除了对风俗的不太讲究,还觉得用橘子送礼不够上档次,不如送上营养滋补品。

  压岁钱:过年时长辈给晚辈压岁钱,本来是表达一种关怀的心意。随着生活水平的提高,压岁钱的数量水涨船高,成了长辈们的一大负担,有孩子把自己过年得到的压岁钱攒起来就能交下学期的学费了。也有的行贿者,将给压岁钱当成了一条走后门的捷径。

  庙会:初一到元宵节之间,全国各地都会有举办庙会。北京的白云观、厂甸、地坛、隆福寺等都是有名的庙会。过去庙会的主体活动大致有三项:一是庙里的和尚、道士做“法事”、“道场”;二是善男信女们进香朝拜、许愿求福;三是借此机会进行的文艺和商贸活动。但今天只剩下最后一项。过浓的商业氛围加上较为脏乱的环境,让不少人对它们兴趣日益淡漠。

  空竹和大冰糖葫芦:这些原来都是北方孩子最喜爱的春节礼物,庙会的摊位上到处都会摆满它们。空竹是一种以竹木为材料制成的中空的玩具,抖起来时会发出声音,声音越响说明你玩得越好。但北京已有多年没听到空竹的声音了,如果有,循声找去,一定看见是位中年人在玩。而大冰糖葫芦,过去馋得小孩流口水,今天怎么看却都觉得不够卫生。

  广府岁暮花市:春节到花市看花买花是广州人传统的风俗。花市人群熙熙攘攘,川流不息。除夕之夜花市进入高潮,直到午夜两点钟,人们才慢慢散去;这时花农们也把卖剩的鲜花降价出售,游花街的人们,往往就在这时捡到很好的便宜。这是为数不多的不但保持下来而且日见兴旺的春节习俗之一。

  舞狮:拜香港电影之福,将舞狮的技艺展示得淋漓尽致,且家喻户晓,更成了一种中国的代表性节目。以舞狮的形式拜年,源起于广东佛山。更早,舞狮起源于三国,盛行于南北朝。实际上,舞狮不但是春节习俗,平时民间有喜庆事时也常舞狮助兴,而且一些舞狮队渐有成专业运动员之势,他们互打擂台,参加国际比赛,技艺日见复杂精深。

  扭秧歌:这也是过年时中国民间最常见舞蹈之一。扭秧歌发源于黄土高原,随着人民解放军进入城市,成为普及性最广的一种大众化舞蹈。如今在城市中,扭秧歌最多的人是一些浓妆艳抹的退休老太太。她们技艺绝对比不上专业舞蹈演员,但她们的享受却是专业演员得不到的——她们不是因职业为挣钱而舞,只是为表达发自内心的欢乐。

  灯会:元宵灯会起初是为了象征佛光普照而举行,后来逐渐形成一种盛大的过年娱乐活动。旧时没有电灯,元宵之时,正是满月的时候,月光与烛光交相辉映。龙灯、焰火、火树银花共同组成灯会的不夜天。

  现代城市,当车道上来来往往的车灯、大街上的霓虹灯、大厦里的日光灯早已将一切照得如同白昼时,那满月、繁星也淡化在工业时代的灰色天空中。

  东北冰灯:冰灯是北方的一种民间艺术。春节到来时,南方已是春光明媚,而东北地区仍是银装素裹。北方人民充分利用冰雪资源,雕刻一盏盏冰灯,装饰着寒冷的初春。当今,雕冰灯最有名的要数哈尔滨市。它已经成为该市的一种品牌。实际上,冰灯已逐渐走出地域、时间的限制,在南方,在夏天,都可以利用现代高科技手段制造出一个冰天雪地的晶莹世界来。

2006年01月18日

一、验证类
1、数字验证内
  1.1 整数
  1.2 大于0的整数 (用于传来的ID的验证)
  1.3 负整数的验证
  1.4 整数不能大于iMax
  1.5 整数不能小于iMin
2、时间类
  2.1 短时间,形如 (13:04:06)
  2.2 短日期,形如 (2003-12-05)
  2.3 长时间,形如 (2003-12-05 13:04:06)
  2.4 只有年和月。形如(2003-05,或者2003-5)
  2.5 只有小时和分钟,形如(12:03)
3、表单类
  3.1 所有的表单的值都不能为空
  3.2 多行文本框的值不能为空。
  3.3 多行文本框的值不能超过sMaxStrleng
  3.4 多行文本框的值不能少于sMixStrleng
  3.5 判断单选框是否选择。
  3.6 判断复选框是否选择.
  3.7 复选框的全选,多选,全不选,反选
  3.8 文件上传过程中判断文件类型
4、字符类
  4.1 判断字符全部由a-Z或者是A-Z的字字母组成
  4.2 判断字符由字母和数字组成。
  4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
  4.4 字符串替换函数.Replace();
5、浏览器类
  5.1 判断浏览器的类型
  5.2 判断ie的版本
  5.3 判断客户端的分辨率
 
6、结合类
  6.1 email的判断。
  6.2 手机号码的验证
  6.3 身份证的验证
 

二、功能类

1、时间与相关控件类
  1.1 日历
  1.2 时间控件
  1.3 万年历
  1.4 显示动态显示时钟效果(文本,如OA中时间)
  1.5 显示动态显示时钟效果 (图像,像手表)
2、表单类
  2.1 自动生成表单
  2.2 动态添加,修改,删除下拉框中的元素
  2.3 可以输入内容的下拉框
  2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送)
 
3、打印类
  3.1 打印控件
4、事件类
  4.1 屏蔽右键
  4.2 屏蔽所有功能键
  4.3 –> 和<– F5 F11,F9,F1
  4.4 屏蔽组合键ctrl+N
5、网页设计类
  5.1 连续滚动的文字,图片(注意是连续的,两段文字和图片中没有空白出现)
  5.2 html编辑控件类
  5.3 颜色选取框控件
  5.4 下拉菜单
  5.5 两层或多层次的下拉菜单
  5.6 仿IE菜单的按钮。(效果如rongshuxa.com的导航栏目)
  5.7 状态栏,title栏的动态效果(例子很多,可以研究一下)
  5.8 双击后,网页自动滚屏
6、树型结构。
  6.1 asp+SQL版
  6.2 asp+xml+sql版
  6.3 java+sql或者java+sql+xml
7、无边框效果的制作
8、连动下拉框技术
9、文本排序

一、验证类
1、数字验证内
  1.1 整数
      /^(-|\+)?\d+$/.test(str)
  1.2 大于0的整数 (用于传来的ID的验证)
      /^\d+$/.test(str)
  1.3 负整数的验证
      /^-\d+$/.test(str)
2、时间类
  2.1 短时间,形如 (13:04:06)
      function isTime(str)
      {
        var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/);
        if (a == null) {alert(‘输入的参数不是时间格式’); return false;}
        if (a[1]>24 || a[3]>60 || a[4]>60)
        {
          alert("时间格式不对");
          return false
        }
        return true;
      }
  2.2 短日期,形如 (2003-12-05)
      function strDateTime(str)
      {
         var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
         if(r==null)return false;
         var d= new Date(r[1], r[3]-1, r[4]);
         return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
      }
  2.3 长时间,形如 (2003-12-05 13:04:06)
      function strDateTime(str)
      {
        var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/;
        var r = str.match(reg);
        if(r==null)return false;
        var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
        return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
      }
  2.4 只有年和月。形如(2003-05,或者2003-5)
  2.5 只有小时和分钟,形如(12:03)
3、表单类
  3.1 所有的表单的值都不能为空
      <input onblur="if(this.value.replace(/^\s+|\s+$/g,”)==”)alert(‘不能为空!’)">
  3.2 多行文本框的值不能为空。
  3.3 多行文本框的值不能超过sMaxStrleng
  3.4 多行文本框的值不能少于sMixStrleng
  3.5 判断单选框是否选择。
  3.6 判断复选框是否选择.
  3.7 复选框的全选,多选,全不选,反选
  3.8 文件上传过程中判断文件类型
4、字符类
  4.1 判断字符全部由a-Z或者是A-Z的字字母组成
      <input onblur="if(/[^a-zA-Z]/g.test(this.value))alert(‘有错’)">
  4.2 判断字符由字母和数字组成。
      <input onblur="if(/[^0-9a-zA-Z]/g.test(this.value))alert(‘有错’)">
  4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
      /^([a-zA-z_]{1})([\w]*)$/g.test(str)
  4.4 字符串替换函数.Replace();
5、浏览器类
  5.1 判断浏览器的类型
      window.navigator.appName
  5.2 判断ie的版本
      window.navigator.appVersion
  5.3 判断客户端的分辨率
      window.screen.height;  window.screen.width;
 
6、结合类
  6.1 email的判断。
      function ismail(mail)
      {
        return(new RegExp(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail));
      }
  6.2 手机号码的验证
  6.3 身份证的验证
      function isIdCardNo(num)
      {
        if (isNaN(num)) {alert("输入的不是数字!"); return false;}
        var len = num.length, re;
        if (len == 15)
          re = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/);
        else if (len == 18)
          re = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/);
        else {alert("输入的数字位数不对!"); return false;}
        var a = num.match(re);
        if (a != null)
        {
          if (len==15)
          {
            var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);
            var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
          }
          else
          {
            var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);
            var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
          }
          if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对!"); return false;}
        }
        return true;
      }

3.7 复选框的全选,多选,全不选,反选
<form name=hrong>
<input type=checkbox name=All onclick="checkAll(‘mm’)">全选<br/>
<input type=checkbox name=mm onclick="checkItem(‘All’)"><br/>
<input type=checkbox name=mm onclick="checkItem(‘All’)"><br/>
<input type=checkbox name=mm onclick="checkItem(‘All’)"><br/>
<input type=checkbox name=mm onclick="checkItem(‘All’)"><br/>
<input type=checkbox name=mm onclick="checkItem(‘All’)"><br/><br/>


<input type=checkbox name=All2 onclick="checkAll(‘mm2′)">全选<br/>
<input type=checkbox name=mm2 onclick="checkItem(‘All2′)"><br/>
<input type=checkbox name=mm2 onclick="checkItem(‘All2′)"><br/>
<input type=checkbox name=mm2 onclick="checkItem(‘All2′)"><br/>
<input type=checkbox name=mm2 onclick="checkItem(‘All2′)"><br/>
<input type=checkbox name=mm2 onclick="checkItem(‘All2′)"><br/>

</form>

<SCRIPT LANGUAGE="JavaScript">
function checkAll(str)
{
  var a = document.getElementsByName(str);
  var n = a.length;
  for (var i=0; i<n; i++)
  a[i].checked = window.event.srcElement.checked;
}
function checkItem(str)
{
  var e = window.event.srcElement;
  var all = eval("document.hrong."+ str);
  if (e.checked)
  {
    var a = document.getElementsByName(e.name);
    all.checked = true;
    for (var i=0; i<a.length; i++)
    {
      if (!a[i].checked){ all.checked = false; break;}
    }
  }
  else all.checked = false;
}
</SCRIPT>

3.8 文件上传过程中判断文件类型
<input type=file onchange="alert(this.value.match(/^(.*)(\.)(.{1,8})$/)[3])">

画图:
<OBJECT
id=S
style="LEFT: 0px; WIDTH: 392px; TOP: 0px; HEIGHT: 240px"
height=240
width=392
classid="clsid:369303C2-D7AC-11D0-89D5-00A0C90833E6">
</OBJECT>
<SCRIPT>
S.DrawingSurface.ArcDegrees(0,0,0,30,50,60);
S.DrawingSurface.ArcRadians(30,0,0,30,50,60);
S.DrawingSurface.Line(10,10,100,100);
</SCRIPT>

写注册表:
<SCRIPT>
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.RegWrite ("HKCU\\Software\\ACME\\FortuneTeller\\", 1, "REG_BINARY");
WshShell.RegWrite ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader", "Goocher!", "REG_SZ");
var bKey =    WshShell.RegRead ("HKCU\\Software\\ACME\\FortuneTeller\\");
WScript.Echo (WshShell.RegRead ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader"));
WshShell.RegDelete ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader");
WshShell.RegDelete ("HKCU\\Software\\ACME\\FortuneTeller\\");
WshShell.RegDelete ("HKCU\\Software\\ACME\\");
</SCRIPT>

TABLAE相关(客户端动态增加行列)
<HTML>
<SCRIPT LANGUAGE="JScript">
function numberCells() {
    var count=0;
    for (i=0; i < document.all.mytable.rows.length; i++) {
        for (j=0; j < document.all.mytable.rows(i).cells.length; j++) {
            document.all.mytable.rows(i).cells(j).innerText = count;
            count++;
        }
    }
}
</SCRIPT>
<BODY onload="numberCells()">
<TABLE id=mytable border=1>
<TR><TH>&nbsp;</TH><TH>&nbsp;</TH><TH>&nbsp;</TH><TH>&nbsp;</TH></TR>
<TR><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>
<TR><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>
</TABLE>
</BODY>
</HTML>

1.身份证严格验证:

<script>
var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
 
function cidInfo(sId){
 var iSum=0
 var info=""
 if(!/^\d{17}(\d|x)$/i.test(sId))return false;
 sId=sId.replace(/x$/i,"a");
 if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区";
 sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));
 var d=new Date(sBirthday.replace(/-/g,"/"))
 if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日";
 for(var i = 17;i>=0;i –) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 – i),11)
 if(iSum%11!=1)return "Error:非法证号";
 return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女")
}

document.write(cidInfo("380524198002300016"),"<br/>");
document.write(cidInfo("340524198002300019"),"<br/>")
document.write(cidInfo("340524197711111111"),"<br/>")
document.write(cidInfo("34052419800101001x"),"<br/>");
</script>

2.验证IP地址
<SCRIPT LANGUAGE="JavaScript">
function isip(s){
 var check=function(v){try{return (v<=255 && v>=0)}catch(x){return false}};
 var re=s.split(".")
 return (re.length==4)?(check(re[0]) && check(re[1]) && check(re[2]) && check(re[3])):false
}

var s="202.197.78.129";
alert(isip(s))
</SCRIPT>

 

3.加sp1后还能用的无边框窗口!!
<HTML XMLNS:IE>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<IE:Download ID="include" STYLE="behavior:url(#default#download)" />
<title>Chromeless Window</title>

<SCRIPT LANGUAGE="JScript">
/*— Special Thanks For andot —*/

/*
 This following code are designed and writen by Windy_sk <
seasonx@163.net>
 You can use it freely, but u must held all the copyright items!
*/

/*— Thanks For andot Again —*/

var CW_width = 400;
var CW_height = 300;
var CW_top = 100;
var CW_left = 100;
var CW_url = "/";
var New_CW = window.createPopup();
var CW_Body = New_CW.document.body;
var content = "";
var CSStext = "margin:1px;color:black; border:2px outset;border-style:expression(onmouseout=onmouseup=function(){this.style.borderStyle=’outset’}, onmousedown=function(){if(event.button!=2)this.style.borderStyle=’inset’});background-color:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;cursor:Default;";

//Build Window
include.startDownload(CW_url, function(source){content=source});

function insert_content(){
 var temp = "";
 CW_Body.style.overflow  = "hidden";
 CW_Body.style.backgroundColor = "white";
 CW_Body.style.border  =  "solid black 1px";
 content = content.replace(/<a ([^>]*)>/g,"<a onclick=’parent.open(this.href);return false’ $1>");
 temp += "<table width=100% height=100% cellpadding=0 cellspacing=0 border=0>";
 temp += "<tr style=’;font-size:12px;background:#0099CC;height:20;cursor:default’ ondblclick=\"Max.innerText=Max.innerText==’1′?’2′:’1′;parent.if_max=!parent.if_max;parent.show_CW();\" onmouseup=’parent.drag_up(event)’ onmousemove=’parent.drag_move(event)’ onmousedown=’parent.drag_down(event)’ onselectstart=’return false’ oncontextmenu=’return false’>";
 temp += "<td style=’color:#ffffff;padding-left:5px’>Chromeless Window For IE6 SP1</td>";
 temp += "<td style=’color:#ffffff;padding-right:5px;’ align=right>";
 temp += "<span id=Help  onclick=\"alert(‘Chromeless Window For IE6 SP1  -  Ver 1.0\\n\\nCode By Windy_sk\\n\\nSpecial Thanks For andot’)\" style=\""+CSStext+"font-family:System;padding-right:2px;\">?</span>";
 temp += "<span id=Min   onclick=’parent.New_CW.hide();parent.blur()’ style=\""+CSStext+"font-family:Webdings;\" title=’Minimum’>0</span>";
 temp += "<span id=Max   onclick=\"this.innerText=this.innerText==’1′?’2′:’1′;parent.if_max=!parent.if_max;parent.show_CW();\" style=\""+CSStext+"font-family:Webdings;\" title=’Maximum’>1</span>";
 temp += "<span id=Close onclick=’parent.opener=null;parent.close()’ style=\""+CSStext+"font-family:System;padding-right:2px;\" title=’Close’>x</span>";
 temp += "</td></tr><tr><td colspan=2>";
 temp += "<div id=include style=’overflow:scroll;overflow-x:hidden;overflow-y:auto; HEIGHT: 100%; width:"+CW_width+"’>";
 temp += content;
 temp += "</div>";
 temp += "</td></tr></table>";
 CW_Body.innerHTML = temp;
}

setTimeout("insert_content()",1000);

var if_max = true;
function show_CW(){
 window.moveTo(10000, 10000);
 if(if_max){
  New_CW.show(CW_top, CW_left, CW_width, CW_height);
  if(typeof(New_CW.document.all.include)!="undefined"){
   New_CW.document.all.include.style.width = CW_width;
   New_CW.document.all.Max.innerText = "1";
  }
  
 }else{
  New_CW.show(0, 0, screen.width, screen.height);
  New_CW.document.all.include.style.width = screen.width;
 }
}

window.onfocus  = show_CW;
window.onresize = show_CW;

// Move Window
var drag_x,drag_y,draging=false

function drag_move(e){
 if (draging){
  New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height);
  return false;
 }
}

function drag_down(e){
 if(e.button==2)return;
 if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height)return;
 drag_x=e.clientX;
 drag_y=e.clientY;
 draging=true;
 e.srcElement.setCapture();
}

function drag_up(e){
 draging=false;
 e.srcElement.releaseCapture();
 if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height) return;
 CW_top  = e.screenX-drag_x;
 CW_left = e.screenY-drag_y;
}

</SCRIPT>
</HTML>

电话号码的验证

要求:
  (1)电话号码由数字、"("、")"和"-"构成
  (2)电话号码为3到8位
  (3)如果电话号码中包含有区号,那么区号为三位或四位
  (4)区号用"("、")"或"-"和其他部分隔开
  (5)移动电话号码为11或12位,如果为12位,那么第一位为0
  (6)11位移动电话号码的第一位和第二位为"13"
  (7)12位移动电话号码的第二位和第三位为"13"
  根据这几条规则,可以与出以下正则表达式:
  (^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)


<script language="javascript">
function PhoneCheck(s) {
var str=s;
var reg=/(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/
alert(reg.test(str));
}
</script>
<input type=text name="iphone">
<input type=button onclick="PhoneCheck(document.all.iphone.value)" value="Check">

具有在输入非数字字符不回显的效果,即对非数字字符的输入不作反应。
function numbersonly(field,event){
 var key,keychar;
 if(window.event){
  key = window.event.keyCode;
 }
 else if (event){
  key = event.which;
 }
 else{
  return true
 }
 keychar = String.fromCharCode(key);
 if((key == null)||(key == 0)||(key == 8)||(key == 9)||(key == 13)||(key == 27)){
  return true;
 }
 else if(("0123456789.").indexOf(keychar)>-1){
  window.status = "";
  return true;
 }
 else {
  window.status = "Field excepts numbers only";
  return false;
 }
}

验证ip

str=document.RegExpDemo.txtIP.value;
if(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.test(str)==false)
{
 window.alert(‘错误的IP地址格式’);
 document.RegExpDemo.txtIP.select();
 document.RegExpDemo.txtIP.focus();
 return;
}
if(RegExp.$1<1 || RegExp.$1>254||RegExp.$2<0||RegExp.$2>254||RegExp.$3<0||RegExp.$3>254||RegExp.$4<1||RegExp.$4>254)
{
 window.alert(‘错误的IP地址’);
 document.RegExpDemo.txtIP.select();
 document.RegExpDemo.txtIP.focus();
 return;
}
//剔除 如  010.020.020.03 前面 的0
var str=str.replace(/0(\d)/g,"$1");
str=str.replace(/0(\d)/g,"$1");
window.alert(str);

//一下是取数据的类
//Obj参数指定数据的来源(限定Table),默认第一行为字段名称行
//GetTableData类提供MoveNext方法,参数是表的行向上或向下移动的位数,正数向下移动,负数向上.
//GetFieldData方法获得指定的列名的数据
//Sort_desc方法对指定的列按降序排列
//Sort_asc方法对指定的列按升序排列
//GetData方法返回字段值为特定值的数据数组,提供数据,可以在外部进行其他处理
//Delete方法删除当前记录,数组减少一行
//初始化,Obj:table的名字,Leftlen:左面多余数据长度,Rightlen:右面多余数据长度,
function GetTableData(Obj,LeftLen,RightLen){
var MyObj=document.all(Obj);
var iRow=MyObj.rows.length;
var iLen=MyObj.rows[0].cells.length;
var i,j;

TableData=new Array();
  for (i=0;i< iRow;i++){
   TableData[i]=new Array();
   for (j=0;j<iLen;j++){
   TableStr=MyObj.rows(i).cells(j).innerText;
   TableStr=TableStr.substring(LeftLen, TableStr.length-RightLen).Trim();
   TableStr=TableStr.replace(/ /gi,"").replace(/\r\n/ig,"");
   TableData[i][j]=TableStr;
   }
   }
 
  this.TableData=TableData;
  this.cols=this.TableData[0].length;
  this.rows=this.TableData.length;
  this.rowindex=0;
}


function movenext(Step){
if (this.rowindex>=this.rows){
return
}

if (Step=="" || typeof(Step)=="undefined") {
 if (this.rowindex<this.rows-1)
 this.rowindex++;
 return;

}
 else{
  if (this.rowindex + Step<=this.rows-1 && this.rowindex + Step>=0 ){
  this.rowindex=this.rowindex + Step;
  }
  else
  {
  if (this.rowindex + Step<0){
   this.rowindex= 0;
   return;
   }
  if (this.rowindex + Step>this.rows-1){
   this.rowindex= this.rows-1;
   return;
   }
  }
 }
}


function getfielddata(Field){
var colindex=-1;
var i=0;
 if (typeof(Field) == "number"){
   colindex=Field;
  }
 else
 {
 for (i=0;i<this.cols && this.rowindex<this.rows ;i++){
   if (this.TableData[0][i]==Field){
   colindex=i;
   break;
   }  
  }
 }
  if (colindex!=-1) {
  return this.TableData[this.rowindex][colindex];
  }

}

 

function sort_desc(){//降序
 var colindex=-1;
 var highindex=-1;
 desc_array=new Array();
 var i,j;
for (n=0; n<arguments.length; n++){
 Field=arguments[arguments.length-1-n];
 for (i=0;i<this.cols;i++){
  if (this.TableData[0][i]==Field){
  colindex=i;
  break;
  }  
 }
   if ( colindex==-1 )
  return;
   else
  {
  desc_array[0]=this.TableData[0];
  for(i=1;i<this.rows;i++){
  desc_array[i]=this.TableData[1];
  highindex=1;
   for(j=1;j<this.TableData.length;j++){
      if  (desc_array[i][colindex]<this.TableData[j][colindex]){ 
      desc_array[i]=this.TableData[j];  
      highindex=j;
    }
    
   }
     if (highindex!=-1)
     this.TableData=this.TableData.slice(0,highindex).concat(this.TableData.slice(highindex+1,this.TableData.length));                     
  }
 }


 this.TableData=desc_array;
}
 return;
}

 

function sort_asc(){//升序
 var colindex=-1;
 var highindex=-1;
 var i,j;
for (n=0; n<arguments.length; n++){
   asc_array=new Array();
   Field=arguments[arguments.length-1-n];
   for (i=0;i<this.cols;i++){
    if (this.TableData[0][i]==Field){
    colindex=i;
    break;
    }  
   }
   if ( colindex==-1 )
     return;
   else
     {
     asc_array[0]=this.TableData[0];
     for(i=1;i<this.rows;i++){
     asc_array[i]=this.TableData[1];
     highindex=1;
      for(j=1;j<this.TableData.length;j++){//找出最小的列值
         if  (asc_array[i][colindex]>this.TableData[j][colindex]){ 
         asc_array[i]=this.TableData[j];  
         highindex=j;
          
        }
          
       }
         if (highindex!=-1)
         this.TableData=this.TableData.slice(0,highindex).concat(this.TableData.slice(highindex+1,this.TableData.length));                     
         
      }
     }


    this.TableData=asc_array;
 }
 return;
}

 

function getData(Field,FieldValue){
var colindex=-1;
var i,j;

GetData=new Array();
  if (typeof(Field)=="undefined" || typeof(FieldValue)=="undefined" ){
  return this.TableData;
  }
  
   for(j=0;j<this.cols;j++){
      if  (this.TableData[0][j]==Field){
     colindex=j;
     }
   }
   if (colindex!=-1){
   
   for(i=1;i<this.rows;i++){
      if  (this.TableData[i][colindex]==FieldValue){
     GetData[i]=new Array();
     GetData[i]=this.TableData[i]; 
     }
   }
   }
   return GetData;
}
function DeletE(){
this.TableData=this.TableData.slice(0,this.rowindex).concat(this.TableData.slice(this.rowindex+1,this.TableData.length));                     
this.rows=this.TableData.length;
return;
}
function updateField(Field,FieldValue){
var colindex=-1;
var i=0;
 if (typeof(Field) == "number"){
   colindex=Field;
  }
 else
 {
 for (i=0;i<this.cols && this.rowindex<this.rows ;i++){
   if (this.TableData[0][i]==Field){
   colindex=i;
   break;
   }  
  }
 }
 if (colindex!=-1) {
  this.TableData[this.rowindex][colindex]=FieldValue;
  }


}
function movefirst(){
this.rowindex=0;
}
function movelast(){
this.rowindex=this.rows-1;
}
function String.prototype.Trim() {return this.replace(/(^\s*)|(\s*$)/g,"");}
GetTableData.prototype.MoveNext = movenext;
GetTableData.prototype.GetFieldData = getfielddata;
GetTableData.prototype.Sort_asc = sort_asc;
GetTableData.prototype.Sort_desc = sort_desc;
GetTableData.prototype.GetData = getData;
GetTableData.prototype.Delete = DeletE;
GetTableData.prototype.UpdateField = updateField;
GetTableData.prototype.MoveFirst = movefirst;

具体的例子:http://202.119.73.208/NetEAn/com/test/jsprint.htm

在每个文本框的onblur事件中调用校验代码,并且每个文本框中onKeyDown事件中写一个enter转tab函数

//回车键换为tab
function enterToTab()
{
    if(event.srcElement.type != ‘button’ && event.srcElement.type != ‘textarea’
       && event.keyCode == 13)
    {
        event.keyCode = 9;
    }
}

有时候还需要自由编辑表格—
给大家一个自由编辑表格的小例子,写的有点乱,呵呵:)

//===============================start================================


<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
<TITLE>测试修改表格</TITLE>
<STYLE>
/*提示层的样式*/
div
{
  BORDER-RIGHT: #80c144 1px solid;
  BORDER-TOP: #80c144 1px solid;
  VISIBILITY: hidden;
  BORDER-LEFT: #80c144 1px solid;
  CURSOR: default;
  LINE-HEIGHT: 20px;
  BORDER-BOTTOM: #80c144 1px solid;
  FONT-FAMILY: 宋体;
  font-size:12px;
  POSITION: absolute;
  BACKGROUND-COLOR: #f6f6f6;
  TOP:30px;
  LEFT:30px;
}
/*tr的样式*/
tr
{
    font-family: "宋体";
    color: #000000;
    background-color: #C1DBF5;
    font-size: 12px
}
/*table脚注样式*/
.TrFoot
{
    FONT-SIZE: 12px;
    font-family:"宋体", "Verdana", "Arial";
    BACKGROUND-COLOR: #6699CC;
    COLOR:#FFFFFF;
    height: 25;
}
/*trhead属性*/
.TrHead
{
    FONT-SIZE: 13px;
    font-family:"宋体", "Verdana", "Arial";
    BACKGROUND-COLOR: #77AADD;
    COLOR:#FFFFFF;
    height: 25;
}
/*文本框样式*/
INPUT
{
    BORDER-COLOR: #AACEF7 #AACEF7 #AACEF7 #AACEF7;
    BORDER-RIGHT: 1px solid;
    BORDER-TOP: 1px solid;
    BORDER-LEFT: 1px solid;
    BORDER-BOTTOM: 1px solid;
    FONT-SIZE: 12px;
    FONT-FAMILY: "宋体","Verdana";
    color: #000000;
    BACKGROUND-COLOR: #E9EFF5;
}
/*button样式*/
button
{
    BORDER-COLOR: #AACEF7 #AACEF7 #AACEF7 #AACEF7;
    BACKGROUND-COLOR: #D5E4F3;
    CURSOR: hand;
    FONT-SIZE:12px;
    BORDER-RIGHT: 1px solid;
    BORDER-TOP: 1px solid;
    BORDER-LEFT: 1px solid;
    BORDER-BOTTOM: 1px solid;
    COLOR: #000000;
}
</STYLE>
</HEAD>
<BODY>
<SCRIPT language = "JavaScript">
<!–全局变量
//标志位,值为false代表未打开一个编辑框,值为true为已经打开一个编辑框开始编辑
var editer_table_cell_tag = false;
//开启编辑功能标志,值为true时为允许编辑
var run_edit_flag = false;
//–>
</SCRIPT>

<SCRIPT language = "JavaScript">
<!–
/**
 * 编辑表格函数
 * 单击某个单元格可以对里面的内容进行自由编辑
 * @para tableID 为要编辑的table的id
 * @para noEdiID 为不要编辑的td的ID,比如说table的标题
 * 可以写为<TD id="no_editer">自由编辑表格</TD>
 * 此时该td不可编辑
 */
function editerTableCell(tableId,noEdiId)
{
 var tdObject = event.srcElement;
 var tObject = ((tdObject.parentNode).parentNode).parentNode;
 if(tObject.id == tableId &&tdObject.id != noEdiId&&editer_table_cell_tag == false && run_edit_flag == true)
 {
  tdObject.innerHTML = "<input type=text id=edit_table_txt name=edit_table_txt value="+tdObject.innerText+" size=’15′ onKeyDown=’enterToTab()’>  <input type=button value=’ 确定 ‘ onclick=’certainEdit()’>";
  edit_table_txt.focus();
  edit_table_txt.select();
  editer_table_cell_tag = true;
  //修改按钮提示信息
  editTip.innerText = "请先点确定按钮确认修改!";  
 }
 else
 {
  return false;
 }
}

/**
 * 确定修改
 */
function certainEdit()
{
 var bObject = event.srcElement;
 var tdObject = bObject.parentNode; 
 var txtObject = tdObject.firstChild;
 tdObject.innerHTML = txtObject.value;
 //代表编辑框已经关闭
 editer_table_cell_tag = false;
 //修改按钮提示信息
 editTip.innerText = "请单击某个单元格进行编辑!";
}

function enterToTab()
{
    if(event.srcElement.type != ‘button’ && event.srcElement.type != ‘textarea’
       && event.keyCode == 13)
    {
        event.keyCode = 9;
    }
}

/**
 * 控制是否编辑
 */
function editStart()
{
 if(event.srcElement.value == "开始编辑")
 {
  event.srcElement.value = "编辑完成";
  run_edit_flag = true;
 }
 else
 {
  //如果当前没有编辑框,则编辑成功,否则,无法提交
  //必须按确定按钮后才能正常提交
  if(editer_table_cell_tag == false)
  {
   alert("编辑成功结束!");
   event.srcElement.value = "开始编辑";
   run_edit_flag = false;
  }
 }
}

/**
 * 根据不同的按钮提供不同的提示信息
 */
function showTip()
{
 if(event.srcElement.value == "编辑完成")
 {
  editTip.style.top = event.y + 15;
  editTip.style.left = event.x + 12;
  editTip.style.visibility = "visible";  
 }
 else
 {
  editTip.style.visibility = "hidden";   
 } 
}
–>
</SCRIPT>
<TABLE id="editer_table" width="100%" align="center"
    onclick="editerTableCell(‘editer_table’,'no_editer’)"> 
    <TR class="TrHead">
  <TD colspan="3" align="center" id="no_editer">自由编辑表格</TD>  
 </TR>
 <TR>
  <TD width="33%">单击开始编辑按钮,然后点击各单元格编辑</TD>
  <TD width="33%">2</TD>
  <TD width="33%">3</TD>
 </TR>
 <TR>
  <TD width="33%">4</TD>
  <TD width="33%">5</TD>
  <TD width="33%">6</TD>
 </TR>
 <TR>
  <TD width="33%">one</TD>
  <TD width="33%">two</TD>
  <TD width="33%">three</TD>
 </TR>
 <TR>
  <TD width="33%">four</TD>
  <TD width="33%">five</TD>
  <TD width="33%">six</TD>
 </TR>  
    <TR class="TrFoot">
  <TD colspan="3" align="center" id="no_editer">
   <INPUT type="button" class="bt" value="开始编辑" onClick="editStart()" onMouseOver="showTip()" onMouseMove="showTip()" onMouseOut="editTip.style.visibility = ‘hidden’;">
  </TD>
 </TR> 
</TABLE>
</BODY>
<DIV id="editTip">请单击某个单元格进行编辑!</DIV>
</HTML>

2006年01月07日

1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键
<table border oncontextmenu=return(false)><td>no</table> 可用于Table

2. <body onselectstart="return false"> 取消选取、防止复制

3. onpaste="return false" 不准粘贴

4. oncopy="return false;" oncut="return false;" 防止复制

5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图标

6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夹中显示出你的图标

7. <input style="ime-mode:disabled"> 关闭输入法

8. 永远都会带着框架
<script language="JavaScript"><!–
if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页
// –></script>

9. 防止被人frame
<SCRIPT LANGUAGE=JAVASCRIPT><!– 
if (top.location != self.location)top.location=self.location;
// –></SCRIPT>

10. 网页将不能被另存为
<noscript><iframe src=*.html></iframe></noscript> 

11. <input type=button value=查看网页源代码 
onclick="window.location = "view-source:"+ "http://www.pconline.com.cn"">

12.删除时确认
<a href="javascript:if(confirm("确实要删除吗?"))location="boos.asp?&areyou=删除&page=1"">删除</a> 

13. 取得控件的绝对位置
//Javascript
<script language="Javascript">
function getIE(e){
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert("top="+t+"/nleft="+l);
}
</script>

//VBScript
<script language="VBScript"><!–
function getIE()
dim t,l,a,b
set a=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
while a.tagName<>"BODY"
set a = a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"
end function
–></script>

14. 光标是停在文本框文字的最后
<script language="javascript">
function cc()
{
var e = event.srcElement;
var r =e.createTextRange();
r.moveStart("character",e.value.length);
r.collapse(true);
r.select();
}
</script>
<input type=text name=text1 value="123" onfocus="cc()">

15. 判断上一页的来源
javascript:
document.referrer

16. 最小化、最大化、关闭窗口
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> 
<param name="Command" value="Minimize"></object>
<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> 
<param name="Command" value="Maximize"></object>
<OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAM NAME="Command" VALUE="Close"></OBJECT>
<input type=button value=最小化 onclick=hh1.Click()>
<input type=button value=最大化 onclick=hh2.Click()>
<input type=button value=关闭 onclick=hh3.Click()>
本例适用于IE

17.屏蔽功能键Shift,Alt,Ctrl
<script>
function look(){ 
if(event.shiftKey) 
alert("禁止按Shift键!"); //可以换成ALT CTRL

document.onkeydown=look; 
</script>

18. 网页不会被缓存
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
或者<META HTTP-EQUIV="expires" CONTENT="0">

19.怎样让表单没有凹凸感?
<input type=text style="border:1 solid #000000"> 

<input type=text style="border-left:none; border-right:none; border-top:none; border-bottom: 

1 solid #000000"></textarea>

20.<div><span>&<layer>的区别? 
<div>(division)用来定义大段的页面元素,会产生转行 
<span>用来定义同一行内的元素,跟<div>的唯一区别是不产生转行 
<layer>是ns的标记,ie不支持,相当于<div>

21.让弹出窗口总是在最上面:
<body onblur="this.focus();">

22.不要滚动条? 
让竖条没有: 
<body style="overflow:scroll;overflow-y:hidden"> 
</body> 
让横条没有: 
<body style="overflow:scroll;overflow-x:hidden"> 
</body> 
两个都去掉?更简单了 
<body scroll="no"> 
</body> 

23.怎样去掉图片链接点击后,图片周围的虚线?
<a href="#" onFocus="this.blur()"><img src="logo.jpg" border=0></a>

24.电子邮件处理提交表单
<form name="form1" method="post" action="mailto:****@***.com" enctype="text/plain"> 
<input type=submit>
</form>

25.在打开的子窗口刷新父窗口的代码里如何写?
window.opener.location.reload()

26.如何设定打开页面的大小
<body onload="top.resizeTo(300,200);">
打开页面的位置<body onload="top.moveBy(300,200);">

27.在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动 
<STYLE> 
body 
{background-image:url(logo.gif); background-repeat:no-repeat; 
background-position:center;background-attachment: fixed} 
</STYLE> 

28. 检查一段字符串是否全由数字组成
<script language="Javascript"><!–
function checkNum(str){return str.match(//D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// –></script>

29. 获得一个窗口的大小
document.body.clientWidth; document.body.clientHeight

30. 怎么判断是否是字符
if (/[^/x00-/xff]/g.test(s)) alert("含有汉字");
else alert("全是字符");

31.TEXTAREA自适应文字行数的多少
<textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight">
</textarea>
32. 日期减去天数等于第二个日期
<script language=Javascript>
function cc(dd,dadd)
{
//可以加上错误处理
var a = new Date(dd)
a = a.valueOf()
a = a - dadd * 24 * 60 * 60 * 1000
a = new Date(a)
alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")
}
cc("12/23/2002",2)
</script>

33. 选择了哪一个Radio
<HTML><script language="vbscript">
function checkme()
for each ob in radio1
if ob.checked then window.alert ob.value
next
end function
</script><BODY>
<INPUT name="radio1" type="radio" value="style" checked>Style
<INPUT name="radio1" type="radio" value="barcode">Barcode
<INPUT type="button" value="check" onclick="checkme()">
</BODY></HTML>

34.脚本永不出错
<SCRIPT LANGUAGE="JavaScript"> 
<!– Hide 
function killErrors() { 
return true; 

window.onerror = killErrors; 
// –> 
</SCRIPT>

35.ENTER键可以让光标移到下一个输入框
<input onkeydown="if(event.keyCode==13)event.keyCode=9">

36. 检测某个网站的链接速度:
把如下代码加入<body>区域中:
<script language=Javascript>
tim=1
setInterval("tim++",100)
b=1
var autourl=new Array()
autourl[1]="www.njcatv.net"
autourl[2]="javacool.3322.net"
autourl[3]="www.sina.com.cn"
autourl[4]="www.nuaa.edu.cn"
autourl[5]="www.cctv.com"
function butt(){
document.write("<form name=autof>")
for(var i=1;i<autourl.length;i++)
document.write("<input type=text name=txt"+i+" size=10 value=测试中……> =》<input type=text 
name=url"+i+" size=40> =》<input type=button value=GO 

onclick=window.open(this.form.url"+i+".value)><br>")
document.write("<input type=submit value=刷新></form>")
}
butt()
function auto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value="链接超时"}
else
{document.forms[0]["txt"+b].value="时间"+tim/10+"秒"}
b++
}
function run(){for(var i=1;i<autourl.length;i++)document.write("<img src=http://"+autourl+"/"+Math.random()+" width=1 height=1 

onerror=auto("http://"+autourl+"")>")}
run()</script>

37. 各种样式的光标
auto :标准光标
default :标准箭头
hand :手形光标
wait :等待光标
text :I形光标
vertical-text :水平I形光标
no-drop :不可拖动光标
not-allowed :无效光标
help :?帮助光标
all-scroll :三角方向标
move :移动标
crosshair :十字标
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize

38.页面进入和退出的特效
进入页面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)">
推出页面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)"> 
这个是页面被载入和调出时的一些特效。duration表示特效的持续时间,以秒为单位。transition表示使用哪种特效,取值为1-23:
  0 矩形缩小 
  1 矩形扩大 
  2 圆形缩小
  3 圆形扩大 
  4 下到上刷新 
  5 上到下刷新
  6 左到右刷新 
  7 右到左刷新 
  8 竖百叶窗
  9 横百叶窗 
  10 错位横百叶窗 
  11 错位竖百叶窗
  12 点扩散 
  13 左右到中间刷新 
  14 中间到左右刷新
  15 中间到上下
  16 上下到中间 
  17 右下到左上
  18 右上到左下 
  19 左上到右下 
  20 左下到右上
  21 横条 
  22 竖条 
  23 以上22种随机选择一种

39.在规定时间内跳转
<META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com"> 

40.网页是否被检索
<meta name="ROBOTS" content="属性值">
  其中属性值有以下一些:
  属性值为"all": 文件将被检索,且页上链接可被查询;
  属性值为"none": 文件不被检索,而且不查询页上的链接;
  属性值为"index": 文件将被检索;
  属性值为"follow": 查询页上的链接;
  属性值为"noindex": 文件不检索,但可被查询链接;
  属性值为"nofollow": 文件不被检索,但可查询页上的链接。
转自: http://www.zhanling.com/zhanling/qiu/blogview.asp?logID=88&cateID=3

用window.showModalDialog 或者window.showModelessDialog打开一个模式窗口后,和父窗口的一些交互问题。
要进行交互操作的前提,在调用showModalDialog或者showModelessDialog方法的时候,第二个参数传window,如:
  1. window.showModelessDialog('filename.htm',window,'dialogWidth=200px;dialogHeight=250px;')



接下来,就是取得父窗口的一些数据和方法,这是经常会用的,父窗口取子窗口的参数一般通过returnValue就可以搞定了~

  1. //取得父窗口的JS变量 var
  2. window.dialogArguments.var;
  3. //获得父窗口的对象和属性
  4. window.dialogArguments.form1.name.value ;
  5. //调用父窗口的方法 fun
  6. window.dialogArguments.fun() ;
  7. window.dialogArguments.var;

  8. //获得父窗口的对象和属性
  9. window.dialogArguments.form1.name.value ;
  10. //调用父窗口的方法 fun
  11. window.dialogArguments.fun() ;
  12. //获得父窗口的对象和属性

  13. window.dialogArguments.form1.name.value ;
  14. //调用父窗口的方法 fun
  15. window.dialogArguments.fun() ;
  16. window.dialogArguments.form1.name.value ;

  17. //调用父窗口的方法 fun
  18. window.dialogArguments.fun() ;
  19. //调用父窗口的方法 fun

  20. window.dialogArguments.fun() ;
  21. window.dialogArguments.fun() ;

  22. window.dialogArguments.var;
  23. //获得父窗口的对象和属性
  24. window.dialogArguments.form1.name.value ;
  25. //调用父窗口的方法 fun
  26. window.dialogArguments.fun() ;
  27. //获得父窗口的对象和属性
  28. window.dialogArguments.form1.name.value ;
  29. //调用父窗口的方法 fun
  30. window.dialogArguments.fun() ;
  31. window.dialogArguments.form1.name.value ;
  32. //调用父窗口的方法 fun
  33. window.dialogArguments.fun() ;
  34. //调用父窗口的方法 fun
  35. window.dialogArguments.fun() ;
  36. window.dialogArguments.fun() ;




但是有个问题,在子窗口中的事件响应无法调用父窗口的方法,

  1. <button onClick='window.dialogArguments.fun()'>调父窗口方法</button>

2006年01月04日

function drag(o){
 //o.firstChild.onmousedown=function(){return false;};
 o.onmousedown=function(a){
  var d=document;if(!a)a=window.event;
  var x=a.layerX?a.layerX:a.offsetX,y=a.layerY?a.layerY:a.offsetY;
  if(o.setCapture)
   o.setCapture();
  else if(window.captureEvents)
   window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);

  d.onmousemove=function(a){
   if(!a)a=window.event;
   if(!a.pageX)a.pageX=a.clientX;
   if(!a.pageY)a.pageY=a.clientY;
   var tx=a.pageX-x,ty=a.pageY-y;
   o.style.left=tx;
   o.style.top=ty;
  };

  d.onmouseup=function(){
   if(o.releaseCapture)
    o.releaseCapture();
   else if(window.captureEvents)
    window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
   d.onmousemove=null;
   d.onmouseup=null;
  };
 };
}

window.onload=function(){
  drag(document.getElementById(‘LoginDIV’));
 };

<style type="text/css">
 <!–
 #LoginDIV {
  position:absolute;
  width:250px;
  height:140px;
  z-index:1;
  left:400;
  top:100;
 }
 –>
</style>

<div id="LoginDIV" style="display: none;"></div>

cre8d design blog里有一篇关于Blog Design Trends的文章,例举了目前Blog设计方面的7个趋势。这些趋势已经在很多的国外Blog中被广泛应用。

- 大字体(Big fonts):
11号Verdana字体已经过时,大字体的标题和正文重新流行。如Garrett Dimon’s blogWhitespace都使用了大字体。在传统的西文网站中,字体过小的情况的确比较普遍。对中文网站来说,12px的大小个人觉得还是不错。而在Blog中,再大一点的字体也许可读性更强,要不要把我的Blog正文字体改为13px?

- 顶端粗边线(Top border):
这是一个很细小的装饰,但的确很流行,那就是在网页最顶部加上一条100%宽度、5或6pt高的边框,就像 A List ApartTech CrunchWhitespaceGiga OM那样。这样的横条虽然基本不影响浏览,但是的确很有现代感,我个人也很喜欢,但是这种设计似乎在中文网站中还较少见。

- 超大的页首和页尾(Big headers/ footers):
例子如JuqueRead/Write WebBusiness LogsThe Hot Crew,使用高对比色和超大文字图片来凸显页首和页尾。这个趋势很有张扬个性的意味在其中,在国外的设计类和艺术类Blog非常多件,从这个部分来说,国内的Blog设计显然还比较保守。不过我相信在2006年会有很多这样设计的中文Blog出现,因为Blog将为更人用来展现自己的个人风采。

- 明亮的色彩搭配区块及颜色的渐变,9rulesBlinksaleSerene GreenFruitcast都使用了大量这样的元素。这类效果对整个页面搭建及艺术配色都有比较高的要求,不过最终的效果的确是非常的炫目。希望能见到越来越多国内的网站也能作得那么漂亮。

- 对话气泡框住的回复(Speech bubble comments):
回复部份的个性装饰,例如hicksdesignDigg。Digg的回复框令人印象深刻,不过我觉得这样的设计还是要配合整个网站的风格效果才比较好。

- 圆角(Rounded corners):
用CSS而不是图片来实现各种各样的圆角,具体的技术细节A List Apart有介绍。圆角很好看,不过用起来还是要花小小的功夫。

- 高亮链接(Highlighted links):
不用下划线,而是用鼠标划过以后的背景色改变来表现超链接。呵呵,我的Blog就是例子。的确可以提高超链接的可读性和整体页面效果。

这些趋势又一个共同的特点,就是针对较短篇幅的文字进行阅读体验的优化,值得所有的Blogger借鉴,更值得BSP学习。