document.hidden 在 WebBrowser 控件中使用时错误地为 false
document.hidden is incorrectly false when used in a WebBrowser control
我想检测 window 何时在 JavaScript 中最小化,所以我使用 document.hidden
。在下面的代码片段中,单击 "Start" 并通过单击最小化按钮最小化 window,切换任务栏中的应用程序图标,使用 Win + 向下箭头,使用Win + D,等等
当 window 最小化时,您会看到 "hidden" 出现在文本区域中。
var startButton = document.getElementById("start");
var stopButton = document.getElementById("stop");
var ta = document.getElementById("ta");
var id;
startButton.onclick = function() {
id = setInterval(function() {
ta.value += document.hidden ? "hidden\n" : "visible\n";
}, 1000);
};
stopButton.onclick = function() {
if (id) clearInterval(id);
};
<button id="start">Start</button>
<button id="stop">Stop</button>
<br />
<textarea id="ta" cols="50" rows="20"></textarea>
没有问题。
但是,我在 VB6 中托管此 JS 代码。
我创建了一个简单的项目,其中包含一个带有 WebBrowser
控件和 CommandButton
的表单。我唯一的代码是这样的:
Private Sub Command1_Click()
WebBrowser1.Navigate "http://localhost:1234/mypage.html"
End Sub
单击命令按钮将我带到同一页面:
在VB6中,这三种情况显示"hidden":
- 单击最小化按钮
- Win + 向下箭头
- 赢 + D
但不是,在这种情况下:
- 切换任务栏中的应用程序图标
我还注意到 "hidden"
仅在 第一次 时显示 window 最小化。如果再最小化,会显示"visible"。
我猜这是 WebBrowser 控件如何与 JS 集成的错误?有人对此有任何解决方法吗?
我可能很快会将这个问题重新调整为一个更广泛的问题,因为这与 document.hidden
错误的关系不大,而更多与 WebBrowser
没有与 JS 的 Page Visibility 很好地集成有关.
我发现的一个更普遍的问题是,当 运行 位于由 VB6 中的 WebBrowser
控件托管的页面中时,visibilitychange
处理程序不会触发,但工作正常在浏览器中:
var ta = document.getElementById("ta");
document.addEventListener("visibilitychange", function ()
{
ta.value += document.visibilityState + "\n";
});
<textarea id="ta" cols="50" rows="20"></textarea>
我通过监听 Resize
事件来解决这个问题,每当 WindowState
发生变化时,我都会在我的 JS 代码中设置一个 属性 来指示状态:
Private Sub Form_Resize()
Static lWindowState As Long
Dim lNewWindowState As Long
Dim lOldWindowState As Long
lNewWindowState = m_DesktopForm.WindowState
lOldWindowState = lWindowState
If lWindowState <> lNewWindowState Then
lWindowState = lNewWindowState
Dim bHidden As Boolean
bHidden = (lWindowState = vbMinimized)
Call CallByName(MyJSObj, "windowIsHidden", VbLet, bHidden)
End If
End Sub
我的 JS 有一个对象(VB 可以引用)是这样的:
MyJSObj = {
windowIsHidden: false
}
然后我添加了一个方法来包装document.hidden
:
function isDocumentHidden() {
// if document.hidden is true, trust that. If it's not true, then fall back on what VB says
return document.hidden || MyJSObj.windowIsHidden;
}
我在我的代码中使用该方法而不是 document.hidden
。
我想检测 window 何时在 JavaScript 中最小化,所以我使用 document.hidden
。在下面的代码片段中,单击 "Start" 并通过单击最小化按钮最小化 window,切换任务栏中的应用程序图标,使用 Win + 向下箭头,使用Win + D,等等
当 window 最小化时,您会看到 "hidden" 出现在文本区域中。
var startButton = document.getElementById("start");
var stopButton = document.getElementById("stop");
var ta = document.getElementById("ta");
var id;
startButton.onclick = function() {
id = setInterval(function() {
ta.value += document.hidden ? "hidden\n" : "visible\n";
}, 1000);
};
stopButton.onclick = function() {
if (id) clearInterval(id);
};
<button id="start">Start</button>
<button id="stop">Stop</button>
<br />
<textarea id="ta" cols="50" rows="20"></textarea>
没有问题。
但是,我在 VB6 中托管此 JS 代码。
我创建了一个简单的项目,其中包含一个带有 WebBrowser
控件和 CommandButton
的表单。我唯一的代码是这样的:
Private Sub Command1_Click()
WebBrowser1.Navigate "http://localhost:1234/mypage.html"
End Sub
单击命令按钮将我带到同一页面:
在VB6中,这三种情况显示"hidden":
- 单击最小化按钮
- Win + 向下箭头
- 赢 + D
但不是,在这种情况下:
- 切换任务栏中的应用程序图标
我还注意到 "hidden"
仅在 第一次 时显示 window 最小化。如果再最小化,会显示"visible"。
我猜这是 WebBrowser 控件如何与 JS 集成的错误?有人对此有任何解决方法吗?
我可能很快会将这个问题重新调整为一个更广泛的问题,因为这与 document.hidden
错误的关系不大,而更多与 WebBrowser
没有与 JS 的 Page Visibility 很好地集成有关.
我发现的一个更普遍的问题是,当 运行 位于由 VB6 中的 WebBrowser
控件托管的页面中时,visibilitychange
处理程序不会触发,但工作正常在浏览器中:
var ta = document.getElementById("ta");
document.addEventListener("visibilitychange", function ()
{
ta.value += document.visibilityState + "\n";
});
<textarea id="ta" cols="50" rows="20"></textarea>
我通过监听 Resize
事件来解决这个问题,每当 WindowState
发生变化时,我都会在我的 JS 代码中设置一个 属性 来指示状态:
Private Sub Form_Resize()
Static lWindowState As Long
Dim lNewWindowState As Long
Dim lOldWindowState As Long
lNewWindowState = m_DesktopForm.WindowState
lOldWindowState = lWindowState
If lWindowState <> lNewWindowState Then
lWindowState = lNewWindowState
Dim bHidden As Boolean
bHidden = (lWindowState = vbMinimized)
Call CallByName(MyJSObj, "windowIsHidden", VbLet, bHidden)
End If
End Sub
我的 JS 有一个对象(VB 可以引用)是这样的:
MyJSObj = {
windowIsHidden: false
}
然后我添加了一个方法来包装document.hidden
:
function isDocumentHidden() {
// if document.hidden is true, trust that. If it's not true, then fall back on what VB says
return document.hidden || MyJSObj.windowIsHidden;
}
我在我的代码中使用该方法而不是 document.hidden
。