CoffeeScript = require './coffee-script'
CoffeeScript.require = require
compile = CoffeeScript.compile
此瀏覽器相容性層擴充了核心 CoffeeScript 函式,讓在瀏覽器中直接編譯程式碼時能順利運作。我們增加了透過XHR和text/coffeescript
指令碼標籤載入遠端 Coffee 指令碼、透過資料 URL 提供來源對應等支援。
CoffeeScript = require './coffee-script'
CoffeeScript.require = require
compile = CoffeeScript.compile
使用標準 JavaScript eval
來評估程式碼。
CoffeeScript.eval = (code, options = {}) ->
options.bare ?= on
eval compile code, options
執行程式碼無法存取此範圍。
CoffeeScript.run = (code, options = {}) ->
options.bare = on
options.shiftLine = on
Function(compile code, options)()
如果我們不在瀏覽器環境中,我們已完成公開 API。
return unless window?
在可能的情況下包含來源對應。如果我們有 base64 編碼器、JSON 序列化器和用於跳脫 unicode 字元的工具,我們就可以開始了。移植自 https://developer.mozilla.org/en-US/docs/DOM/window.btoa
if btoa? and JSON?
compile = (code, options = {}) ->
options.inlineMap = true
CoffeeScript.compile code, options
透過 XHR 從當前網域載入遠端指令碼。
CoffeeScript.load = (url, callback, options = {}, hold = false) ->
options.sourceFiles = [url]
xhr = if window.ActiveXObject
new window.ActiveXObject('Microsoft.XMLHTTP')
else
new window.XMLHttpRequest()
xhr.open 'GET', url, true
xhr.overrideMimeType 'text/plain' if 'overrideMimeType' of xhr
xhr.onreadystatechange = ->
if xhr.readyState is 4
if xhr.status in [0, 200]
param = [xhr.responseText, options]
CoffeeScript.run param... unless hold
else
throw new Error "Could not load #{url}"
callback param if callback
xhr.send null
透過讓它編譯和評估所有內容類型為text/coffeescript
的指令碼標籤來在瀏覽器中啟用 CoffeeScript。這會在載入網頁時發生。
runScripts = ->
scripts = window.document.getElementsByTagName 'script'
coffeetypes = ['text/coffeescript', 'text/literate-coffeescript']
coffees = (s for s in scripts when s.type in coffeetypes)
index = 0
execute = ->
param = coffees[index]
if param instanceof Array
CoffeeScript.run param...
index++
execute()
for script, i in coffees
do (script, i) ->
options = literate: script.type is coffeetypes[1]
source = script.src or script.getAttribute('data-src')
if source
CoffeeScript.load source,
(param) ->
coffees[i] = param
execute()
options
true
else
options.sourceFiles = ['embedded']
coffees[i] = [script.innerHTML, options]
execute()
在正常的瀏覽器和 IE 中,監聽視窗載入。
if window.addEventListener
window.addEventListener 'DOMContentLoaded', runScripts, no
else
window.attachEvent 'onload', runScripts