JavaScript之無法form.submit()的錯誤

先說,為了找這個錯誤,花了超過八個小時,不寫下來實在對不起自己。
表單(Form),通常會先寫一些validate的javascript,今天碰到一個教科書上沒教的事,我們先看form:

<form method="post" action="submit_form.html">
 <input type="text" id="test" />
 <input type="button" id="submit" value="Send" /><br />
 <span id="test_help"></span>
</form>

就一個TextBox與一個Button,span是拿來放訊息的,接下來我們寫個簡單的validateNonEmpty函式,驗證TextBox裡為是沒有資料即可:

function validateNonEmpty(form){
 if (document.getElementById('test').value.length != 0){
  form.submit();
 }
 else {
  var help = document.getElementById('test_help')
  help.innerHTML = "No Data.";
 }
}

使用傳統HTML加上onclick事件:
<form method="post" action="submit_form.html">
 <input type="text" id="test" />
 <input type="button" id="submit" value="Send" onclick="validateNonEmpty(this.form)" /><br />
 <span id="test_help"></span>
</form>

測試一下,發現在無資料時,Javascript可以正常運作,但在有資料時,Firebug會出現:

form.submit is not a function
http://127.0.0.1:8000/html/submit_form.html
Line 9

怪怪,明明就是form元素的submit,為什麼跟我說submit不是個函式,又不是沒寫過??????????之前我會花超過八個小時是因為那個表單又是Javascript又是jQuery,而且欄位又多,Debug起來費心費力,因為不確定是我寫的原生Javascript出錯,還是jQuery有錯,而且如果你頁面有引用jQuery的話,Firebug還會把錯放到jQuery身上,讓我一度以為我怎麼那麼厲害,隨便寫寫都能抓到JQuery的bug。所以在抓Bug時要使用「簡單原則」,如我能像上面一樣用簡單的作法,先進行測試,那…@_@…我的青春!

為了讓網頁架構分明,所以們我們會分離「架構(XHTML)、行為(Javascript)、樣式(CSS)」,所以在原始抓bug的網頁裡我是用jQurey來bind()事件,所以整體是這樣:

function validateNonEmpty(form){
 if (document.getElementById('test').value.length != 0){
  form.submit();
 }
 else {
  var help = document.getElementById('test_help')
  help.innerHTML = "No Data.";
 }
}

$(function(){
        $('#submit').bind('click',function(){
                 validateNonEmpty(this.form);
        });
});

<form method="post" action="submit_form.html">
 <input type="text" id="test" />
 <input type="button" id="submit" value="Send" /><br />
 <span id="test_help"></span>
</form>

這時會產生一樣的錯誤。很多事沒有你想的複雜。後來我不斷思考(看著錯誤訊息)及測試終於找出問題點。

id="submit"是兇手

原因是button裡的id="submit",因為我們要使用jQuery來bind(),所以為button加上了id屬性,這此按鍵又是拿來發送,所以很直覺給它一個submit名稱,沒想到一個submit要花八個多小時來處理。當你把名稱修改為非submit,例如id="send",程式立即生效,我想是這是id名稱與函數名稱「強碰」所造成的錯誤。

由錯誤訊息推估,當我們執行form.submit()的取得是button這個物件,而非submit()方法。自己被自己害到!

這也讓自己再學到一個經驗,取Javascript名稱不要與Javascript方法同名。還我八小時@_@。

Reference:

ASP.NET -- 同一個Master Page不同資料夾使用之路徑處理

在早期寫ASP時代,在美工方面,最喜歡使用include方式,把各區塊切一切後,include到原始*.asp之中,main一塊、content一塊、sidebar一塊、footer一塊,如果頁面複雜些,那就你的原始code中滿滿的include程式碼。

到了ASP.NET,有了Master Page,中文稱「主版頁面」,其實美工類的東西我碰的不多(其實是lazy),最近自己試著使用Master Page與CSS來進行的排版,排的還蠻有心得,CSS玩久了,好像是玩樂高積木,還不錯玩。

Master Page讓我們很方便進行統一排面配置,結合到頁面時,會不會有一堆雜七雜八的Code,可專心在Content上,但碰到一個問題,就是不同目錄在使用同一個Master Page時,會出現找不到檔案的問題。

例如,我在網站根目錄之下有「Site.master」檔案,內容引用CSS檔及jQuery檔:

<link href="Styles/Site.css" rel="stylesheet" type="text/css" media="screen" />
<script src="Scripts/jQuery/jquery-1.4.4.min.js" type="text/javascript"></script>

在同一頁目錄之下的所有頁面,使用起來應讓是100%沒有問題,但如果你在其他目錄之下引用同一個Site.master檔,head引用的檔案會出現問題,例如在News目錄下引用根目錄之下的Site.master,會出現找不到Site.master的圖、檔案…等等。

查了一下路徑,原來Site.master的路徑被換成:

<link href="Styles/Site.css" rel="stylesheet" type="text/css" media="screen" />
<script src="News/Scripts/jQuery/jquery-1.4.4.min.js" type="text/javascript"></script>

CSS的link正常,但script被多加了目錄路徑上去,就算你在Master Page使用ASP.NET的絕對路徑「~/Scripts/jQuery/jquery-1.4.4.min.js」,complier後的路徑是「News/~/Scripts/jQuery/jquery-1.4.4.min.js」,還是不對。(是因為script不是ASP.NET伺服器控制項)

最後上網查了一下,解決方式也很簡單,解法有二:

複製原始Master Page

在每個目錄下copy一份原始的Master Page,然後修改裡面的路徑。例如在News複製一份原始的Site.master,然後指定使用News/Site.master檔,Blog目錄一樣複製然後使用Blog/Site.master。

好處
如果你每個分類(News/Blog/Product/...)都會有不同的排版方式,因為*.master各自獨立,所以不會互向影響,每個版面修的改修,只影響各自分類的頁面。

壞處
如果你是要每個分類都有統一的版面,那複製就不是好辦法,複製*.master比較合適「客製化」,也就是每個分類頁面是有差異的,但如果是統一版面,那就是牽一髮動全身,一個*.master修改,其他所有*.master也要跟著修改。

路徑轉換

必須在Master Page裡使用in-line Code的寫法,為路徑進行ResolveUrl轉換即可。

<script src="<%= ResolveUrl("~/Scripts/jQuery/jquery-1.4.4.min.js") %>" type="text/javascript"></script>

像我現在在寫後台管理系統,需要的就是統一版面,使用複製*.master並不是好辦法,所以使用了ResolveUrl來轉換路徑之後,就可以在網站任何目錄及路徑之下使用根目錄的Site.master,而不會有任何問題。所以當你需一個統一版面的Master Page,記得為head裡的路徑加上ResolveUrl函數進行轉換。

ps. CSS引用的link可以不用, 怎麼用路徑都是正確的,我也不知道為什麼?

Reference:

小孩帶金剛--舉一反三之"教你"

話說,我們家大寶貝實在可愛,而且腦袋一定很好,常常能舉一反三,這個「反三」部份,就是今天的主題,因為這個「反三」常常讓我們好好的修正自己,修成正果真的好難,不要覺得你已經是完人了,不要覺得怎麼教了那麼多遍怎麼還是不會,原來,她是學你的

好了,來看看我的孩子是如何用「反三」來修練金剛。

不要用丟的

平常我和婆婆教孩子應該算嚴,只要孩子有不好或不對的事,我們都會立即教她,像有一次早上起床後,她吵著要脫睡衣,婆婆就把睡衣的帶子解開,然後請他自己脫拿去放好,脫是自己脫,但大寶貝確丟到地上,然後叫婆婆拿去放。

婆婆當然是不高興,然後用生氣的口氣說,妳怎麼可以丟衣服在地上,然後就用快殺人的眼神,加上充滿力氣的食指,指著房間說:「自己pick-up,拿回去房間。」

其他如「丟玩具、丟書、丟食物…」當然都會被制止,然後說教一番。

就在不久後的一天晚上,當大寶貝在bathtub說她要看書書(先說明一下,我們有買「洗澡書」也就是塑膠做的書,可以在洗澡時看的書),婆婆就很順手的把書到bathtub裡,然後我們小聰明立即來個回馬槍說:「書書不要用丟的,書書不要用丟的。」

我和婆婆雙眼對看,苦苦的笑了。婆婆也立即認錯,過去去把書拿起來,好好的放下去,然後說對不起是媽咪不起。

媽咪說不能買

假日總是要去補些貨,所以總是要走一趟super market,男生比較理性,要買什麼看什麼,女生比較感性,東看西看,看不夠再左看右看,之前我也提過,大寶貝出門總是「摸摸看看就好」,而婆婆實在教的太好,在走走逛逛過程裡,總會出現一些我想拿起來看,看了之後又想買的東西

就在這時候,大寶貝就會把東西接手過去,然後也看了看,然後請三媽婆婆上身,用非常婆婆的聲調、口氣、身段…說:「媽咪說不能買,看看就好,放回去!」然後把東西退還給我,請我放回去。

…人客呀…-_-"

跟我說謝謝


言教不如身教,但身教與言教必須同時教育,婆婆在小地方就會要求大寶貝,像禮貌就是小細節又重要的地方,平常只要我們幫忙大寶貝做什麼事,我們就會請她要說「謝謝」,而學習力超強的大寶貝也會用這招。

我們會要求她幫忙做一些事,像吃飯時幫忙拿碗筷,吃完飯幫忙收東西,或許你看了會很怕,叫一個才滿二歲的孩子做這些事,因為碗盤都是瓷的,但是她幫的很好,吃完飯會問你說,你吃完了嗎?或很心急的就把碗收了!她把碗盤拿去洗碗槽後,就很快樂的過來說:「跟我說謝謝。

第一次時,我也是和婆婆兩眼對看後傻笑。現有我們也在學習當一個有禮貌的父母親。

以上只是其中的一部份。大寶貝常常讓我們了解,原來我們教她要求她,但我們己自都沒做好身教與言教,我們也很高興,她也能要求我們和我們要求她一樣的事,教互相長。我們以為教了她,她就應該會了,會了不應該再犯,但當她用我們教她的道理來教我們時,原來,這些我們認為100%不應該再犯的錯,連我們都還在犯,那何況只是一個孩子呢?

我感謝我的孩子,每次請某某人上身時都讓我們受益良多。

Other list:

保母帶小孩--新竹市北區延平路三段

年紀:0 ~ 5 歲
名額:1 ~ 2 名
地點:新竹市北區延平路三段
證照:有合格證照
費用:不收三節
教學:含教學課程
其他:面談
時間:即日起 ~
連絡:請Email到:「kingkong點bruce(at)gmail點com」或「下方留下你的連絡方式(我不會公布)」。

以下我個人推薦信:

「這位保母,是全世界最有愛心,最會教小孩,她是我看過的保母裡,最棒的一位,能讓她帶到的孩子,會是最幸福的孩子。她愛小孩,她還在上班時,每個來她們班的孩子,笑的進來,笑的出去,不管是心情還是功課,連家長都愛死了。當她離開時,每個孩子都哭了。這樣你就能知道,能給她帶的孩子是多麼幸福,我相信她能讓你的孩子跟別人不一樣。」

歡迎各位轉寄此訊息給有需要的人,名額有限,額滿為止。

jQuery -- jquery-1.4.4-vsdoc.js會讓jQuery無法運作

我們在Visual Studio 2008後期增加了對jQuery支援,後來的Visual Studio 2010是全面支援,現在我們很方便的只要從Microsoft Ajax CDN引用jQuery*.js及jQery*.-vsdoc.js,就能同時使用jQeruy及即時性的說明訊息,即時性的說明訊息對我而言是很重要的,尤其常常寫東西會東少一點西少一點。

在使用最新jQuery 1.4.4版,奇怪,怎麼連個alert('Hi');都不理我,後來查看了一下Firebug,才知道原來是引用「http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.4-vsdoc.js」這個jquery-1.4.4-vsdoc.js有問題:
class2type is not defined
http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.4-vsdoc.js
Line 2404

原因很清楚了,這個jquery-1.4.4-vsdoc.js有bug,會造成jQuery無法運作。

解決的辦法有二:

  1. 移除使用jquery-1.4.4-vsdoc.js
    當你要執行網頁時,先將引用link移除,那你的jQuery程式就可以work了。經過測試,目前1.4.1、1.4.2、1.4.3、1.4.4版本(1.4無提供*.-vsdoc.js),只要引用*.-vsdoc.js,都會造成網頁上jQuery無法運作。
  2. 改引用jQuery 1.3.2版本,就能正常work了。
    http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.3.2.min.js
    http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.3.2.min-vsdoc.js

除非你有特別使用到jQuery 1.4.x版本的功能,不然我是採用方法二,反正只要在Visual Studio裡開發方便即可,正式上線再修改為目前最新版本的jQuery 1.4.4即可。

ps討論:

我jQuery 1.2.6或jQuery 1.3.2用的好好的,為什麼上線前還要換成jQuery 1.4.4版,我個人的想法是「效能」。目前我的程式由jQuery 1.2.6升級為1.3.2再升級為1.4.4,都無出錯的現象,但單單得到的效能,可說是「倍數」成長,在執行大量Javascript時,這可不能說不補,畢竟當我們點網頁時「快、還要更快」,最好都能在0.x秒內完成@_@!