跳到主要內容

發表文章

目前顯示的是 2020的文章

jQuery event.namespace

最近才發現 jQuery event.namespace 可以讓你只移除自己註冊的 event listener 而不移除其他人註冊的。往常我們多半指定 event type 來註冊:$(document).bind('mouseup', myListener);並指定同一個 event type 來移除:$(document).unbind('mouseup');但有時候你使用別人的 widget 或 library 也許它也註冊了同樣事件的 listener,或是你不確定有沒有,為了避免不小心 unbind 其他人的 listener,我可以在註冊加上 namespace 如:$(document).bind('mouseup.line', myListener);.line 就是自訂的命名空間。然後可以移除該 namespace 的所有 listener:$(document).unbind('.line');這時如果 document 上也有別人註冊的 mouseup 就不會被你呼叫的 unbind() 移除。

margin collapse 造成垂直捲動條

有次我發現即使我將 html, body 都設定沒有 margin 如:html{height:100%;margin:0px;}body{height:100%;margin:0px;}但頁面仍然產生垂直捲動條(scrollbar),檢查後發現 body 跟 text1 的上白邊合併,造成 body 向下移動,因為 body、html 高度相同,下移就造成右方垂直捲動條出現。
另一個例子:text1 的下白邊與 text2 的上白邊合併 (collapse)

這頁範例可以重現以上問題。這不是 bug,而是規格上定義的 margin collapse8 Box model / 8.3.1 Collapsing margins解法<h1style="display:inline-block">text 1</h1><h1style="margin-top:0">text 1</h1>

ZK 與響應式網頁設計(RWD)

響應式網頁設計 (RWD)就現今而言應該是許多網站必備的條件之一,ZK 框架可以幫你從一個抽象層次較高的角度滿足 RWD,不需要了解 CSS Media Query 的細節。元件層級元件層級的 RWD 是由元件內部自動完成的。每個 ZK 元件都能區分瀏覽器的種類,因此會自動依據桌上型或行動裝置瀏覽器來自動調整元件的外觀,不需開發者介入,例如 datebox 在桌面瀏覽器會跳出小月曆:

在手機瀏覽器就會自動變成下方滾動條:
頁面層級頁面層級的 RWD 因為牽涉到版面設計,因此無法靠元件自動完成,因為畢竟每個頁面需要的版面設計皆不相同,這通常不是一個技術性的決定,而是政策性或設計性上的決定,因此 ZK 提供一些工具讓你實現 RWD。以下根據你想要達成的效果,概述你可用的工具。寬度、版面自動調整如果你想要做出的效果是,畫面內各區域自動調整寬度,較窄時調整位置,我非常推薦搭配 Bootstrap Grid 與 ZK 一同使用,因為易於整合。使用 Grid system 只要在 div 套上 CSS class,如 col-md-4,因此跟 ZK 整合很容易,不需要特別的設定與程式。元件變換如果你希望畫面寬、窄時,各用不同的元件來顯示,例如側邊欄在畫面變窄時消失並換成小的選單圖示,這時元件本身當然無法得知要做這樣的轉換,你可以透過 onClientInfo 事件@MatchMedia 來偵測畫面寬度變化,並針對該變化調整畫面元件。更多細節可以參考以下資源:Use Bootstrap with ZK: Responsive Admin Template範例專案線上展示

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;