popup - 使 jxBrowser 在当前窗口中打开弹出窗口,而不是“弹出”
问题描述
如何设置 jxBrowser 打开将在新窗口中弹出以在调用页面上打开的链接(或至少在新选项卡中)?
这是我认为我必须覆盖的调用(这是示例):
//....
Engine engine = Engine.newInstance(
EngineOptions.newBuilder(
enderingMode.OFF_SCREEN ).enableIncognito().build()
Browser _browser = engine.newBrowser();
//this won't even compile
_browser.set(
OpenPopupCallback.class,
(params) -> {
// Access the created popup.
Browser popup = params.popupBrowser();
_browser.navigation().loadUrl(params.targetUrl());
return Response.proceed();
});
_browser.navigation().loadUrl("http://www.stackoverflow.com");
这就是我在 jfx 中调用它的方式,但甚至不会编译,没有这个调用的代码可以工作(打开浏览器)。
更新,鉴于弹出窗口的性质,我试图重写 javascript 函数 ( ) 本身以window.open
强制. 这通过在每个导航上运行代码name
_parent
String the Javascript = "window.open = function (open) {return function (url, name, features{ console.log("open wrapper");return open.call(window, url, '_parent', features);};}(window.open);"
我认为我可以通过
_browser.frames().get(0).executeJavaScript(theJavascript);
但是在远程控制台中,我什至看不到日志消息(“打开包装器”)。
我仔细检查了相同的代码,如果复制粘贴到远程控制台中,它就可以工作。
我错过了什么?
解决方案
这是一个完整的 JavaFX 示例,演示了如何在主Browser
实例中打开弹出窗口的 URL 并禁止弹出窗口:
import static com.teamdev.jxbrowser.engine.RenderingMode.OFF_SCREEN;
import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.browser.callback.CreatePopupCallback;
import com.teamdev.jxbrowser.browser.callback.CreatePopupCallback.Response;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.view.javafx.BrowserView;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public final class SmokeTest extends Application {
@Override
public void start(Stage primaryStage) {
// Creating and running Chromium engine.
Engine engine = Engine.newInstance(OFF_SCREEN);
Browser browser = engine.newBrowser();
browser.set(CreatePopupCallback.class, params -> {
browser.navigation().loadUrl(params.targetUrl());
return Response.suppress();
});
// Creating UI component for rendering web content
// loaded in the given Browser instance.
BrowserView view = BrowserView.newInstance(browser);
BorderPane root = new BorderPane(view);
Scene scene = new Scene(root, 1280, 900);
primaryStage.setTitle("Hello World");
primaryStage.setScene(scene);
primaryStage.show();
browser.navigation().loadUrl(
"https://www.encodedna.com/javascript/demo/open-new-window-using-javascript-method.htm");
// Close the engine when stage is about to close.
primaryStage.setOnCloseRequest(event -> engine.close());
}
}
运行此程序并单击显示弹出窗口的按钮。您将看到弹出窗口未显示,其 URL 已加载到 main 中Browser
。
推荐阅读
- sql - 如何在 SQL Server 上选择上个月的对应值(我认为这是一个简单的查询)
- javascript - 有没有办法修剪从 JSON 对象获取的字符串公式并使用 PHP 变量应用它?
- r - 如何定制 R 绘图轴?
- r - 如何删除数据框中行名的某些部分
- python - Get the latest FTP folder name in Python
- javascript - 起初它说它不是一个功能,现在它只是什么都不做
- swift - 如何在 Swift 中匹配带有重音符号(十六进制代码格式)的字母及其类似的英文字母?
- c# - 没有给出与所需的形式参数“信息”相对应的参数
- ms-access - 按名字和姓氏组合删除重复记录
- unix - 对重复的 Unix 提示回答是