如何在 JXBrowser 中调用 javascript 函数

How to call a javascript function in JXBrowser

我需要将内部 url 上传到 Swing 组件,然后从加载的 html 调用 JavaScript 函数。 我目前正在测试 JXBrowser 包,看看它是否符合我的要求。 为了测试简单,我将调用放在 JButton 中,这样我就可以手动调用它。 不幸的是,虽然我可以生成一个简单的警报调用,但我无法使代码成功调用该函数。这是我的代码:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

import com.teamdev.jxbrowser.chromium.Browser;
import com.teamdev.jxbrowser.chromium.JSValue;
import com.teamdev.jxbrowser.chromium.swing.BrowserView;

public class JXBrowserTest {

    public static void main(String[] args) {

        final Browser browser = new Browser();
        BrowserView view = new BrowserView(browser);
        String text = "";
        try {
            text = readFile("C:\work\temp\report.txt");
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        final String report = text;
        JButton button = new JButton("Java Script");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                JSValue value = browser.executeJavaScriptAndReturnValue("gotoReport(" +report+")");
                //browser.executeJavaScript("window.alert(\"Nothing is True\")");//this does work!

            }
        });

        JFrame frame = new JFrame("JxBrowser - Dialoge Test");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        frame.add(view, BorderLayout.CENTER);
        frame.add(button, BorderLayout.PAGE_END);
        frame.setSize(500, 400);
        frame.setVisible(true);

        browser.loadURL("http://myInternalUrl.swe");

    }

    private static String readFile(String file) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String line = null;
        StringBuilder stringBuilder = new StringBuilder();
        String ls = System.getProperty("line.separator");

        try {
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line);
                stringBuilder.append(ls);
            }

            return stringBuilder.toString();
        } finally {
            reader.close();
        }
    }
}

我需要在 JS 中调用 gotoReport(report),其中 report 是一个 xml 文本文件。 我怀疑我的问题是没有使用 JXBrowser 方法正确调用此函数,但我尝试了所有我能想到的方法。 有人可以帮忙吗?

我认为存在语法错误。假设你的文件内容是"Text content",你这样调用你的JavaScript函数:

gotoReport(Text content);

当期望这样调用它时:

gotoReport('Text content');

我建议您使用以下方法:

JSFunction gotoReport = browser.executeJavaScriptAndReturnValue("gotoReport").asFunction();
gotoReport.invoke(null, report);