15天學會jQuery (6-10)
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
這次的教程內容貼近我擅長的技術方向:安全的contact forms。
[p]就像我在前一篇教程中提到的那樣,一個最普通的contact forms可以幫助訪客同你進行通信來往而不需要暴露你的電子郵件地址給那些可惡的垃圾郵件制造者們。[/p]
[p]但如果spammer們已經盯上你,沒有什么比一個不安全的contact foms更糟糕的了。想象一下你的網絡空間提供商發給你一封措辭強烈的電子郵件,通知說:他們發現你的網站發送了大批量的性藥廣告以及其他垃圾郵件,另外,直到你停止這種行為之前,你的網站都將處于離線狀態–謝謝![/p]
[p]那么,今天我要在這篇教程里告訴大家的是一種在任何contact forms上添加一個額外安全層的簡單方法-即使你沒有使用我提供的超級安全、超級靈活的ultimate form mail。[/p]
[p]當前狀況[/p]
[p]你意識到spammer們已經通過遠程探測技術發現了你的contact forms的弱點,而你希望他們走開。[/p]
[p]難點[/p]
[p]你不想使用captcha(completely automated public turing test to tell computers and humans apart),因為你明白,讓你的訪客先去閱讀那些歪七扭八的字母數字才能發送消息只能抑制他們想要互動的欲望,而不是促進它。(數字驗證的缺陷)[/p]
[p] [/p]
[p]關鍵點:你希望那些壞家伙們堵車到天黑,同時希望那些好孩子們一條大道通羅馬。[/p]
[p]解決方案[/p]
[p]你將學會在頁面加載的時候使用jquery來給你的contact forms添加一些隱藏的標簽信息。當窗體信息被提交到服務器端的時候,你可以用一些簡單的php代碼實現如下的步驟:[/p]
[p]隱藏的標簽被識別出來 隱藏標簽的信息與你的網站訪客下載到瀏覽器上的cookie里的某項標志相一致 隱藏標簽的有效時間還未過期 換句話說,你的訪客們只有在一段有限的時間內才可以填寫窗體并進行發送。如果一個spammer嘗試通過遠程調用來提交窗體信息到你的服務器,他們將會發現自己踢到了一塊又厚又硬的鐵板,不付出點代價休想通過。[/p]
[p]我將要告訴你的這種方法是從一位非常聰明的同事chris shiflett提供的藍本基礎上修改而成的。他是位專業的安全專家,對php程序員經常遇到的安全問題了如指掌(我怎么感覺他又要忍不住提到他的ultimate form mail 了~~汗)。[/p]
[p]教程[/p]
[p]基于上次那篇《斑馬線表格輕松制作》的反響良好,我決定再次制作一次類似的“手把手圖文教程”。雖然要花費些時間,但很值得這么做。[/p]
[p]手把手教程[/p]
[p]demo[/p]
[p]源代碼[/p]
[p]銀彈?1)[/p]
[p]銀彈是軟件領域的說法,意為解決一切問題的方法。這個來源于歐洲的傳說,說是只有銀彈可以消滅狼人。“那么,現在我的窗體就是100%安全的,可以假設任何免費的cntact forms程序,然后高枕無憂了?”[/p]
[p]呃。。。非也。[/p]
[p]這種安全模式基于一個關鍵的假定:spammer們總是會拿軟柿子捏,浪費時間去解決一個狡猾的對手對他們來說就是浪費金錢。[/p]
[p]現在, 好好聽著,我的朋友們:[/p]
[p]這個技術,盡管相當健壯,但仍然不是解決目前脆弱的窗體處理程序問題的靈丹妙藥。[/p]
[p]我的這些安全建議的目的是為了讓spammer們知難而退。小偷們入室盜竊之前總會進行仔細踩點,他們只對那些可以用最小代價獲取最大利益的房間感興趣。[/p]
[p]換句話說,如果在他們動手之前有99%的機會擋住他們的試探,而且實現起來相當容易,為什么不試一試呢?這才是此項技術要實現的目標。[/p]
[p]但這還是治標不治本,不能解決所有問題。[/p]
[p][br]--------------------------------------------------------------------------------[/p]
[p][hilitecolor=#808080][color=#ffffff]15 days of jquery(day 7) --- 樣式表切換[/color][/hilitecolor][/p]
[p][br]我第一次看到樣式表切換器是在a list apart或者simple bits,那是兩個設計師最應該去的網站。[/p]
[p]從那以后,我找到了很多可以讓訪客通過鼠標點擊某個地方切換樣式表的方法。但最近我要寫一篇如何 使用jquery編寫簡單代碼實現它的教程。[/p]
[p]我將向你們逐步解說整個的過程,不僅僅因為要展示jquery代碼的簡介,同時也要揭示jquery庫中的若干高級特性。[/p]
[p]首先,代碼[/p]
[p]$(document).ready(function()[br]{[br]$('.styleswitch').click(function()[br]{[br]switchstylestyle(this.getattribute("rel"));[br]return false;[br]});[br]var c = readcookie('style');[br]if (c) switchstylestyle(c);[br]});[br]function switchstylestyle(stylename)[br]{[br]$('link[@rel*=style]').each(function(i)[br]{[br]this.disabled = true;[br]if (this.getattribute('title') == stylename) this.disabled = false;[br]});[br]createcookie('style', stylename, 365);[br]}[br] [br]$(document).ready(function()[br]{[br]$(‘.styleswitch’).click(function()[br]{[br]switchstylestyle(this.getattribute("rel"));[br]return false;[br]});[br]var c = readcookie(’style’);[br]if (c) switchstylestyle(c);[br]});[br]function switchstylestyle(stylename)[br]{[br]$(‘link[@rel*=style]’).each(function(i)[br]{[br]this.disabled = true;[br]if (this.getattribute(‘title’) == stylename) this.disabled = false;[br]});[br]createcookie(’style’, stylename, 365);[br]}其他這里沒有提到的部分是你將在后面看到的創建和讀取cookie的函數。[/p]
[p]熟悉的開篇[/p]
[p]$(document).ready(function()[br]{[br]$('.styleswitch').click(function()告訴jquery“以最快的速度查找所有包含對象名‘styleswitch’的元素,并在他們被鼠標點擊時執行一個函數”。[/p]
[p]看起來不錯。當鼠標點擊預先指定的元素時,switchstylestyle函數將被調用。從現在開始是重點。[/p]
[p]這句話什么意思?[/p]
[p]第一次看到這句代碼的時候我的腦子有些卡殼:[/p]
[p]$('link[@rel*=style]').each(function(i) {[/p]
[p]在互聯網上搜索了一下后我空手而歸。最后不得不找到了jquery的作者john resig,向他咨詢。[/p]
[p]他直接給了我一個jquery網站的頁面地址,里面講解了若干jquery提供的高級特性(xpath),可以用來查找并操作頁面中的若干元素。[/p]
[p]如果你看過這些東西你就能明白上面那句神秘的代碼的含義是告訴jquery“查找所有帶rel屬性并且屬性值字符串中包含‘style’的link鏈接元素”。[/p]
[p]嗯?[/p]
[p]讓我們看看如何編寫包含一個主樣式表,兩個備用樣式表的頁面:[/p]
[p][br][br]我們可以看到所有樣式表都含有一個包含‘style’字串的rel屬性。[/p]
[p]所以結果一目了然,jquery輕松定位了頁面中的樣式表鏈接。[/p]
[p]下一步?[/p]
[p]each()函數將遍歷所有這些樣式表鏈接,并執行下一行中的代碼:[/p]
[p]this.disabled = true;[br]if (this.getattribute('title') == stylename) this.disabled = false;“首先禁用所有的樣式表鏈接,然后開啟任何title屬性值與switchstylestyle函數傳遞過來的字串相同的樣式表”[/p]
[p]一把抓啊,不過很有效。[/p]
[p]現在我們需要保證的是那些樣式表存在并且有效。[/p]
[p]完整代碼和演示[/p]
[p]既然 kelvin luck已經編寫了這些代碼,我就不在這里重復了。[/p]
[p]demo[/p]
[p]我相信kelvin的靈感是從 這個網站那里得到的,我們正好可以看看使用其他工具實現這個功能是否要比jquery更加復雜冗長。[/p]
[p][br]--------------------------------------------------------------------------------[/p]
[p][color=#ffffff][hilitecolor=#808080]15 days of jquery(day 8) --- 使用javascript(jquery)實現圓角邊框[/hilitecolor][/color][/p]
[p][br]當我看到這些實現圓角邊框的html源代碼的時候,我發現這很適合用來寫一篇jquery教程–使用wrap()、prepend()、append() 函數。[/p]
[p]這里是原先的html代碼,我們將從這里開始:[/p]
[p]
[br] 現在我們怎么使用jquery來精簡這段代碼呢?[/p]
[p]首先,我們需要一個“鉤子”,一個特殊的html元素,或者一個id,或者一個對象名–來告訴jquery處理的目標。[/p]
[p]現在我們改成了這個樣子:[/p]
[p] [br] [br] [br] [br] [br] [br] [br] [br] [br] [br] [br] [br]'+ [br]' '); [br]});其他div標記去哪里了?[/p]
[p]仔細觀察代碼,你就會發現它們都跑到了js代碼里面,在wrap函數執行時它們將嵌套在“鉤子div”的內部。[/p]
[p]細心的觀眾會發現我漏掉了部分代碼。這是因為jquery中的wrap()函數要求div標簽必須嚴格對稱嵌套才能工作。[/p]
[p]具體的,我去掉了下面兩個部分:[/p]
[p]'+ [br]' '+ [br]''+ [br]' '+ [br]''+ [br]' '+ [br]' [br] 添加和預置一體化[/p]
[p]下一步我們將會通過prepend和append函數將這兩段代碼添加進帶有dialog對象名的div標記內部,并且使用“連鎖”方法。[/p]
[p]$('div.dialog').prepend(' '+ [br]''+ [br]' ')[br].append(''+ [br]''+ [br]' ');示例及代碼[/p]
[p]我已經在網上放置了一個演示頁面供大家查看。建議你看一下頁面的源代碼,體會jquery給頁面代碼帶來的清爽和便捷。[/p]
[p]這些代碼來自 schillmania的一篇文章,個人推薦大家下載包含點綴圖片的zip打包,非常精美。[/p]
[p]不使用圖片的圓角邊框[/p]
[p]有很多方法可以實現圓角邊框–有些方法甚至不需要圖片。[/p]
[p]在jquery的網站上有一個用來制作無圖圓角邊框的插件。雖然不是適合所有人(或者說所有程序),但也值得學習。[/p]
[p]看看它的漂亮代碼吧(使用時):[/p]
[p]$(document).bind("load", function(){ [br]$("#box1").corner()[br]});[br]--------------------------------------------------------------------------------[/p]
[p][hilitecolor=#808080][color=#ffffff]15 days of jquery(day 9) --- 快速和略顯粗劣的ajax視頻教程[/color][/hilitecolor][/p]
[p][br]今天我的想法有點改變。近段時間以來我一直考慮注冊一個youtube帳號來上傳一些教程錄像,現在我終于做出了決定并上傳了一個。在這里我將手把手的向大家演示為你的網站添加一些ajax基本應用的方法。[/p]
[p]錄像很短,因為youtube對上傳影片的長度有限制(10分鐘以內)。當然由于制作倉促,錯誤在所難免。比如在某個地方我稱cgi為“服務器端腳本”,而更準確的說法應該是“服務器端語言”。[/p]
[p]這是ajax,還是ahah,抑或axah?[/p]
[p]你將看到的東西其實更接近ahah而不是純粹的ajax。[/p]
[p]有什么區別么?ajax中的“x”代表著xml。但更多時候人們喜歡使用簡單的文本或者javascript代碼或者單獨文件而不是那種復雜冗長的xml。對此有篇文章有詳細論述:ajax vs. ahah。[/p]
[p]至于axah。。。 cody lindley的文章可以解釋一切。對ajax的一些工作理念有興趣的讀者可以看一下。[/p]
[p]教程錄像[/p]
[p]這個頁面上有我提供的演示。[/p]
[p][br]--------------------------------------------------------------------------------[/p]
[hilitecolor=#808080][color=#ffffff]15 days of jquery(day 10) --- 使用jquery javascript 庫實現“即點即改”的[/color][/hilitecolor]ajax化
[p][br]以前我在quirksmode網站見過這種代碼,后來又在24 ways網站看到了一個更具web 2.0風格的方案。這次我將為大家展示兩種使用jquery實現相同功能(甚至更好)的方法。[/p]
[p]目標[/p]
[p]一個用ajax(或ahah)技術設計的頁面,訪問者無需離開就可以在看到的(x)html 頁面上編輯內容。[/p]
[p]方案[/p]
[p]點擊需要編輯的文本,變幻出一個帶有保存和取消按鈕的textarea。修改的部分將通過ahah傳送至服務器端的一個php腳本文件,用來更新數據庫(mysql或普通文件)。[/p]
[p]演示[/p]
[p]ajax式即點即改演示一[/p]
[p]在這第一個演示中,我使用了一個id為“editinplace”的div元素。當鼠標劃過這里時,背景顏色將變成淺黃色。點擊文本將啟動一些dom操作,div元素被一個textarea元素取代–內中包含原先的文本。[/p]
[p]點擊保存按鈕將向服務器端的php腳本文件發送新的html內容,并重新輸出收到的新文本內容(通過 $_post)。[/p]
[p]在真實應用環境下,你還應當添加一個安全性檢測,然后才能更新數據庫并返回更新后的頁面內容,同事告知jquery執行成功的信息。[/p]
[p]但在這個例子中,所有的修改都是成功的,發送給php腳本的信息將原封不動的返回到jquery代碼,顯示到一個普通的警告窗口里。[/p]
[p]解釋[/p]
[p]開頭部分說了很多次了,如果你不想使用jquery提供的document.ready函數,盡可以選擇你自己中意的init()函數。[/p]
[p]$(document).ready(function(){[br]setclickable();[br]});頁面上第一個被執行的就是這個setclickable()函數。它的任務就是做以下內容:[/p]
[p]查找包含id為“editinplace”的div元素,然后告訴jquery在這些div被點擊時執行某些操作。[/p]
[p]function setclickable() {[br]$('#editinplace').click(function() {讀取div內部的html代碼的任務將交給jquery的html()函數來完成。這些html將會額外添加若干代碼以組成textarea里的保存和取消按鈕。[/p]
[p]"var textarea = '';[br]var button = ' ';[br]var revert = $(this).html();同樣還是這些在div內部找到的html代碼將會賦值給一個叫做“revert”的變量。這個變量將用來在取消按鈕被按下的事件中輸出原始文本。[/p]
[p]var revert = $(this).html();jquery的dom函數“after”用來將新生的textarea html代碼放置在我們指定的div元素后。我在后面緊跟著連鎖上了一個remove()方法 來移除div元素以節省代碼。[/p]
[p]$(this).after(textarea+button).remove();在使用jquery的時候,我通過對象名來定位保存和取消按鈕對象。我指示jquery在任一按鈕按下時觸發最后一個函數“savechanges”。我告訴了jquery在div元素被點擊時做什么事情,但我沒有在最后加上省略號因為我希望在這個div操作語句后面連鎖其他方法。[/p]
[p]$('.savebutton').click(function(){savechanges(this, false);});[br]$('.cancelbutton').click(function(){savechanges(this, revert);});[br]})我再連鎖了一個簡單的mouseover和mouseout事件,告訴jquery在鼠標指針掠過我們指定的div元素(id=editinplace)的時候添加和移除一個對象。[/p]
[p].mouseover(function() {[br]$(this).addclass("editable");[br]})[br].mouseout(function() {[br]$(this).removeclass("editable");[br]});[br]};//end of function setclickable函數“savechanges”將以按鈕對象做為第一個參數,而cancel參數則取兩種值,false或者保存在revert變量中的html代碼內容。[/p]
[p]function savechanges(obj, cancel) {如果cancel為假,則函數將保存更改并使用html格式發送給服務器端的php腳本。我在這里使用了jquery內置的一個dom函數實現對textarea內容的提取操作:parent()和siblings()。[/p]
[p]if(!cancel) {[br]var t = $(obj).parent().siblings(0).val();dom基礎超出了本系列教程的范圍,但在這個應用中我只是告訴了jquery“對象(保存按鈕)有一個父元素(div)。。。去找到它。那個元素擁有一個或多個dom樹同級對象。。。我只想找到其中的第一個。然后提取那個對象的所有內容。”[/p]
[p](稍等。。。如果你對dom風格的代碼不是很熟悉的話,前面我的注釋可能并不好理解。我還是建議你之前google一下“dom javascript”或者其他相關的信息。)[/p]
[p]這些html賦值給了t變量,現在要通過post方法把它發送給test2.php。[/p]
[p]$.post("test2.php",{[br]content: t[br]},function(txt){[br]alert( txt);[br]});[br]}如果cancel有一個值,那么必然是保存在revert變量中的原始html內容。所以,在這個時候我希望變量t變為原始html內容。[/p]
[p]else {[br]var t = cancel;[br]}下一步是通過jquery提供的dom函數放置一個新的div元素,id為“editinplace”,在這之后包含了textarea元素。。。然后刪除掉這個div元素。[/p]
[p]$(obj).parent().parent().after(' or '+t+' ').remove()在果殼中,這將告訴jquery“在dom樹中上躍兩次。將html代碼附在到達位置的對象之后,然后移除那個對象。”[/p]
[p]最后,我們再次調用setclickable函數并關閉savechange()函數。重調setclickable()函數的含義是重新設置onmouseover,onmouseout,和onclick事件到初始狀態。[/p]
[p]setclickable();[br]}第二個示例[/p]
[p]第二個方法非常類似但也有點復雜。[/p]
[p]示例二[/p]
[p]沒有用到龐大的單獨div元素,這個示例將每個段落p標簽變換成單獨的可編輯區域。[/p]
[p]這里的難度在于你如何在向服務器端腳本發送數據時指定正確的段落p標簽。[/p]
[p]在這里我通過為每個p標簽編號并將這個編號一同發送給服務器端的php腳本的方式解決了問題。你會在alert窗口中看到php腳本是如何“知道”哪個p標簽里的內容被修改的。[/p]
[p]已知的問題[/p]
[p]現實的應用中,你在使用類似的功能時首先需要驗證更改的內容的合法性,然后才能將數據發送到服務器端。顯然在這里我們刻意把這些內容忽略掉了。[/p]
[p] [/p]
[p]本文來自csdn博客,轉載請標明出處:[url=http://blog.csdn.net/gohands/archive/2008/01/18/2050594.aspx]http://blog.csdn.net/gohands/archive/2008/01/18/2050594.aspx[/url][/p]
該文章在 2010/4/24 10:46:39 編輯過 |
相關文章
正在查詢... |