2

我正在爲我無法直接訪問的網站開發Flash應用程序。 Flash應用程序應該在網站上調用由網站發佈者定義的JavaScript功能。我被告知檢查JavaScript對象是否存在等從動作調用它的功能之前:在從Flash調用它之前確保存在javascript對象

var ok:Boolean = ExternalInterface.call(function() { 
    return typeof customObject !== \'undefined\' 
} 

如果我然後繼續:

if (ExternalInterface.available && ok) { 
    ExternalInterface.call('customObject.doSomething', someStr); 
} 

請問這個如果病情始終是假的,因爲那個存入ok的電話在我使用支票之前可能沒有完成,或者是ExternalInterface.call instantenious?換句話說,在決定是否可以保存customObject的前提下,我會不知何故必須等待第一次調用的結果。

編輯:按照意見提出更新代碼:

if (ExternalInterface.available) { 
    var ok:Boolean = ExternalInterface.call('function() { return typeof customObject !== \'undefined\' }'); 
    if (ok) { 
    ExternalInterface.call('customObject.doSomething', someStr); 
    } else { 
    .. do some fallback 
    } 
} else { 
    .. do some fallback 
} 
+0

好吧,檢查確定,如果我可以依靠它爲真正的程序邏輯工作。 – kontur 2012-02-10 21:03:10

+0

在我真正的應用程序中,if子句有一個else部分,執行一個不太理想但仍然有效的動作 - 我希望只有當我肯定通過ExternalInterface調用特定的JavaScript對象時出現某種原因,另一個。 – kontur 2012-02-10 22:51:51

+0

你的意思是我應該將'var ok:Boolean ...'封裝成'if(ExternalInterface.avaialble){...'子句? – kontur 2012-02-11 16:14:57

回答

4

健壯性,你需要檢查功能是否有太多:

var ok:Boolean = ExternalInterface.call(function() { 
    if (typeof(customObject) === 'object' && typeof(customObject.doSomething) === 'function') { 
     return true; 
    } 
} 

ExternalInterface.call是同步的,所以你會發現,它會等到該位被完成,直到上移動到下一個。

+0

好點也檢查功能,雖然我相信網站發佈方在確保這一點。對我來說真正的問題是同步的問題,所以這是給你的答案。我明白他的意思是我確實可以在第一次通話後使用支票,因爲代碼會等待結果。 – kontur 2012-02-10 13:57:37

+1

@wvxvw同意 - 沒有parens是必要的,你可以省略if(),只是做返回,然後整個陳述,但我認爲它讀取稍好,這種方式,因爲流是完全明確的。嚴格的平等也不是必要的,但默認情況下使用它是一個好習慣:大多數時候您希望變量類型無論如何都是相同的,並且有時可能很難突出顯示錯誤。 – 2012-02-12 22:36:33

1

ExternalInterface.call方法將盡快SWF文件已加載(而你的JavaScript文件或變量在那一刻可能不存在)可用。所以你想要做的是使用ExternalInterface.addCallback方法在ActionScript中將你的函數綁定到JavaScript代碼中的另一個函數。

Here's the documentation of that feature

+0

有效的點,但在這個特定的情況下實際上不擔心;我知道JavaScript是在瑞士法郎之前,如果它在那裏:) – kontur 2012-02-10 13:55:57

相關問題