2013-06-19 35 views
2

我有一些Clojurescript代碼爲了設置HTML5畫布線破折號。由於這是跨瀏覽器問題的典型案例,我想首先檢查Canvas Context對象是否具有屬性setLineDash,然後調用它(以避免屬性錯誤等)。我選擇了aget語法,因爲它阻止了名稱的消除。非法調用Chrome和Closure錯誤

(when (aget c "setLineDash") 
    ((aget c "setLineDash") c dash)) 

相關線路得到由谷歌關閉編譯,在 「空白」 模式:

if(cljs.core.truth_(c["setLineDash"])) { 
    c["setLineDash"].call(null, c, dash) 
} 

,然後在先進的優化模式:

y(a.setLineDash) && a.setLineDash.call(m, a, c);

所以我覺得像彙編沒問題。 a似乎是c的名字,y大概是cljs.core.truth_。該代碼適用於Mozilla Firefox(包括adv和空白)和Google Chrome(空白)。先進的編譯沒有谷歌瀏覽器由於TypeError工作:

Google Chrome Debug Window output

這是一種奇怪的,因爲.setLineDash是對象的一部分(並在空白模式下工作)。我的「感覺」:現在我感到奇怪的是,呼叫的參數m。這是null,我不知道這是否是這種行爲的原因?在某種程度上,我對這裏的Javascript內部不太自信以判斷這一點。根據https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/callm代替fun.call的參數this

回答

3

我現在遵循了使用an extern.js file並在那裏聲明setLineDash的方法。

var CanvasRenderingContext2D = {}; 
CanvasRenderingContext2D.setLineDash = function() {}; 

然後我用

(when (.. c -setLineDash) 
    (.. c (setLineDash dash))) 

其中編譯(高級模式)

y(a.setLineDash)&&a.setLineDash(c); 

和工作正常(無.call怪事)。

+0

看起來不錯! – dnolen