跳到主要內容

disabled 元素 (element) 跟 滑鼠事件 (click event) 的問題

W3C HTML5 規格 :
4.10.19.5 Enabling and disabling form controls: the disabled attribute A form control that is disabled must prevent any click events that are queued on the user interaction task source from being dispatched on the element. 

disabled element 本身不會發出 click event ,而多數瀏覽器會把這事件往父元素送,但 firefox 不會(這個行為似乎沒有規格),因此要注意。
    <div onClick="console.log(event.target)">
        <input type="text" disabled="disabled"
            onClick="console.log(event.target)" />
    </div>
    <div onClick="console.log(event.target)">
        <input type="text" onClick="console.log(event.target)" />
    </div>
以上的例子,在 Chrome 中,點擊第一個 <input> ,只有 div 的 event listener 會印出一次訊息,但 even.target 仍然是 input。
點擊第一個 <input>, input 跟 dive 的 event listener 都會印出訊息。
在 Firefox 中,就什麼都不會印出,因為 event 不會往父元素傳播。
相關討論:

留言

這個網誌中的熱門文章

Code Complete, 2ed (中譯:軟體建構之道) 讀後心得

Code Complete, 2ed (中譯:軟體建構之道) 讀後心得 雖然以前在學校有修過軟體工程,但是說實在現在我對建構軟體的整個概念都來自於兩本書:「人月神話」(The Mythical Man-Month)、Code Complete[1]。我畢業後第一份工作是軟體研發工程師,我們公司所開發的系統大約有近百位工程師共同維護,當然各有依功能與專業知識將系統劃分不同的區 塊來維護,在面對大型的系統與這麼多人寫程式是以前在學校沒有遇過的,因此也開始思考怎樣才是好的軟體開發方式。從大學好友那探聽到了Code Complete這本書,花了上千元買了英文版,(現在中文版已出,簡體版聽說只要三分之一的價錢)認真讀了幾篇之後,真是如獲至寶,於是自己讀過後,還跟同事組成讀書會一同研討這本書。 作者 Steve McConnell (個人Blog http://www.stevemcconnell.com/ )著作不算量大,但是我看過的幾本質量都很好,印象中他曾經在微軟工作過,後來成立一家軟體顧問公司 Construx Software 。 這本書(書本網站 http://cc2e.com/Default.aspx )的討論主題很廣泛,但是並不空泛,從最小的、最基本的如何寫出好的程式, 例如函式(routine)、註解 (comment)、變數的命名等,也談整個軟體建構的過程除錯、測試,最後也談到軟體工程師個人能力與技術生涯的發展,算是各方面都有提及。但是我比較 建議有半年以上的實際程式經驗來讀這本書比較適合,我自認為如果我在學生時代接觸本書,可能沒有什麼太大的感觸,因為面對的都是小格局、人數少的小系統, 書中所探討的原則與例子,很多時候沒有團隊開發或大型系統的經驗,很難體會。但稍有經驗的人,看完之後保證在程式撰寫與軟體開發方面的觀念會有很大的提 昇。 Table of Content Laying the Foundation 1 Welcome to Software Construction 2 Metaphors for a Richer Understanding of Software Development 3 Measure Twice, Cut Once: Upstream Prerequisites 4 Key...

innerHTML 的安全風險

問題 若你要實作一個使用者輸入的功能,並把輸入的內容顯示在網頁上時,應避免把使用者輸入的值直接指定給某個 element 的 innerHTML 。因為若是使用者輸入包含 HTML、JavaScript, innerHTML 就會解析並執行: var userInput = '<img src="javascript:alert("XSS")">' element . innerHTML = userInput ; 因此可能 user A 的惡意輸入,會被系統顯示到 user B 的畫面上,進而執行特定成程式碼而造成 XSS 攻擊 。 解法 一般會先想到 encode HTML,但是如果只是要顯示文字,將使用者輸入值指定給 textContent 會更簡單,無需 encode,該值會被當成純文字處理,並不會執行 javascript。 var userInput = '<img src="javascript:alert("XSS")">' element . textContent = userInput ;

ZK 教學 - 常見錯誤用法 06 - 慎選 data binding 語法

慎選 data binding 語法 最常用的語法有以下 4 種: @init: 只從 ViewModel 載入一次 @load:載入並追蹤 ViewModel 變化 @save:寫入 ViewModel1 @bind:(雙向)等於 @load + @save 後面 3 種因為需要持續維持(追蹤)元件與 ViewModel 的綁定關係,伺服器需要建立 tracking node,因此成本較高。 依對系統的負擔排名如下: 因此如果沒有動態變化的需要,請使用 @init 。 例如在 Listbox , Grid , Tree 內的 <template> 若只是顯示資料,只需用 @init ,可以免去大量 tracking node 所需的記憶體。 例如: < grid width = " 400px " model = " @init(vm.itemList) " > < columns > < column label = " index " /> < column label = " name " /> </ columns > < template name = " model " > < row > < label value = " @init(forEachStatus.index) " /> < label value = " @init(each.name) " /> </ row > </ template > </ grid >