《JavaScript進階程式設計》Chapter 15 canvas + Chapter 16 HTML5

來源:互聯網
上載者:User

標籤:為什麼   請求   ext   標題   top   ret   利用   不同的   name   

  • Chapter 15 Canvas

  • Chapter 16 HTML5
Chapter 15 Canvas 
  • <canvas>元素:設定地區。JS動態在這個地區中繪製圖形。
  • 蘋果公司引導的。由幾組API構成。
  • 2D上下文普及了。WebGL(3D上下文)還未足夠普及。
基本用法
  • 首先:width、height屬性確定繪圖區域大小。後備資訊放在開始和結束標籤之間。
  • getContext():DOM獲得這個canvas元素對象。再在這個對象上調用getContext()擷取上下文,傳入參數表示擷取的是2d上下文還是WebGL上下文。
  • toDataURL()方法,擷取繪圖區域中的圖形對應的URL。注意,若canvas畫布“不乾淨”,即來自不同的域,這個方法會報錯。
2D上下文
  • 繪製簡單的2D圖形。
  • 座標原點在canvas元素的左上方,原點座標(0,0)
  • 填充和描邊:fillStyle和strokeStyle屬性。
    • 描邊寬度由lineWidth屬性控制。
    • lineCap屬性控制線條末端的形狀
    • lineJoin屬性控制線條相交的方式。
  • 繪製矩形:fillRect(),strokeRect()方法,clearRect()方法。4個參數:矩形的x,y座標,矩形的寬度和高度。
  • 繪製路徑:
    • 開始:beginPath()
    • 一系列繪製方法
    • 結束:closePath()/fill()/stroke()/clip()
    • 是否在路徑上:isPointInPath()
  • 繪製文本:
    • fillText()/strokeText():4個屬性:字串、x、y座標、可選的最大像素寬度
    • 3個屬性:font、textAlign、textBaseline
    • 輔助確定文字大小:measureText()方法,返回TextMetrics對象,只有width屬性。
  • 變換:
    • 例如rotate(angle)/scale()/translate()/transform()/setTransform
    • 選項組:save()
    • 返回上一個狀態:restore()
    • 記錄和返回都是以棧結構的方式,可以一級級進入或者返回。
    • 記錄和返回只作用於狀態或者設定。
  • 繪製映像(對<img>或者<canvas>映像進行處理)
    • drawImage():多種控制方式
  • 陰影
  • 漸層:
    • createLinerGradient()/createRadiaGradient() ,addColorStop()
    • 注意座標匹配。
  • 模式(重複的映像)createPattern()
  • 使用映像資料(擷取rgba)
    • getImageData()擷取原始映像資料,返回ImageData對象的執行個體。
    • 上述對象擁有width、height、data屬性。
    • data屬性是數組,每四位表示一個像素的資料,對應rgba
    • 可以依次設定灰階過濾器或者其他過濾器。
    • putImageData()將映像資料繪製到畫布上。
  • 合成:
    • globalAlpha屬性:通用透明度
    • globalCompositionOperation屬性:合成方式。存在瀏覽器差異。
WebGL
  • 類型化數組:視圖--類型化視圖。是WebGL項目的基礎。
  • 上下文:pdf P488-497

 

Chapter 16 HTML5 指令碼編程
  • HTML5增加了新標籤,同時也花一定篇幅規定了一些JS的API,以簡化複雜的操作。本章介紹了跨文檔資訊傳遞,拖放API,音頻及視頻,曆史狀態管理等一些操作。
跨文檔訊息傳遞(cross-document messaging:XDM)
  • 利用postMessage()進行訊息傳遞,postMessage()方法不僅可以在這裡使用,功能就是“向另一個地方傳送資料”。而XDM中,“另一個地方”指另一個域,一般將訊息傳給當前頁面的<iframe>元素或者由當前頁面彈出的視窗。
  • 以當前頁面的<iframe>元素包含另一個域為例:
  • 當前頁面需要做的:
    • postMessage()傳入兩個參數:待傳入的訊息和訊息的來源域---這就意味著實際上需要獲得“另一個域”的window對象(代理)以在其上使用這個方法。見下個步驟。
    • 可以通過document.getElementById("myframe").contentWindow;即contentWindow屬性擷取目標域的window對象或者代理。調用該方法即可傳入資料。
    • data不一定需要是字串,但非字串的情況在不同瀏覽器之間存在差異。可以利用JSON.stringify()/JSON.parse()處理字串。
    • 這種方法可以確保安全性,畢竟第二個參數是已知地址。
  • <iframe>中的域需要做的:
    • 會激發message事件。onmessage處理常式的事件對象event有三個重要屬性。
    • event的三個屬性:data、origin、source
    • 可以在確保origin(來源所在域)合格情況下,處理data,再通過source(指向來源的window對象的代理)向來源發送訊息,即調用:event.source.postMessage().
    • 由於source只是可代理,所以能訪問的屬性和方法有限。建議只是用postMessage()方法。
  • 注意到postMessage()方法是在待向其傳送訊息的域的代理對象上調用的
原生拖放
  • 注意到,HTML5提供了一些JS的API,向程式員暴露可以使用的屬性或者方法,它本身更多的是規定瀏覽器在這些方法或者屬性(或者事件)響應的時候提供一些怎樣的顯示效果。
  • 拖放一般考慮3個階段:被拖放的對象、拖放過程、放置的目標對象。
  • 對應一些拖放事件:對於被拖放的對象,有dragstart/drag/dragend;對於放置的目標對象,有dragenter/dragover/dragleave或drop。很好理解。
  • 自訂放置目標:針對有些元素預設是不允許作為放置目標的情況,由於預設是不允許,所以可以在dragenter和dragover中重寫預設行為,即阻止預設行為的發生。以此來自訂放置目標。
  • dataTransfer對象,為了在拖放操作時實現資料交換,是event的屬性,用於從被拖放的元素向放置目標元素傳遞字串格式的資料。
    • setData()/getData()方法:設定和擷取資料。getData()在drop事件中處理。注意在跨瀏覽器處理setData()的時候注意對短資料類型和MIME類型的處理。
    • dropEffect/effectAllowed:兩者配合,可以確定被拖放的元素能夠執行哪种放置行為(而瀏覽器會對應給出顯示的效果)。dropEffect在ondragenter事件處理常式中針對放置目標進行設定。而effectAllowed屬性在ondragstart中針對被拖放的目標進行設定。
    • 其他成員:addElement()/clearData()/setDragImage()/types等
  • draggable屬性:HTML5中的全域屬性,規定元素是否可以被拖動。
媒體元素
  • 針對HTML5中的<audio>和<video>元素。這兩個元素的產生可以讓我們減少使用FLASH外掛程式等,更方便實現跨瀏覽器操作。
  • 元素本身就擁有一些屬性,且可以進行多個MIME類型和轉碼器的選擇。
  • JS又規定了他倆的一些更加具體和詳細的屬性和事件,以減輕實現一些操作的繁瑣的程式編寫過程。
  • 可以依賴play()或pause()實現自訂的媒體播放器,這隻是代碼編寫的邏輯問題,比較簡單。
  • JS提供canPlayType()來檢測轉碼器的支援情況
    • 注意到可能性probably>maybe>空值
    • 所以傳入MIME類型和轉碼器的可能性大於只傳入MIME類型的。很好理解。
  • JS有原生的Audio建構函式,可以穿件audio執行個體並進行一些操作。
曆史狀態管理
  • 針對“後退”和“前進”按鈕失去作用,使得使用者難以在不同的狀態(頁面狀態)間進行切換。可以使用之前(13章)提到過的haschange事件監測狀態的變化,以執行某些處理;或者使用HTML5中的曆史狀態管理API進行操作。
  • haschange事件:URL參數列表(包括#後的所有字串)發生變動的時候觸發,主要用在Ajax中,用URL參數數列來儲存狀態或者導航資訊。屬性oldURL、newURL可以實現location.hash的功能。一般使用後者,因為支援oldURL和newURL的瀏覽器不多
  • 狀態管理API同樣可以在不載入新頁面的情況下改變瀏覽器的狀態:history.pushState(),傳入3個參數:狀態物件,新狀態標題和可選的URL,注意第二個參數至今不支援,所以可以寫入Null 字元串,而第一個資訊最好詳盡的選項組對象各方面的資訊,以便隨後只用。
  • 在執行完這個方法後,新的狀態資訊會被加入曆史狀態棧。並且不會真正的向伺服器發送請求。
  • popstate事件:由於上述方法改變了曆史棧,[上一頁] 按鈕可用了。在點擊後退按鈕的時候,觸發popstate事件,其事件對象event包含pushState()第一個參數所指的狀態物件(這就是為什麼上面要求資訊詳盡的原因了)。注意到,瀏覽器載入第一個狀態(頁面)的時候,這個對象為null。
  • replaceState():傳入參數與pushState()的一樣,然而不會在曆史狀態棧中建立新狀態,指揮重寫目前狀態。
  • 注意pushState()的第三個參數務必是實際的URL,不然重新整理的時候會導致404錯誤。

 

《JavaScript進階程式設計》Chapter 15 canvas + Chapter 16 HTML5

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.