2013-01-31 52 views
0

我有一個使用map service APIhttp://mapy.cz尤其),用於獲取圖像作爲背景基於所提供的地圖數據附加一些附圖SWT應用。JavaScript方法處理

的瀏覽器組件截圖被SWT GC實例發出之前,我試圖隱藏圖層控件,把它乾淨越好。通過調用控制檯hideControls()功能

function hideControls() { 
    var controls = map.getControls(); 
    for (var i = controls.length; i > 0; i--) { 
     map.removeControl(controls[i]); 
    } 
    //alert('test'); 
} 

作品中的所有桌面瀏覽器絕對完美無瑕:此功能是通過服務的JS API提供的這種方式。

但是,如果該方法是通過SWT瀏覽器組件調用由

browser.evaluate("hideControls();"); 

它只是不直到警報()函數工作(如現在評論)是註釋。然後顯示警報對話框並按照它們應該隱藏的方式進行控制。

任何想法,爲什麼alert()方法調用的原因是JavaScript函數的正確的工作?

EDIT

一些附加代碼上下文

browser.evaluate("hideControls();"); 
// ugly ie scroll bar force workaround 
// calls JS methods which returns size of map content in browser component 
Double mapWidth = (Double) browser.evaluate("return getSizeX();"); 
Double mapHeight = (Double) browser.evaluate("return getSizeY();"); 
// creates new canvas 
GC gc = new GC(browser); 
// do the screenshot 
capturedImage = new Image(display, mapWidth.intValue(), mapHeight.intValue()); 
gc.copyArea(capturedImage, 0, 0); 
// cleanout 
gc.dispose(); 

JavaScript進行地圖的大小計算(由JS API在地圖服務提供)方法

function getSizeX() { 
    return map.getSize().x; 
} 
function getSizeY() { 
    return map.getSize().y; 
} 

EDIT2

一些更深調試從地圖層去除控制方法之後是

SMap.prototype.removeControl = function (a) { 
    var b = this.controls.indexOf(a); 
    - 1 != b && ((a = a.getContainer()) && this.controlLayer.removeItem(a), this.controls.splice(b, 1)) 
}; 

所以對於實例(HUD控制)

SMap.Layer.HUD.prototype.removeItem = function (a) { 
    a.parentNode.removeChild(a) 
}; 

這意味着它直接改變DOM樹,儘管它不是異步..

+1

您可能正在嘗試執行與某種異步操作有關的工作。 – Pointy

+1

這或者是Pointy說的,或者你在調用'hideControls'後做了一些耗時的操作,並且瀏覽器正在等待事件循環的下一個滴答迴流/重繪(我的回答解決了最後一種情況)。 – bfavaretto

+0

調用'setTimeout'就像你在編輯時顯示的那樣,用'hideControls()'(注意'()')是錯誤的。我刪除了我的答案,提出了類似的方法,因爲它是錯誤的。我檢查了你提到的地圖服務,但我不會說捷克語:(可能它是異步的) – bfavaretto

回答

0

正如Sean Kinsey所暗示的那樣,它確實是瀏覽器組件的問題,需要在JavaScript線程完成所有必要步驟之前停止。

我找到了解決辦法,事業SWT GUI組件必須考慮他們的事件處理自己關心的,它雖然可以搪塞瀏覽器的JavaScript之前完成。

browser.evaluate("hideControls();"); 
for(int i = 0; i < 20; i++) { 
    if(!display.readAndDispatch()); display.sleep(); 
} 

這是醜陋的解決辦法,但20「滴答」的瀏覽器做一些瑣碎的DOM操作應該是足夠的(我希望)。

1

alert這裏有一個可見的效果,這裏指向你有競爭條件的方向,其中阻塞alert調用允許執行的另一個「線程」趕上。

所以,你可能想看看它的代碼執行,例如通過使用console.log整個跟蹤訂單。

+0

定期的桌面瀏覽器評估'hideControls()'函數正確和SWT瀏覽器組件沒有控制檯登錄..無論如何,如何拖動瀏覽器,並讓他趕上不同的方式比警報..? – Sorceror

+0

@Sorceror - 你想要做的是添加顯式耦合到你的代碼,所以它只能以有序的方式執行。這可能意味着添加標誌或鉤子以協調所採用的不同代碼路徑。 –