1

我想检测一个窗口何时在 JavaScript 中最小化,所以我使用document.hidden. 在下面的代码段中,单击“开始”并通过单击最小化按钮、切换任务栏中的应用程序图标、使用Win+ Down Arrow、使用Win+D等来最小化窗口。

当窗口最小化时,您会看到“隐藏”出现在文本区域中。

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 中,这三种情况显示为“隐藏”:

  • 单击最小化按钮
  • Win+Down Arrow
  • Win+D

但不是,在这种情况下:

  • 切换任务栏中的应用程序图标

我还注意到"hidden"仅在一次最小化窗口时显示。如果再次最小化它,它将显示“可见”。

我猜这是 WebBrowser 控件如何与 JS 集成的错误?有没有人有任何解决方法?


我可能很快会将这个问题重新用于更广泛的问题,因为这与document.hidden错误的关系不大,而与没有与 JS 的Page VisibilityWebBrowser很好地集成有关。

我发现的一个更普遍的问题是,当在 VB6 中visibilitychange的控件托管的页面中运行时,处理程序不会触发WebBrowser,但在浏览器中完全可以正常工作:

var ta = document.getElementById("ta");
document.addEventListener("visibilitychange", function ()
{
	ta.value += document.visibilityState + "\n";
});
<textarea id="ta" cols="50" rows="20"></textarea>

4

1 回答 1

0

我通过监听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.

于 2018-06-16T16:44:50.353 回答