JX浏览器如何设置脚本超时
How to set script timeout for JX browser
我们正在使用 jxbrowser 版本 6.21(撰写本文时为最新版本)。
如果脚本陷入无限循环,jxbrowser 就会冻结并保持无响应。我等了2分多钟
有什么办法可以顺利处理吗?
现代浏览器检测到这一点并向用户显示一个覆盖图以停止脚本。
SSCCE: html-包含此内容的文件:
<html>
<body>
<script>
function badLoop() {
var nextTime = new Date().getTime();
while (true) {
var now = new Date().getTime();
if (now > nextTime) {
console.log('badLoop() running: ' + now);
nextTime = now + 500;
}
}
}
</script>
<input type="button" value="startLoop" onClick="badLoop()" />
</body>
</html>
使用其他浏览器测试运行:
- Firefox 大约 15 秒后:
当按下 "stop website" 时,Firefox 只是停止脚本,但保持网站打开并将其记录在控制台中:
Google Chrome 大约 30 秒后:
Google Chrome(firefox 除外)在按下离开后实际上离开了网站(并显示此错误):
jxbrowser 可以吗?是全自动还是用户确认?
下面是一个示例,演示如何在 JxBrowser 中拦截相应的 onRenderUnresponsive
事件并检测网页无响应:
public class BrowserSample {
public static void main(String[] args) {
Browser browser = new Browser();
BrowserView view = new BrowserView(browser);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(view, BorderLayout.CENTER);
frame.setSize(700, 500);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
browser.addRenderListener(new RenderAdapter() {
@Override
public void onRenderUnresponsive(RenderEvent event) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(view, "The web page is unresponsive.");
}
});
}
});
browser.loadHTML("<html>\n"
+ " <body>\n"
+ " <script>\n"
+ " function badLoop() {\n"
+ " var nextTime = new Date().getTime();\n"
+ " while (true) {\n"
+ " var now = new Date().getTime();\n"
+ " if (now > nextTime) {\n"
+ " console.log('badLoop() running: ' + now);\n"
+ " nextTime = now + 500;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " </script>\n"
+ " <input type=\"button\" value=\"startLoop\" onClick=\"badLoop()\" />\n"
+ " </body>\n"
+ "</html>");
}
}
我们正在使用 jxbrowser 版本 6.21(撰写本文时为最新版本)。
如果脚本陷入无限循环,jxbrowser 就会冻结并保持无响应。我等了2分多钟
有什么办法可以顺利处理吗?
现代浏览器检测到这一点并向用户显示一个覆盖图以停止脚本。
SSCCE: html-包含此内容的文件:
<html>
<body>
<script>
function badLoop() {
var nextTime = new Date().getTime();
while (true) {
var now = new Date().getTime();
if (now > nextTime) {
console.log('badLoop() running: ' + now);
nextTime = now + 500;
}
}
}
</script>
<input type="button" value="startLoop" onClick="badLoop()" />
</body>
</html>
使用其他浏览器测试运行:
- Firefox 大约 15 秒后:
当按下 "stop website" 时,Firefox 只是停止脚本,但保持网站打开并将其记录在控制台中:
Google Chrome 大约 30 秒后:
Google Chrome(firefox 除外)在按下离开后实际上离开了网站(并显示此错误):
jxbrowser 可以吗?是全自动还是用户确认?
下面是一个示例,演示如何在 JxBrowser 中拦截相应的 onRenderUnresponsive
事件并检测网页无响应:
public class BrowserSample {
public static void main(String[] args) {
Browser browser = new Browser();
BrowserView view = new BrowserView(browser);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(view, BorderLayout.CENTER);
frame.setSize(700, 500);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
browser.addRenderListener(new RenderAdapter() {
@Override
public void onRenderUnresponsive(RenderEvent event) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(view, "The web page is unresponsive.");
}
});
}
});
browser.loadHTML("<html>\n"
+ " <body>\n"
+ " <script>\n"
+ " function badLoop() {\n"
+ " var nextTime = new Date().getTime();\n"
+ " while (true) {\n"
+ " var now = new Date().getTime();\n"
+ " if (now > nextTime) {\n"
+ " console.log('badLoop() running: ' + now);\n"
+ " nextTime = now + 500;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " </script>\n"
+ " <input type=\"button\" value=\"startLoop\" onClick=\"badLoop()\" />\n"
+ " </body>\n"
+ "</html>");
}
}