此文以實例為基礎一步步說明了jQuery的工作方式。現以中文翻譯(添加我的補充說明)如下。如有相關意見或建議請麻煩到我的 BLOG 寫個回復或者 EMAIL 告知。
英文原版:http://jquery.bassistance.de/jquery-getting-started.html ,感謝原文作者 Jörn Zaefferer
本文發(fā)布已征求原作者同意。
另外我認為在學習過程中,有兩個API文檔你要打開隨時查看:
這個指南是一個對jQuery庫的說明,要求讀者了解HTML(DOM)和CSS的一些常識。它包括了一個簡單的Hello World的例子,選擇器和事件基礎,AJAX、FX的用法,以及如何制作jQuery的插件。 這個指南包括了很多代碼,你可以copy它們,并試著修改它們,看看產生的效果。
一開始,我們需要一個jQuery的庫,最新的下載可以到這里找到。這個指南提供一個基本包含實例的包供下載.
(譯者Keel注:一定要下載這個包,光看文章不實踐肯定是不行的。)
下載后解壓縮,然后用你最喜歡的文本編輯器打開starterkit.html和custom.js這兩個文件。(譯者Keel注:這兩個就是例子文件,所有的例子都用這兩個例子作出,custom.js寫jQuery代碼,starterkit.html觀察效果.建議用editPlus打開)
現在,我們就已經做好了一切準備來進行這個著名的"Hello world"例子.
在做所有事情之前,我們要讓jQuery讀取和處理文檔的DOM,必須盡可能快地在DOM載入后開始執(zhí)行事件,所以,我們用一個ready事件作為處理HTML文檔的開始.看看我們打開的custom.js這個文件,里面已經準備好了:
$(document).ready(function() { // do stuff when DOM is ready });
放一個簡單的alert事件在需要等DOM完成載入,所以我們把任務稍稍變復雜一點:在點擊任何一個鏈接時顯示一個alert.
$(document).ready(function() { $("a").click(function() { alert("Hello world!"); }); });
這樣在你點擊頁面的一個鏈接時都會觸發(fā)這個"Hello world"的提示。
(譯者Keel注:請照此代碼修改custom.js并保存,然后用瀏覽器打開starterkit.html觀察效果。)
讓我們看一下這些修改是什么含義。$("a") 是一個jQuery選擇器(selector),在這里,它選擇所有的a標簽(譯者Keel注:即<a></a>),$號是 jQuery “類”(jQuery "class")的一個別稱,因此$()構造了一個新的jQuery 對象(jQuery object)。函數 click() 是這個jQuery對象的一個方法,它綁定了一個單擊事件到所有選中的標簽(這里是所有的a標簽),并在事件觸發(fā)時執(zhí)行了它所提供的alert方法.
這里有一個擬行相似功能的代碼:
<a href="#" onclick="alert('Hello world')">Link</a>
不同之處很明顯,用jQuery不需要在每個a標簽上寫onclick事件,所以我們擁有了一個整潔的結構文檔(HTML)和一個行為文檔(JS),達到了將結構與行為分開的目的,就像我們使用CSS追求的一樣.
下面我們會更多地了解到選擇器與事件.
jQuery提供兩種方式來選擇html的elements,第一種是用CSS和Xpath選擇器聯合起來形成一個字符串來傳送到jQuery的構造器(如:$("div > ul a"));第二種是用jQuery對象的幾個methods(方法)。這兩種方式還可以聯合起來混合使用。
為了測試一下這些選擇器,我們來試著在我們starterkit.html中選擇并修改第一個ordered list.
一開始,我們需要選擇這個list本身,這個list有一個ID叫“orderedlist”,通常的javascript寫法是document.getElementById("orderedlist").在jQuery中,我們這樣做:
$(document).ready(function() { $("#orderedlist").addClass("red"); });
這里將starterkit中的一個CSS樣式red附加到了orderedlist上(譯者Keel注:參考測試包中的css目錄下的core.css,其中定義了red樣式)。因此,在你刷新了starterkit.html后,你將會看到第一個有序列表(ordered list )背景色變成了紅色,而第二個有序列表沒有變化.
現在,讓我們添加一些新的樣式到list的子節(jié)點.
$(document).ready(function() { $("#orderedlist > li").addClass("blue"); });
這樣,所有orderedlist中的li都附加了樣式"blue"。
現在我們再做個復雜一點的,當把鼠標放在li對象上面和移開時進行樣式切換,但只在list的最后一個element上生效。
$(document).ready(function() { $("#orderedlist li:last").hover(function() { $(this).addClass("green"); }, function() { $(this).removeClass("green"); }); });
還有大量的類似的CSS和XPath例子,更多的例子和列表可以在這里找到。(譯者Keel注:入門看此文,修行在個人,要想在入門之后懂更多,所以這段話的幾個鏈接遲早是要必看的!不會又要翻譯吧...^_^!)
每一個onXXX事件都有效,如onclick,onchange,onsubmit等,都有jQuery等價表示方法(譯者Keel注:jQuery不喜歡onXXX,所以都改成了XXX,去掉了on)。其他的一些事件,如ready和hover,也提供了相應的方法。
你可以在Visual jQuery找到全部的事件列表,在Events欄目下.
用這些選擇器和事件你已經可以做很多的事情了,但這里有一個更強的好東東!
$(document).ready(function() { $("#orderedlist").find("li").each(function(i) { $(this).html( $(this).html() + " BAM! " + i ); }); });
find() 讓你在已經選擇的element中作條件查找,因此 $("#orderedlist).find("li") 就像 $("#orderedlist li"). each()一樣迭代了所有的li,并可以在此基礎上作更多的處理。 大部分的方法,如addClass(), 都可以用它們自己的 each() 。在這個例子中, html()用來獲取每個li的html文本, 追加一些文字,并將之設置為li的html文本。(譯者Keel注:從這個例子可以看到.html()方法是獲取對象的html代碼,而.html('xxx')是設置'xxx'為對象的html代碼)
另一個經常碰到的任務是在沒有被jQuery覆蓋的DOM元素上call一些方法,想像一個在你用AJAX方式成功提交后的reset:
$(document).ready(function() { // use this to reset a single form $("#reset").click(function() { $("#form")[0].reset(); }); });
(譯者Keel注:這里作者將form的id也寫成了form,源文件有<form id="form">,這是非常不好的寫法,你可以將這個ID改成form1或者testForm,然后用$("#form1")或者$("#testForm")來表示它,再進行測試。)
這個代碼選擇了所有ID為"form"的元素,并在其第一個上call了一個reset()。如果你有一個以上的form,你可以這樣做:
$(document).ready(function() { // use this to reset several forms at once $("#reset").click(function() { $("form").each(function() { this.reset(); }); }); });
(譯者Keel注:請注意一定要親自將這些代碼寫在custom.js中并在starterkit.html上測試效果才能有所體會!必要時要觀察starterkit.html的html代碼)
這樣你在點擊Reset鏈接后,就選擇了文檔中所有的form元素,并對它們都執(zhí)行了一次reset()。
還有一個你可能要面對的問題是不希望某些特定的元素被選擇。jQuery 提供了filter() 和not() 方法來解決這個問題。 filter()以過濾表達式來減少不符合的被選擇項, not()則用來取消所有符合過濾表達式的被選擇項. 考慮一個無序的list,你想要選擇所有的沒有ul子元素的li元素。
$(document).ready(function() { $("li").not("[ul]").css("border", "1px solid black"); });
這個代碼選擇了所有的li元素,然后去除了沒有ul子元素的li元素。刷新瀏覽器后,所有的li元素都有了一個邊框,只有ul子元素的那個li元素例外。
(譯者Keel注:請注意體會方便之極的css()方法,并再次提醒請務必實際測試觀察效果,比方說換個CSS樣式呢?再加一個CSS樣式呢?像這樣:$("li").not("[ul]").css("border", "1px solid black").css("color","red");)
上面代碼中的[expression] 語法是從XPath而來,可以在子元素和屬性(elements and attributes)上用作過濾器,比如你可能想選擇所有的帶有name屬性的鏈接:
$(document).ready(function() { $("a[@name]").background("#eee"); });
這個代碼給所有帶有name屬性的鏈接加了一個背景色。(譯者Keel注:這個顏色太不明顯了,建議寫成$("a[@name]").background("red");)
更常見的情況是以name來選擇鏈接,你可能需要選擇一個有特點href屬性的鏈接,這在不同的瀏覽器下對href的理解可能會不一致,所以我們的部分匹配("*=")的方式來代替完全匹配("="):
$(document).ready(function() { $("a[@href*=/content/gallery]").click(function() { // do something with all links that point somewhere to /content/gallery }); });
到現在為止,選擇器都用來選擇子元素或者是過濾元素。另外還有一種情況是選擇上一個或者下一個元素,比如一個FAQ的頁面,答案首先會隱藏,當問題點擊時,答案顯示出來,jQuery代碼如下:
$(document).ready(function() { $('#faq').find('dd').hide().end().find('dt').click(function() { var answer = $(this).next(); if (answer.is(':visible')) { answer.slideUp(); } else { answer.slideDown(); } }); });
這里我們用了一些鏈式表達法來減少代碼量,而且看上去更直觀更容易理解。像'#faq' 只選擇了一次,利用end()方法,第一次find()方法會結束(undone),所以我們可以接著在后面繼續(xù)find('dt'),而不需要再寫$('#faq').find('dt')。
在點擊事件中的,我們用 $(this).next() 來找到dt下面緊接的一個dd元素,這讓我們可以快速地選擇在被點擊問題下面的答案。
(譯者Keel注:這個例子真是太酷了,FAQ中的答案可以收縮!從利用next()的思路到實現這些效果都有很多地方需要我們消化,注意 if (answer.is(':visible'))用法,注意answer.slideUp();不懂的地方趕緊查我在最開始提到的兩個必看API文檔)
除了選擇同級別的元素外,你也可以選擇父級的元素。可能你想在用戶鼠標移到文章某段的某個鏈接時,它的父級元素--也就是文章的這一段突出顯示,試試這個:
$(document).ready(function() { $("a").hover(function() { $(this).parents("p").addClass("highlight"); }, function() { $(this).parents("p").removeClass("highlight"); }); });
測試效果可以看到,移到文章某段的鏈接時,它所在的段全用上highlight樣式,移走之后又恢復原樣。
(譯者Keel注:highlight是core.css中定義的樣式,你也可以改變它,注意這里有第二個function()這是hover方法的特點,請在API文檔中查閱hover,上面也有例子說明)在我們繼續(xù)之前我們先來看看這一步: jQuery會讓代碼變得更短從而更容易理解和維護,下面是$(document).ready(callback)的縮寫法:
$(function() { // code to execute when the DOM is ready });
應用到我們的Hello world例子中,可以這樣:
$(function() { $("a").click(function() { alert("Hello world!"); }); });
現在,我們手上有了這些基礎的知識,我們可以更進一步的探索其它方面的東西,就從AJAX開始!
在這一部分我們寫了一個小小的AJAX應用,它能夠rate一些東西(譯Keel注:就是對某些東西投票),就像在youtube.com上面看到的一樣。
首先我們需要一些服務器端代碼,這個例子中用到了一個PHP文件,讀取rating參數然后返回rating總數和平均數。看一下rate.php代碼.
雖然這些例子也可以不使用AJAX來實現,但顯示我們不會那么做,我們用jQuery生成一個DIV容器,ID是"rating".
$(document).ready(function() { // generate markup var ratingMarkup = ["Please rate: "]; for(var i=1; i <= 5; i++) { ratingMarkup[ratingMarkup.length] = "<a href='#'>" + i + "</a> "; } // add markup to container and applier click handlers to anchors $("#rating").append( ratingMarkup.join('') ).find("a").click(function(e) { e.preventDefault(); // send requests $.post("rate.php", {rating: $(this).html()}, function(xml) { // format result var result = [ "Thanks for rating, current average: ", $("average", xml).text(), ", number of votes: ", $("count", xml).text() ]; // output result $("#rating").html(result.join('')); } ); }); });
這段代碼生成了5個鏈接,并將它們追加到id為"rating"容器中,當其中一個鏈接被點擊時,該鏈接標明的分數就會以rating參數形式發(fā)送到rate.php,然后,結果將以XML形式會從服務器端傳回來,添加到容器中,替代這些鏈接。
如果你沒有一個安裝過PHP的webserver,你可以看看這個在線的例子.
不使用javascript實現的例子可以訪問 softonic.de 點擊 "Kurz bewerten!"
更多的AJAX方法可以從這里 找到,或者看看API文檔 下面的AJAX filed under AJAX.
(譯者Keel注:這個在線實例從國內訪問還是比較慢的,點擊后要等一會兒才能看到結果,可以考慮對它進行修改,比如加上loading,投票后加上再投票的返回鏈接等。此外,這個例子中還是有很多需要進一步消化的地方,看不懂的地方請參考API文檔。)
一個在使用AJAX載入內容時經常發(fā)生的問題是:當載入一個事件句柄到一個HTML文檔時,還需要在載入內容上應用這些事件,你不得不在內容加載完成后應用這些事件句柄,為了防止代碼重復執(zhí)行,你可能用到如下一個function:
// lets use the shortcut $(function() { var addClickHandlers = function() { $("a.clickMeToLoadContent").click(function() { $("#target").load(this.href, addClickHandlers); }); }; addClickHandlers(); });
現在,addClickHandlers只在DOM載入完成后執(zhí)行一次,這是在用戶每次點擊具有clickMeToLoadContent 這個樣式的鏈接并且內容加載完成后.
請注意addClickHandlers函數是作為一個局部變量定義的,而不是全局變量(如:function addClickHandlers() {...}),這樣做是為了防止與其他的全局變量或者函數相沖突.
另一個常見的問題是關于回調(callback)的參數。你可以通過一個額外的參數指定回調的方法,簡單的辦法是將這個回調方法包含在一個其它的function中:
// get some data var foobar = ...; // specify handler, it needs data as a paramter var handler = function(data) { ... }; // add click handler and pass foobar! $('a').click( function(event) { handler(foobar); } ); // if you need the context of the original handler, use apply: $('a').click( function(event) { handler.apply(this, [foobar]); } );
用到簡單的AJAX后,我們可以認為已經非常之“web2.0”了,但是到現在為止,我們還缺少一些酷炫的效果。下一節(jié)將會談到這些效果.
一些動態(tài)的效果可以使用 show()
和 hide()
來表現:
$(document).ready(function() { $("a").toggle(function() { $(".stuff").hide('slow'); }, function() { $(".stuff").show('fast'); }); });
你可以與 animate()
聯合起來創(chuàng)建一些效果,如一個帶漸顯的滑動效果:
$(document).ready(function() { $("a").toggle(function() { $(".stuff").animate({ height: 'hide', opacity: 'hide' }, 'slow'); }, function() { $(".stuff").animate({ height: 'show', opacity: 'show' }, 'slow'); }); });
很多不錯的效果可以訪問interface plugin collection. 這個站點提供了很多demos和文檔
這些效果插件是位于jQuery插件列表的前面的,當然也有很多其他的插件,比如我們下一章講到的表格排序插件。
這個表格排序插件能讓我們在客戶端按某一列進行排序,引入jQuery和這個插件的js文件,然后告訴插件你想要哪個表格擁有排序功能。
要測試這個例子,先在starterkit.html中加上像下面這一行的代碼:
<script src="lib/jquery.tablesorter.js" type="text/javascript"></script>
然后可以這樣調用不著:
$(document).ready(function() { $("#large").tableSorter(); });
現在點擊表格的第一行head區(qū)域,你可以看到排序的效果,再次點擊會按倒過來的順序進行排列。
這個表格還可以加一些突出顯示的效果,我們可以做這樣一個隔行背景色(斑馬線)效果:
$(document).ready(function() { $("#large").tableSorter({ stripingRowClass: ['odd','even'], // Class names for striping supplyed as a array. stripRowsOnStartUp: true // Strip rows on tableSorter init. }); });
關于這個插件的更多例子和文檔可以在 tablesorter首頁找到.
幾乎所有的特件都是這樣用的:先include插件的js文件,然后在某些元素上使用插件定義的方法,當然也有一些參數選項是可以配置的
經常更新的插件列表可以從jQuery官方站 on the jQuery site找到.
當你更經常地使用jQuery時,你會發(fā)現將你自己的代碼打包成插件是很有用處的,它能方便地讓你的公司或者其他人進行重用.下一章我們將談到如何構建一個自己的插件.
寫一個自己的jQuery插件是非常容易的,如果你按照下面的原則來做,可以讓其他人也容易地結合使用你的插件.
jQuery.fn.foobar = function() { // do something };
jQuery.fooBar = { height: 5, calculateBar = function() { ... }, checkDependencies = function() { ... } };
你現在可以在你的插件中使用這些幫助函數了:
jQuery.fn.foobar = function() { // do something jQuery.foobar.checkDependencies(value); // do something else };
jQuery.fn.foobar = function(options) { var settings = { value: 5, name: "pete", bar: 655 }; if(options) { jQuery.extend(settings, options); } };
現在可以無需做任何配置地使用插件了,默認的參數在此時生效:
$("...").foobar();
或者加入這些參數定義:
$("...").foobar({ value: 123, bar: 9 });
如果你release你的插件, 你還應該提供一些例子和文檔,大部分的插件都具備這些良好的參考文檔.
現在你應該有了寫一個插件的基礎,讓我們試著用這些知識寫一個自己的插件.
很多人試著控制所有的radio或者checkbox是否被選中,比如:
$("input[@type='checkbox']").each(function() { this.checked = true; // or, to uncheck this.checked = false; // or, to toggle this.checked = !this.checked; });
無論何時候,當你的代碼出現each時,你應該重寫上面的代碼來構造一個插件,很直接地:
$.fn.check = function() { return this.each(function() { this.checked = true; }); };
這個插件現在可以這樣用:
$("input[@type='checkbox']").check();
現在你應該還可以寫出uncheck()和toggleCheck()了.但是先停一下,讓我們的插件接收一些參數.
$.fn.check = function(mode) { var mode = mode || 'on'; // if mode is undefined, use 'on' as default return this.each(function() { switch(mode) { case 'on': this.checked = true; break; case 'off': this.checked = false; break; case 'toggle': this.checked = !this.checked; break; } }); };
這里我們設置了默認的參數,所以將"on"參數省略也是可以的,當然也可以加上"on","off", 或 "toggle",如:
$("input[@type='checkbox']").check(); $("input[@type='checkbox']").check('on'); $("input[@type='checkbox']").check('off'); $("input[@type='checkbox']").check('toggle');
如果有多于一個的參數設置會稍稍有點復雜,在使用時如果只想設置第二個參數,則要在第一個參數位置寫入null.
從上一章的tablesorter插件用法我們可以看到,既可以省略所有參數來使用或者通過一個 key/value 對來重新設置每個參數.
作為一個練習,你可以試著將 第四章 的功能重寫為一個插件.這個插件的骨架應該是像這樣的:
$.fn.rateMe = function(options) { var container = this; // instead of selecting a static container with $("#rating"), we now use the jQuery context var settings = { url: "rate.php" // put more defaults here // remember to put a comma (",") after each pair, but not after the last one! }; if(options) { // check if options are present before extending the settings $.extend(settings, options); } // ... // rest of the code // ... return this; // if possible, return "this" to not break the chain });
如果你想做更好的javascript開發(fā),建議你使用一個叫 FireBug的firefox插件. 它提供了斷點調試(比alert強多了)、觀察DOM變化等很多漂亮的功能
如果你還有未解決的問題,或者新的想法與建議,你可以使用jQuery的郵件列表 jQuery mailing list.
大大感謝John Resig創(chuàng)造了這么好的library! 感謝jQuery community 為John提供了如此多的咖啡和其他的一切!
window.showModalDialog()方法用來創(chuàng)建一個顯示HTML內容的模態(tài)對話框,由于是對話框,因此它并沒有一般用window.open()打開的窗口的所有屬性。
window.showModelessDialog()方法用來創(chuàng)建一個顯示HTML內容的非模態(tài)對話框。
當我們用showModelessDialog()打開窗口時,不必用window.close()去關閉它,當以非模態(tài)方式[IE5]打開時, 打開對話框的窗口仍可以進行其他的操作,即對話框不總是最上面的焦點,當打開它的窗口URL改變時,它自動關閉。而模態(tài)[IE4]方式的對話框始終有焦點(焦點不可移走,直到它關閉)。模態(tài)對話框和打開它的窗口相聯系,因此我們打開另外的窗口時,他們的鏈接關系依然保存,并且隱藏在活動窗口的下面。
使用方法如下:
vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures])
vReturnValue = window.showModelessDialog(sURL [, vArguments] [, sFeatures])
參數說明:
sURL
必選參數,類型:字符串。用來指定對話框要顯示的文檔的URL。
vArguments
可選參數,類型:變體。用來向對話框傳遞參數。傳遞的參數類型不限,包括數組等。對話框通過window.dialogArguments來取得傳遞進來的參數。
sFeatures
可選參數,類型:字符串。用來描述對話框的外觀等信息,可以使用以下的一個或幾個,用分號“;”隔開。
dialogHeight 對話框高度,不小于100px,IE4中dialogHeight 和 dialogWidth 默認的單位是em,而IE5中是px,為方便其見,在定義modal方式的對話框時,用px做單位。
dialogWidth: 對話框寬度。
dialogLeft: 距離桌面左的距離。
dialogTop: 離桌面上的距離。
center: {yes | no | 1 | 0 }:窗口是否居中,默認yes,但仍可以指定高度和寬度。
help: {yes | no | 1 | 0 }:是否顯示幫助按鈕,默認yes。
resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改變大小。默認no。
status: {yes | no | 1 | 0 } [IE5+]:是否顯示狀態(tài)欄。默認為yes[ Modeless]或no[Modal]。
scroll:{ yes | no | 1 | 0 | on | off }:指明對話框是否顯示滾動條。默認為yes。
還有幾個屬性是用在HTA中的,在一般的網頁中一般不使用。
dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印預覽時對話框是否隱藏。默認為no。
edge:{ sunken | raised }:指明對話框的邊框樣式。默認為raised。
unadorned:{ yes | no | 1 | 0 | on | off }:默認為no。
傳入參數:
要想對話框傳遞參數,是通過vArguments來進行傳遞的。類型不限制,對于字符串類型,最大為4096個字符。也可以傳遞對象,例如:
test1.htm
<script>
var mxh1 = new Array("mxh","net_lover","孟子E章")
var mxh2 = window.open("about:blank","window_mxh")
// 向對話框傳遞數組
window.showModalDialog("test2.htm",mxh1)
// 向對話框傳遞window對象
window.showModalDialog("test3.htm",mxh2)
</script>test2.htm
<script>
var a = window.dialogArguments
alert("您傳遞的參數為:" + a)
</script>
test3.htm
<script>
var a = window.dialogArguments
alert("您傳遞的參數為window對象,名稱:" + a.name)
</script>
可以通過window.returnValue向打開對話框的窗口返回信息,當然也可以是對象。例如:
test4.htm
<script>
var a = window.showModalDialog("test5.htm")
for(i=0;i<a.length;i++) alert(a[i])
</script>test5.htm
<script>
function sendTo()
{
var a=new Array("a","b")
window.returnValue = a
window.close()
}
</script>
<body>
<form>
<input value="返回" type=button onclick="sendTo()">
</form>
常見問題:
1,如何在模態(tài)對話框中進行提交而不新開窗口?
如果你 的 瀏覽器是IE5.5+,可以在對話框中使用帶name屬性的iframe,提交時可以制定target為該iframe的name。對于IE4+,你可以用高度為0的frame來作。例如:
test6.htm
<script>
window.showModalDialog("test7.htm")
</script> test7.htm
if(window.location.search) alert(window.location.search)
<frameset rows="0,*">
<frame src="about:blank">
<frame src="test8.htm">
</frameset> test8.htm
<form target="_self" method="get">
<input name=txt value="test">
<input type=submit>
</form>
<script>
if(window.location.search) alert(window.location.search)
</script>
2,可以通過http://servername/virtualdirname/test.htm?name=mxh方式直接向對話框傳遞參數嗎?
答案是不能。但在frame里是可以的。
用window.showModalDialog 或者window.showModelessDialog打開一個模式窗口后,和父窗口的一些交互問題。
要進行交互操作的前提,在調用showModalDialog或者showModelessDialog方法的時候,第二個參數傳window,如:
- window.showModelessDialog('filename.htm',window,'dialogWidth=200px;dialogHeight=250px;')
接下來,就是取得父窗口的一些數據和方法,這是經常會用的,父窗口取子窗口的參數一般通過returnValue就可以搞定了~
- //取得父窗口的JS變量 var
window.dialogArguments.var;
//獲得父窗口的對象和屬性
window.dialogArguments.form1.name.value ;
//調用父窗口的方法 fun
window.dialogArguments.fun() ;
3.setInterval()和clearInterval()兩個函數,和以上兩個函數大同小異,區(qū)別在于前者用來定時要在將來某個時候執(zhí)行一次的函數或者表達式;而后者多用于要反復調用的函數和語句,他們之間只間隔一個固定的時間,這個時間過程中不是一個等待的過程,因為當延遲其作用時,其它的處理過程并不掛起!所以用setInterval()來制作網頁動畫要更合理一些!他們的語法格式是:
iTimerID = window.setInterval(vCode, iMilliSeconds [, sLanguage])
Demo1:
Domo2:
Demo3:
補充:這四個函數確切的說,是window對象的方法,window 是DOM中的一個頂級對象。只是如果不寫對象名,就默認是window,就像alert()等用于window.alert()一樣!
方法或者屬性 描述
BuildPath()
生成一個文件路徑
CopyFile() 復制文件
CopyFolder() 復制目錄
CreateFolder() 創(chuàng)建新目錄
CreateTextFile() 生成一個文件
DeleteFile() 刪除一個文件
DeleteFolder() 刪除一個目錄
DriveExists() 檢驗盤符是否存在
Drives 返回盤符的集合
FileExists() 檢驗文件是否存在
FolderExists 檢驗一個目錄是否存在
GetAbsolutePathName() 取得一個文件的絕對路徑
GetBaseName() 取得文件名
GetDrive() 取得盤符名
GetDriveName() 取得盤符名
GetExtensionName() 取得文件的后綴
GetFile() 生成文件對象
GetFileName() 取得文件名
GetFolder() 取得目錄對象
GetParentFolderName 取得文件或目錄的父目錄名
GetSpecialFolder() 取得特殊的目錄名
GetTempName() 生成一個臨時文件對象
MoveFile() 移動文件
MoveFolder() 移動目錄
OpenTextFile() 打開一個文件流
f.Files //目錄下所有文件集合
f.attributes //文件屬性
Case 0 Str="普通文件。沒有設置任何屬性。 "
Case 1 Str="只讀文件。可讀寫。 "
Case 2 Str="隱藏文件。可讀寫。 "
Case 4 Str="系統(tǒng)文件。可讀寫。 "
Case 16 Str="文件夾或目錄。只讀。 "
Case 32 Str="上次備份后已更改的文件。可讀寫。 "
Case 1024 Str="鏈接或快捷方式。只讀。 "
Case 2048 Str=" 壓縮文件。只讀。"
f.Datecreated // 創(chuàng)建時間
f.DateLastAccessed //上次訪問時間
f.DateLastModified // 上次修改時間
f.Path //文件路徑
f.Name //文件名稱
f.Type //文件類型
f.Size // 文件大小(單位:字節(jié))
f.ParentFolder //父目錄
f.RootFolder // 根目錄
實例說明
BuildPath(路徑,文件名) //這個方法會對給定的路徑加上文件,并自動加上分界符
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
var newpath = fso.BuildPath("c:\\tmp", "51js.txt"); //生成 c:\tmp\51js.txt的路徑
alert(newpath);
-->
</SCRIPT>
CopyFile(源文件, 目標文件, 覆蓋) //復制源文件到目標文件,當覆蓋值為true時,如果目標文件存在會把文件覆蓋
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
var newpath = fso.CopyFile("c:\\autoexec.bat", "d:\\autoexec.bak");
-->
</SCRIPT>
CopyFolder(對象目錄,目標目錄 ,覆蓋) //復制對象目錄到目標目錄,當覆蓋為true時,如果目標目錄存在會把文件覆蓋
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
fso.CopyFolder("c:\\WINDOWS\\Desktop", "d:\\"); //把C盤的Desktop目錄復制到D盤的根目錄
-->
</SCRIPT>
CreateFolder(目錄名) //創(chuàng)建一個新的目錄
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
var newFolderName = fso.CreateFolder("c:\\51JS"); //在C盤上創(chuàng)建一個51JS的目錄
-->
</SCRIPT>
CreateTextFile(文件名, 覆蓋) //創(chuàng)建一個新的文件,如果此文件已經存在,你需要把覆蓋值定為true
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
var newFileObject = fso.CreateTextFile("c:\\autoexec51JS.bat", true); //腳本將在C盤創(chuàng)建一個叫 autoexec51JS.bat的文件
-->
</SCRIPT>
DeleteFile(文件名, 只讀?) //刪除一個文件,如果文件的屬性是只讀的話,你需要把只讀值設為true
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject"); //為了安全我先把要刪除的autoexec.bat備份到你的D盤
var newpath = fso.CopyFile("c:\\autoexec.bat", "d:\\autoexec.bat"); //把C盤的autoexec.bat文件刪除掉
fso.DeleteFile("c:\\autoexec.bat", true);
-->
</SCRIPT>
DeleteFolder(文件名, 只讀?)//刪除一個目錄,如果目錄的屬性是只讀的話,你需要把只讀值設為true
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
fso.CopyFolder("c:\\WINDOWS\\Desktop", "d:\\"); //為了安全我先把你C盤的Desktop目錄復制到你D盤的根目錄
fso.DeleteFolder("c:\\WINDOWS\\Desktop", true); //把你的Desktop目錄刪除,但因為desktop是系統(tǒng)的東西,所以不能全部刪除,但.........
-->
</SCRIPT>
DriveExists(盤符) //檢查一個盤是否存在,如果存在就返會真,不存在就返回.......
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
hasDriveD = fso.DriveExists("d"); //檢查系統(tǒng)是否有D盤存在
hasDriveZ = fso.DriveExists("z"); //檢查系統(tǒng)是否有Z盤存在
if (hasDriveD) alert("你的系統(tǒng)內有一個D盤");
if (!hasDriveZ) alert("你的系統(tǒng)內沒有Z盤");
-->
</SCRIPT>
FileExists(文件名) //檢查一個文件是否存在,如果存在就返會真,不存在就返回.......
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
fileName = fso.FileExists("c:\\autoexec.bat");
if (fileName) alert("你在C盤中有autoexec.bat文件,按下確定后這個文件將被刪除!"); //開個玩笑:)
-->
</SCRIPT>
FolderExists(目錄名) //檢查一個目錄是否存在,如果存在就返會真,不存在就返回.......
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
folderName = fso.FolderExists("c:\\WINDOWS\\Fonts");
if (folderName) alert("按下確定后系統(tǒng)的字庫將被刪除!"); //開個玩笑:)
-->
</SCRIPT>
GetAbsolutePathName(文件對象) //返回文件對象在系統(tǒng)的絕對路徑
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
pathName = fso.GetAbsolutePathName("c:\\autoexec.bat");
alert(pathName);
-->
</SCRIPT>
GetBaseName(文件對象) //返回文件對象的文件名
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
baseName = fso.GetBaseName("c:\\autoexec.bat"); //取得autoexec.bat的文件名autoexec
alert(baseName);
-->
</SCRIPT>
GetExtensionName(文件對象) //文件的后綴
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
exName = fso.GetExtensionName("c:\\autoexec.bat"); //取得autoexec.bat后綴bat
alert(exName);
-->
</SCRIPT>
GetParentFolderName(文件對象) //取得父級的目錄名
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
parentName = fso.GetParentFolderName("c:\\autoexec.bat"); //取得autoexec.bat的父級目錄C盤
alert(parentName);
-->
</SCRIPT>
GetSpecialFolder(目錄代碼) //取得系統(tǒng)中一些特別的目錄的路徑,目錄代碼有3個分別是 0:安裝Window的目錄 1:系統(tǒng)文件目錄 2:臨時文件目錄
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
tmpFolder = fso.GetSpecialFolder(2); //取得系統(tǒng)臨時文件目錄的路徑 如我的是 C:\windows\temp
alert(tmpFolder);
-->
</SCRIPT>
GetTempName() //生成一個隨機的臨時文件對象,會以rad帶頭后面跟著些隨機數,就好象一些軟件在安裝時會生成*.tmp
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
tmpName = fso.GetTempName(); //我在測試時就生成了radDB70E.tmp
alert(tmpName);
-->
</SCRIPT>
MoveFile(源文件, 目標文件) //把源文件移到目標文件的位置
<SCRIPT LANGUAGE="JavaScript">
<!--
var fso = new ActiveXObject("Scripting.FileSystemObject");
var newpath = fso.MoveFile("c:\\autoexec.bat", "d:\\autoexec.bat"); //把C盤的autoexec.bat文件移移動到D盤
-->
</SCRIPT>
獲取cookie的值
下面介紹如何獲取cookie的值。cookie的值可以由document.cookie直接獲得:
var strCookie=document.cookie;
這將獲得以分號隔開的多個名/值對所組成的字符串,這些名/值對包括了該域名下的所有cookie。例如:
<script language="JavaScript" type="text/javascript">
<!--
document.cookie="userId=828";
document.cookie="userName=hulk";
var strCookie=document.cookie;
alert(strCookie);
//-->
</script>
圖7.1顯示了輸出的cookie值。由此可見,只能夠一次獲取所有的cookie值,而不能指定cookie名稱來獲得指定的值,這正是處理cookie值最麻煩的一部分。用戶必須自己分析這個字符串,來獲取指定的cookie值,例如,要獲取userId的值,可以這樣實現:
<script language="JavaScript" type="text/javascript">
<!--
//設置兩個cookie
document.cookie="userId=828";
document.cookie="userName=hulk";
//獲取cookie字符串
var strCookie=document.cookie;
//將多cookie切割為多個名/值對
var arrCookie=strCookie.split("; ");
var userId;
//遍歷cookie數組,處理每個cookie對
for(var i=0;i<arrCookie.length;i++){
var arr=arrCookie[i].split("=");
//找到名稱為userId的cookie,并返回它的值
if("userId"==arr[0]){
userId=arr[1];
break;
}
}
alert(userId);
//-->
</script>
這樣就得到了單個cookie的值
用類似的方法,可以獲取一個或多個cookie的值,其主要的技巧仍然是字符串和數組的相關操作。
給cookie設置終止日期刪除cookie
為了刪除一個cookie,可以將其過期時間設定為一個過去的時間,例如:
<script language="JavaScript" type="text/javascript">
<!--
//獲取當前時間
var date=new Date();
//將date設置為過去的時間
date.setTime(date.getTime()-10000);
//將userId這個cookie刪除
document.cookie="userId=828; expire="+date.toGMTString();
//-->
</script>
指定可訪問cookie的路徑
默認情況下,如果在某個頁面創(chuàng)建了一個cookie,那么該頁面所在目錄中的其他頁面也可以訪問該cookie。如果這個目錄下還有子目錄,則在子目錄中也可以訪問。例如在www.xxxx.com/html/a.html中所創(chuàng)建的cookie,可以被www.xxxx.com/html/b.html或www.xxx.com/ html/ some/c.html所訪問,但不能被www.xxxx.com/d.html訪問。
為了控制cookie可以訪問的目錄,需要使用path參數設置cookie,語法如下:
document.cookie="name=value; path=cookieDir";
其中cookieDir表示可訪問cookie的目錄。例如:
document.cookie="userId=320; path=/shop";
就表示當前cookie僅能在shop目錄下使用。
如果要使cookie在整個網站下可用,可以將cookie_dir指定為根目錄,例如:
document.cookie="userId=320; path=/";
指定可訪問cookie的主機名
和路徑類似,主機名是指同一個域下的不同主機,例如:www.google.com和gmail.google.com就是兩個不同的主機名。默認情況下,一個主機中創(chuàng)建的cookie在另一個主機下是不能被訪問的,但可以通過domain參數來實現對其的控制,其語法格式為:
document.cookie="name=value; domain=cookieDomain";
以google為例,要實現跨主機訪問,可以寫為:
document.cookie="name=value;domain=.google.com";
這樣,所有google.com下的主機都可以訪問該cookie。
1 | <script src="scripts/prototype.js"></script> <script src="scripts/rico.js"></script> |
1 | ajaxEngine.registerRequest("requestName","requestURL"); //例如 ajaxEngine.registerRequest("getPersonInfo","getPersonInfo.do"); |
1 | //對應到同名的 elementId ajaxEngine.registerAjaxElement("elementId"); //回傳的 fromElementId內容,會變更 toElementId物件 ajaxEngine.registerAjaxElement("fromElementId",$("toElementId")); |
1 | ajaxEngine.registerAjaxObject("objectId",new UserObject()); |
1 | <ajax-response> <response type="element|object" id="elementId"> response可以有一或多個,也可以element object混用 </response> </ajax-response> //例如 <ajax-response> <response type="object" id="objectId"> <returnObject name="Hello" age="1" /> <returnObject name="World" age="99" /> </response> <response type="element" id="elementId">Hello World</response> </ajax-response> |
1 | ajaxEngine.sendRequest("getPersonInfo", "firstName=" + firstName, "lastName=" + lastName ); |
1 | var params="rName="+document.getElementById("userName").value+"&rAge="+document.getElementById("age").value; //post要小寫。 ajaxEngine.sendRequest("hello",{method:"post",parameters:params}); |
1 | <html> <head> <script src="js/prototype.js" type="text/javascript"></script> <script src="js/rico.js" type="text/javascript"></script> <script language="javascript"> ajaxEngine.registerRequest("getElement", "returnElement.jsp"); ajaxEngine.registerRequest("getObject", "returnObject.jsp"); function runMe1() { ajaxEngine.registerAjaxElement("helloId"); ajaxEngine.registerAjaxElement("sayHello"); ajaxEngine.registerAjaxElement("fromElementId",$("toElementId")); ? var pramas = "Name="+document.getElementById("userName").value; ajaxEngine.sendRequest("getElement",pramas); } ? ajaxEngine.registerAjaxObject("objectId",new UserObject()); function runMe2(){ ajaxEngine.sendRequest("getObject", "rName="+document.getElementById("uName").value, "rAge="+document.getElementById("age").value); //這是post的方法//var params="rName="+document.getElementById("userName").value+// "&rAge="+document.getElementById("age").value;//ajaxEngine.sendRequest("hello",{method:"post",parameters:params});} function UserObject(){ this.ajaxUpdate=function(ajaxResponse){//alert(ajaxResponse); var objs = ajaxResponse.getElementsByTagName('returnObject'); var tabStr="<table border='1'><tr><td>姓名</td><td>年齡</td></tr>"for(var i=0;i<objs.length;i++){ tabStr+="<tr><td>"; ?? tabStr+=objs[i].getAttribute("name")+"</td><td>"+objs[i].getAttribute("age"); tabStr+="</td></tr>";?? } tabStr+="</table>"; ? this.setValue(tabStr); } this.setValue=function(str){ document.getElementById("result").innerHTML=str; }} </script> </head> <body> <h3>Element Test</h3> Your Name:<input type="text" id="userName" name="userName"> <input type="button" name="BT" value="click me" onclick="runMe1()"> <table><tr><td><div id="helloId"></div></td><td><div id="toElementId"></div></td></tr></table> <div id="sayHello"></div> <hr> <h3>Object Test</h3> Your Name:<input type="text" id="uName" name="uName"> Your Age:<input type="text" id="age" name="age"> <input type="button" value="Click Me" onclick="runMe2()"> <div id="result"></div> </body> </html> |
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% response.setContentType("application/xml"); %> <ajax-response> <response type="element" id="helloId"><span style="color:#008000">Hello</span></response> <response type="element" id="fromElementId"><%=request.getParameter("Name")%></response> <response type="element" id="sayHello"> <script language="javascript"> alert("Hello "+<%=request.getParameter("Name")%>); </script> </response> </ajax-response> |
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% response.setContentType("application/xml"); %> <ajax-response> <response type="object" id="objectId"> <returnObject name="<%=request.getParameter("rName")%>-1" age="<%=request.getParameter("rAge")%>" /> <returnObject name="<%=request.getParameter("rName")%>-2" age="<%=request.getParameter("rAge")%>" /> <returnObject name="<%=request.getParameter("rName")%>-3" age="<%=request.getParameter("rAge")%>" /> </response> </ajax-response> |