軟件藝術思考者  
          混沌,彷徨,立志,蓄勢...
          公告
          日歷
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          隨筆分類(86)

          隨筆檔案(85)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           
          翻譯說明:本文是我從Prado框架的《快速入門指南》翻譯中摘錄出來的,感覺對JavaScript的學習很有幫助,特貼出備忘。

          Javascript簡介

          本指引基于Sergio Pereira的 Quick guide to somewhat advanced JavaScript tour of some OO features。

          嘿,我不知道你能那樣做

          如果你是一個Web開發者而且與我來自同一個地方,你也許在你的Web頁面中使用過相當多的Javascript,大部分用來作用戶界面(UI)的粘合。

          直到現在,我才知道Javascript具有比我過去使用的更多的面向對象能力,只是我沒有如我所需的去使用它。當瀏覽器開始支持更標準的Javascript和DOM的功能集時,要為客戶端上的運行而編寫更復雜和多功能的代碼就變得可行了。它助長了AJAX現象的產生。

          當我們都開始學習它適合編寫什么酷的AJAX應用時,我們開始關注到我們過去知道的Javascript不過只是冰山一角而已。我們現在知道Javascript不僅僅被用于象輸入校驗等簡單的用戶界面雜務和其他瑣碎任務?,F在的客戶端代碼更高級和分層,更象一個真正的桌面應用或一個客戶端-服務器的富客戶端。我們在其中看到了過去僅在服務器端的代碼中見到的類庫、對象模型、繼承關系、模式和許多其他的東西。

          突然在我們能講到的許多方面被放到了比以前更高的位置。要為新的Web編寫應用,我們必需提高我們的Javascript水平來跟上它而且要更加熟練。假如你嘗試運用許多現有的javascript庫,如:Prototype.js、Scriptaculousmoo.fxBehaviour、YUI等,你最終會發現自己要閱讀JS代碼?;蛟S因為你想要學習它們如何實現,或因為你的好奇,或通常因為那是知道如何使用它的唯一辦法,大多數這些庫象是不太注重文檔。無論個案會是什么,假如你之前不了解那樣的東西,你將要面對一些引起恐慌的外部技術。

          本文的目的正好是解說許多我們還不熟悉的構造類型。

          JSON (JavaScript Object Notation-Javascript對象表示法)

          Javascript對象表示法(JSON),是圍繞AJAX主題突然出現的一個新的時髦詞。JSON,簡單的說就是一種在Javascript中定義對象的方法。讓我們馬上來看看一個實例并體會它如何簡單。

          var myPet = { color: 'black', leg_count: 4, communicate: function(repeatCount){for(i=0;i<repeatCount;i++)alert('Woof!');}};

          就讓我們加入些許格式讓它看起來象我們平常所認識的那樣:

          var myPet =
          {
              color: 'black',
              legCount: 4,
              communicate: function(repeatCount){for(i=0;i<repeatCount;i++)alert('Woof!');
              }};

          在這我們創建了一個帶兩個屬性(colorlegCount)和一個方法(communicate)的對象引用。不難發現,該對象的屬性和方法用一個逗號區隔的列表來定義。每個成員通過名稱來引入,接著是冒號和定義。對于屬性來說很容易,僅僅是屬性值。方法通過指派一個匿名函數來創建,我們下面會更好地說明。在該對象被創建并指派給變量myPet之后,我們可以如下使用它:

          alert('my pet is ' + myPet.color);
          alert('my pet has ' + myPet.legCount + ' legs');
          //if you are a dog, bark three times:
          myPet.communicate(3);

          You'll see JSON used pretty much everywhere in JS these days, as arguments to functions, as return values, as server responses (in strings,) etc.

          你想說什么?函數也是一個對象?

          對于開發者來說這可能與眾不同,但在JS中一個函數也是一個對象。你可以象參數一樣把一個函數傳送給另一個函數,就象你可以傳送一個字符串一樣。這些被廣泛應用而且非常便利。

          看看這個實例。我們將把函數傳送到另一個使用它們的函數去。

          var myDog =
          {
              bark: function(){alert('Woof!');
              }};
          ?
          var myCat =
          {
              meow: function(){alert('I am a lazy cat. I will not meow for you.');
              }};
          ?
          function annoyThePet(petFunction){//let's see what the pet can do
              petFunction();
          }
          ?
          //annoy the dog:
          annoyThePet(myDog.bark);
          //annoy the cat:
          annoyThePet(myCat.meow);

          注意,我們把沒有添加"()"的myDog.bark和myCat.meow傳送給它們。假如我們那樣做了,我們不是傳送函數,而是調用那些方法并傳送它們的返回值,這里的兩個個案中都未定義。

          要是你想另我的懶貓起來嗥叫,你可以簡單地這樣做:

          myCat.meow = myDog.bark;
          myCat.meow(); //alerts 'Woof!' 

          數組、項目和對象成員

          在JS中下列兩行做了同樣的事。

          var a = new Array();
          var b = [];

          正如我確定你已經知道的那樣,你可以通過使用方括號在一個數組中訪問個別項目:

          var a = ['first', 'second', 'third'];
          var v1 = a[0];
          var v2 = a[1];
          var v3 = a[2];

          但你還不限于數字索引。你可以通過使用它的名字以字符串來訪問一個JS對象的任何成員。下面的例子創建了一個空對象,并通過名字加入了一些成員。

          var obj = {}; //new, empty object
          obj['member_1'] = 'this is the member value';
          obj['flag_2'] = false;
          obj['some_function'] = function(){/* do something */};

          上述代碼的作用與下面的相同:

          var obj =
          {
              member_1:'this is the member value',
              flag_2: false,
              some_function: function(){/* do something */}};

          在許多情形下,在JS中對象的概念和關聯的數組(雜湊)沒有區別。下面兩行代碼都做了同樣的事情。

          obj.some_function();
          obj['some_function']();

          關于對象已經夠了,我現在能有一個類了嗎?

          面向對象編程語言的巨大力量來源于類的使用。我不認為僅應用我之前使用其他語言的經驗就能推測出在JS中如何定義類。這由你自己來判斷。

          //defining a new class called Petvar Pet = function(petName, age){this.name = petName;
              this.age = age;
          };
          ?
          //let's create an object of the Pet classvar famousDog = new Pet('Santa\'s Little Helper', 15);
          alert('This pet is called ' + famousDog.name);

          讓我們看看如何加入一個方法到我們的Pet類。我們將使用所有類都具有的prototype屬性。prototype屬性是一個包含任何對象的類會具有的所有成員的對象。甚至默認的JS類,如StringNumberDate擁有一個的prototype對象,它能讓我們可以添加方法和屬性并使那個類的任何對象自動獲取這個新成員。

          Pet.prototype.communicate = function(){alert('I do not know what I should say, but my name is ' + this.name);
          };

          那就是一個類似于prototype.js的庫會派上用場的時候。如果我們使用prototype.js,我們能使我們的代碼看起來更清晰(至少在我看來是這樣)。

          var Pet = Class.create();
          Pet.prototype =
          {//our 'constructor'
              initialize: function(petName, age){this.name = petName;
                  this.age = age;
              },
          ?
              communicate: function(){alert('I do not know what I should say, but my name is ' + this.name);
              }};

          函數作為參數,一個有趣的模式

          假如你從來沒有接觸過支持閉合的語言,你也許會發現下面的慣用法太令人震驚了。

          var myArray = ['first', 'second', 'third'];
          myArray.each(function(item, index){alert('The item in the position #' + index + ' is:' + item);
          });

          哇!在你斷定我已經離題太遠并且想轉去比這篇更好點的文章之前,讓我們在這解釋一下要繼續干些什么。

          首先,在上述實例中我們使用了prototype.js庫,它添加了each函數到Array類。該each函數接到一個函數對象的參數。這個函數對于數組中的每個項目都將被依次調用一次,對于當前項目調用時傳送兩個參數,item和index。讓我們稱這個函數為iterator函數。我們也能象這樣編寫代碼:

          function myIterator(item, index){alert('The item in the position #' + index + ' is:' + item);
          }
          ?
          var myArray = ['first', 'second', 'third'];
          myArray.each( myIterator );

          我們不會象那些學校里的那些天真孩子那樣做的,對吧?雖然更嚴格地說,后面的形式更易于理解但導致我們要進入代碼中四處找尋myIterator函數。最好在它調用的同一個地方那里有迭代函數的邏輯。在本案例中,我們也不會在其他任何地方需要迭代函數,所以我們無損地把它轉化成一個匿名函數。

          這是this,但有時this也是那個

          當使用JS開始編寫我們的代碼時,我們最普遍的一個麻煩就是this關鍵字的使用。它是一個真正的牽絆。

          就象我們之前提及的那樣,在JS中一個函數也是一個對象,而且有時候我們不注意我們正在傳出一個函數。

          拿這小段代碼舉個例:

          function buttonClicked(){alert('button ' + this.id + ' was clicked');
          }
          ?
          var myButton = document.getElementById('someButtonID');
          var myButton2 = document.getElementById('someOtherButtonID');
          myButton.onclick = buttonClicked;
          myButton2.onclick = buttonClicked;

          由于buttonClicked函數在任何對象之外被定義,我們也許以為this關鍵字會包含一個windowdocument對象(假設這些代碼位于一個在瀏覽器中被瀏覽的HTML頁面中間)的引用。

          但是當我們運行這段代碼時,我們看到它如愿工作并顯示被點擊按鈕的id。究竟其中發生了什么另我們使每個按鈕的onclick方法包含buttonClicked對象引用,而無論之前那里有什么?,F在無論按鈕什么時候被點擊,瀏覽器都會運行一些類似下行的東西:

          myButton.onclick();

          那畢竟不是這么混亂,是吧?只要你了解有別的對象要進行處理并想在這些對象的事件上,如點擊按鈕,進行什么行動后發生了什么就行了。

          var myHelper =
          {
              formFields: [],
              emptyAllFields: function(){for(i=0; i < this.formFields.length; i++){var elementID = this.formFields[i];
                      var field = document.getElementById(elementID);
                      field.value = '';
                  }}};
          ?
          //tell which form fields we want to work with
          myHelper.formFields.push('txtName');
          myHelper.formFields.push('txtEmail');
          myHelper.formFields.push('txtAddress');
          ?
          //clearing the text boxes:
          myHelper.emptyAllFields();
          ?
          var clearButton = document.getElementById('btnClear');
          clearButton.onclick = myHelper.emptyAllFields;

          因此你想:好了,現在我可以在我的頁面上點擊Clear按鈕,那三個文本框就將被清空。然后你嘗試點擊該按鈕后僅得到一個運行時錯誤。該錯誤將涉及(猜猜是什么?)this關鍵字。該問題是this.formFields沒被定義即便this包含了一個到按鈕的引用,那正是現在所發生的。一個快速的解決方案是重寫我們最后一行的代碼。

          clearButton.onclick = function(){
              myHelper.emptyAllFields();
          };

          我們創建一個全新的函數,那種方法在協助對象的場景中調用了我們的協助方法。

          posted on 2006-10-23 14:06 智者無疆 閱讀(457) 評論(9)  編輯  收藏
          評論:
          • # re: 彈指一揮間,JavaScript烏鴉變鳳凰  白白 Posted @ 2006-10-23 14:29
            呵呵,精華,我也來學學!  回復  更多評論   

          • # re: 彈指一揮間,JavaScript烏鴉變鳳凰  self Posted @ 2006-10-27 17:25
            //--------------------JAVAscript樹形菜單-----------------------

            <%@ page contentType="text/html; charset=GBK" %>
            <html>
            <head>
            <title>
            jsp4
            </title>
            <style>
            <!--
            #foldheader{cursor:hand ; font-weight:bold ;
            list-style-image:url(fold.gif)}
            #foldinglist{list-style-image:url(/blog/list.gif)}
            //-->
            </style>
            <script language="JavaScript1.2">
            <!--
            var head="display:''"
            img1=new Image()
            img1.src="fold.gif"
            img2=new Image()
            img2.src="/blog/open.gif"

            function change(){
            if(!document.all)
            return
            if (event.srcElement.id=="foldheader") {//如果id是文件夾節點,
            var srcIndex = event.srcElement.sourceIndex//取得事件節點
            var nested = document.all[srcIndex+1] //得到所有嵌套節點
            if (nested.style.display=="none") { //如果嵌套節點為隱藏
            nested.style.display='' //則節點的播放樣式為顯示
            event.srcElement.style.listStyleImage="url(/blog/open.gif)"//源事件的樣式圖為開文件夾
            }
            else {//如果id是文件夾下的子節點
            nested.style.display="none"//則嵌套子節點的播放樣式為隱藏
            event.srcElement.style.listStyleImage="url(fold.gif)"//事件源樣式圖為關文件夾
            }
            }
            }

            document.onclick=change

            //-->
            </script>



            </head>
            <body bgcolor="#ffffff">
            <ul>
            <li id="foldheader">News</li>
            <ul id="foldinglist" style="display:none" style=&{head};>
            <li><a href="http://www.cnn.com">CNN</a></li>
            <li><a href="http://www.abcnews.com">ABC News</a></li>
            <li><a href="http://www.vancouversun.com">Vancouver Sun</a></li>
            </ul>
            <li id="foldheader">Games</li>
            <ul id="foldinglist" style="display:none" style=&{head};>
            <li><a href="http://www.gamespot.com">GameSpot</a></li>
            <li><a href="http://www.happypuppy.com">Happy Puppy</a></li>
            <li><a href="http://www.gamecenter.com">Game Center</a></li>
            </ul>
            </ul>
            </body>
            </html>
            <script>
            function test()
            {
            for(i=0;i<document.all[event.srcElement.id].length;i++)
            if(document.all[event.srcElement.id][i]==event.srcElement)
            alert("是第"+(i+1)+"個"+event.srcElement.id);
            }
            </script>
            <input type=checkbox name=mycheck id=mycheck value=12 onclick=test()>
            <input type=checkbox name=mycheck id=mycheck value=22 onclick=test()>
            <input type=checkbox name=mycheck id=mycheck value=22 onclick=test()>
            <input type=checkbox name=mycheck id=mycheck value=42 onclick=test()>  回復  更多評論   

          • # re: 彈指一揮間,JavaScript烏鴉變鳳凰  self Posted @ 2006-11-02 11:37
            //------------------js普通菜單--------------------------
            <html>
            <head>
            <style>
            ul#menu, ul#menu ul{
            list-style:none;
            margin:0;
            border-bottom:1px solid #DDD;
            border-right:1px solid #DDD;
            border-left:1px solid #DDD;
            width:100px;
            padding:0;
            font-size:14px;
            }
            ul#menu li{
            border-top:1px solid #DDD;
            position:relative;
            padding:4px;

            }
            ul#menu li ul{
            position:absolute;
            left:150px;
            _left:94px;
            top:0;
            display:none;
            }
            ul#menu li.over{
            background:#EEE;
            }
            ul#menu li.out{
            background:#fff;
            }
            ul#menu a{
            display:block;
            text-decoration:none;
            color:#000;
            _height:0;
            }
            </style>
            <script type="text/javascript">
            function initMenu(event,ul){
            if(!ul) ul = document.getElementById("menu");//得到一個元素對象ul,對應頂級元素ul id=menu;
            li = ul.getElementsByTagName("li"); //得到所有的元素對象數組li,每個元素的id=li;
            for(i=0;i<li.length;i++)//循環執行所有的元素。
            {
            li[i].onmouseover = function(){//當第i個元素有動作onmouseover時,執行函數(它li的樣式名為over)
            try{
            this.className='over';
            this.getElementsByTagName("ul")[0].style.display="block";//用這個元素得到其中第一個ul元素,使其display=block顯示
            }catch(e){};
            }
            li[i].onmouseout = function(){//當第i個元素有動作onmouseout時,執行函數(使它li的樣式名為out)
            try{
            this.className='out';
            this.getElementsByTagName("ul")[0].style.display="none";//用這個元素得到其中第一個ul元素,使其display=none,隱藏
            }catch(e){};
            }
            }
            }
            window.onload = initMenu;
            </script>
            </head>
            <body>
            <ul id="menu">
            <li>
            文件
            <ul>
            <li><a href="#">新建</a></li>
            <li><a href="#">打開</a></li>
            <li>
            另存類型>
            <ul>
            <li>文本文件>
            <ul>
            <li><a href="#">txt文件</a></li>
            <li><a href="#">doc文件</a></li>
            </ul>
            </li>
            <li>圖片文件></li>
            <ul>
            <li><a href="#">bmp文件</a></li>
            <li><a href="#">jpg文件</a></li>
            <li><a href="#">gif文件</a></li>
            </ul>

            </ul>
            <li>
            </ul>

            </li>
            <li>
            編輯
            <ul>
            <li><a href="#">全選</a></li>
            <li><a href="#">粘貼</a></li>
            <li><a href="#">復制</a></li>
            </ul>
            </li>


            <li>
            搜索
            <ul>
            <li><a href="#">查找</a></li>
            <li><a href="#">替換</a></li>
            <li><a href="#">轉換到行數</a></li>
            </ul>
            </li>
            </ul>
            </body>
            </html>
              回復  更多評論   

          • # re: 彈指一揮間,JavaScript烏鴉變鳳凰  self Posted @ 2006-11-02 13:33
            //------------------js二級聯動菜單------------------------------
            <TITLE>二級聯動</TITLE>
            <STYLE>

            select { font-size: 11px; font-family: Verdana;vertical-align: middle;margin: 3px;background:#ececec;color:#666666;}
            </STYLE>
            <body>
            <div id="tar"></div>
            <SCRIPT LANGUAGE="JavaScript" DEFER>
            var fMenu = ["上海","北京","廣東","南京"]
            var fValue = ["shanghai","beijing","guadong","nanjing"]
            var sMenu = [["楊浦區","徐匯區","黃浦區","盧灣區"],["豐臺區","海淀區","朝陽區","西城區","東城區"],["廣州","深圳"],["雨花臺"]]
            var sValue = [["yp","xh","hp","lw"],["ft","hd","cy","xc","dc"],["gz","sz"],["yht"]]

            var oWhere = document.all.tar;//得到div對象
            var ofMenu = document.createElement("<SELECT name='main'>");//創建一個名為main的select對象,對應城市,
            var osMenu = document.createElement("<SELECT name='sub'>");//創建一個名為sub的select對象,對應城區。
            with(oWhere)appendChild(ofMenu),appendChild(osMenu);//用div對像添加城市對象,再添加城區對象。

            createMainOptions();
            createSubOptions(0);

            ofMenu.onchange = function() {
            createSubOptions(this.selectedIndex);//當城市選擇對象發生onchange事件時,根據選擇的id號創建城區對象
            }
            //創建城市選項數組
            function createMainOptions() {
            for(var i=0;i<fMenu.length;i++)ofMenu.options[i] = new Option(fMenu[i],fValue[i]);
            //根據城市數組長度,依次創建選擇對象Option,并添加進城市的option數組
            }
            //創建城區選項數組
            function createSubOptions(j){//根據城市數組下標,創建城區對象,并添加進城區option對象數組
            with(osMenu) {
            length=0;
            for(var i=0;i<sMenu[j].length;i++)osMenu.options[i] = new Option(sMenu[j][i],sValue[j][i]);
            }
            }
            </SCRIPT>
            <div style="background:#E7E3DE;text-align:right;font-family:'Arial';font-size:10px;margin-top:10px;"><a href="mailto:cloudchen@yeah.net">mailto:cloudchen</a></div><div style="background:#666666;color:white;font-family:'Arial';font-size:10px;">2003.8.19</div>

            </body>  回復  更多評論   

          • # re: 彈指一揮間,JavaScript烏鴉變鳳凰  selft Posted @ 2006-11-08 11:40
            //------------js的拖動類及其廣泛應用=----------------------------
            文件1.拖動類文件:文件名可為:dd.js
            function ObjectDragDrop(obj){ //定義拖動類
            var me = this; //把一個應用此函數的網頁對象傳進來賦值給me.
            this.foo = (typeof obj=="string")?document.getElementById(obj):obj; //給foo賦值,值為應用此函數的網頁中的對象

            this.foo.onmousedown = function(e){ //當鼠標落下時
            var foo = me.foo; //把網頁對象賦值給foo.
            e = e||event; //獲得事件對象;
            if( e.layerX ){ foo.oOffset = {x:e.layerX, y:e.layerY }; }//若事件對象的坐標x不為null,
            else { foo.oOffset = {x:e.offsetX, y:e.offsetY }; }
            document.onmousemove = me.drag; //拖動事件發生時,事件對象坐標重新賦值
            document.onmouseup = me.drop; //事件坐標重新賦值null
            document.onselectstart = function(){ return false; };
            }

            this.drag = function(e){ //拖動函數,改變事件對象的位置
            var foo = me.foo;
            e=e||event;
            foo.style.top = e.clientY - foo.oOffset.y + "px";
            foo.style.left = e.clientX - foo.oOffset.x + "px";
            }

            this.drop = function(e){ //放開鼠標時,各個文檔對象事件都賦值為null
            e=e||event;
            document.onmousemove = document.onmouseup = document.onselectstart = null;
            }
            }
            文件2.應用例子:test.html
            <html>
            <head>
            <title>Drag 'n' Drop Demo</title>
            <style>
            #foo {
            position:absolute;
            top:100px;
            left:100px;
            width:100px;
            height:100px;
            background-color:#f0f0f0;
            border:solid 1px #121212;
            }
            #foo1 {
            position:absolute;
            top:150px;
            left:130px;
            width:100px;
            height:100px;
            background-color:#fff0f0;
            border:solid 1px #121212;
            }
            </style>



            </head>
            <body>
            <script src="dd.js"></script>
            <script>
            window.onload = function(){
            var test = new ObjectDragDrop("foo");
            var test1 = new ObjectDragDrop("foo1");
            var test2 = new ObjectDragDrop("p1");
            var test3 = new ObjectDragDrop("img1");
            }
            </script>
            <h1>最簡單的拖動演示</h1>

            <input name=name type=text id="foo">
            <div id="foo1">test<br>test2</div>
            <img style="position:absolute;left:400px;top:750px;"
            src="C:\Documents and Settings\dragon\My Documents\My Pictures\images\01.jpg" id="img1">

            </body>
            </html>
            注意事項:
            1.引入js文件時:<script src="dd.js"></script>不能用:<script src="dd.js"/>的形式
            2.style="position:absolute;left:400px;top:750px;"必須為每個元素對象定義類似這樣的位置  回復  更多評論   

          • # re: 彈指一揮間,JavaScript烏鴉變鳳凰  selft Posted @ 2006-11-08 11:54
            3.new 拖動對象時的次序最好與頁面元素id號的次序一致。  回復  更多評論   

          • # re: 彈指一揮間,JavaScript烏鴉變鳳凰  selft Posted @ 2006-11-08 12:10
            http://www.aspxboy.com/myjs/
            js特效  回復  更多評論   

          • # re: 彈指一揮間,JavaScript烏鴉變鳳凰  self Posted @ 2007-03-02 12:54
            http://www.cublog.cn/u/23633/showart_211908.html  回復  更多評論   

          • # js菜單大集合  self Posted @ 2007-03-02 12:55
            http://www.cublog.cn/u/23633/showart_211908.html   回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
           
          Copyright © 智者無疆 Powered by: 博客園 模板提供:滬江博客


             觀音菩薩贊

          主站蜘蛛池模板: 汉沽区| 佛教| 云和县| 兰坪| 宜都市| 边坝县| 松桃| 寿阳县| 淳安县| 福清市| 辛集市| 中卫市| 大关县| 长泰县| 宝山区| 科技| 台前县| 阜宁县| 留坝县| 柳河县| 富宁县| 海淀区| 文山县| 石泉县| 扎赉特旗| 阳西县| 阳江市| 马公市| 杭锦后旗| 文登市| 福泉市| 赤水市| 富平县| 德保县| 涪陵区| 娄底市| 怀远县| 寿阳县| 布尔津县| 扶绥县| 肥东县|