我有一個使用map service API(http://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樹,儘管它不是異步..
您可能正在嘗試執行與某種異步操作有關的工作。 – Pointy
這或者是Pointy說的,或者你在調用'hideControls'後做了一些耗時的操作,並且瀏覽器正在等待事件循環的下一個滴答迴流/重繪(我的回答解決了最後一種情況)。 – bfavaretto
調用'setTimeout'就像你在編輯時顯示的那樣,用'hideControls()'(注意'()')是錯誤的。我刪除了我的答案,提出了類似的方法,因爲它是錯誤的。我檢查了你提到的地圖服務,但我不會說捷克語:(可能它是異步的) – bfavaretto