You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin组件中执行多行JavaScript代码问题求助

解决Vaadin中executeJs仅执行第一行JS代码的问题

你的问题出在JS代码里的未定义变量错误,导致代码执行中断:你在回调函数里写了var dimensions = map.getSize();,但JS作用域里并没有map这个变量——Java端传入的map实例对应的JS变量是$0(executeJs的第一个参数占位符),这个语法错误会让浏览器终止后续代码执行,所以只有第一个alert('-1')能触发。

另外,用字符串拼接多行JS代码容易出现格式或语法疏漏,建议改用Java文本块(Java 15+支持)来编写完整的JS逻辑,同时添加必要的错误处理,避免小问题导致代码停摆。

修改后的代码如下:

@NpmPackage(value = "leaflet-image", version = "0.4.0")
@JsModule("leaflet-image/leaflet-image.js")
@Tag("leaflet-image")
public class LLeafletImage extends Div {

    private static final long serialVersionUID = 1L;

    public void print(LMap map) {
        // 使用Java文本块编写多行JS,避免拼接错误
        String jsCode = """
            alert('-1');
            // 调用leafletImage,$0对应传入的map实例
            leafletImage($0, function(err, canvas) {
                // 先处理错误,避免回调内出错导致后续逻辑无法执行
                if (err) {
                    console.error('leafletImage执行出错:', err);
                    return;
                }
                alert('0');
                var img = document.createElement('img');
                // 使用$0获取传入的map实例的尺寸
                var dimensions = $0.getSize();
                img.width = dimensions.x;
                img.height = dimensions.y;
                img.src = canvas.toDataURL();
                // 先检查目标容器是否存在,避免DOM操作报错
                var imagesContainer = document.getElementById('images');
                if (imagesContainer) {
                    imagesContainer.innerHTML = '';
                    imagesContainer.appendChild(img);
                } else {
                    console.error('未找到id为"images"的DOM元素');
                }
            });
            alert('2');
        """;
        UI.getCurrent().getPage().executeJs(jsCode, map.clientComponentJsAccessor());
    }
}

关键修改点:

  • 将JS中的map.getSize()替换为$0.getSize(),正确引用Java端传入的map实例。
  • 用Java文本块"""包裹多行JS代码,摆脱字符串拼接的繁琐和潜在错误。
  • 在leafletImage回调中添加错误捕获,同时检查目标DOM元素是否存在,避免小错误中断代码执行。
  • 打开浏览器开发者工具(F12)的控制台,能快速定位JS执行时的报错信息,方便排查问题。

内容的提问来源于stack exchange,提问作者padmalcom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:05:15