document.hidden неправильно ложно при использовании в элементе управления WebBrowser
Я хочу определить, когда окно свернуто в JavaScript, поэтому я использую document.hidden
, В приведенном ниже фрагменте нажмите "Пуск" и сверните окно, щелкнув кнопку "Свернуть", переключая значок приложения на панели задач, используя стрелку " Win + Down", " 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>
Там нет проблем.
Тем не менее, я размещаю этот код JS в VB6.
Я создал простой проект с формой с WebBrowser
контроль и CommandButton
, Мой единственный код такой:
Private Sub Command1_Click()
WebBrowser1.Navigate "http://localhost:1234/mypage.html"
End Sub
Нажатие на командную кнопку переводит меня на ту же страницу:
В VB6 "скрытый" отображается для этих трех случаев:
- нажав кнопку свертывания
- Win + Стрелка вниз
- Win + D
Но нет, в этом случае:
- переключение значка приложения на панели задач
Я также заметил, что "hidden"
отображается только в первый раз, когда окно свернуто. Если вы уменьшите его снова, он будет отображать "видимый".
Я предполагаю, что это ошибка с тем, как элементы управления WebBrowser интегрируются с JS? У кого-нибудь есть обходные пути для этого?
Я могу вскоре изменить этот вопрос на более широкий, так как это имеет меньшее отношение к document.hidden
быть неправым и больше делать с WebBrowser
не очень хорошо интегрируется с видимостью страниц JS.
Более общая проблема, которую я обнаружил, заключается в том, что visibilitychange
обработчик не запускается при запуске на странице, размещенной WebBrowser
управление в VB6, но в браузере работает нормально:
var ta = document.getElementById("ta");
document.addEventListener("visibilitychange", function ()
{
ta.value += document.visibilityState + "\n";
});
<textarea id="ta" cols="50" rows="20"></textarea>
1 ответ
Я работал над этим, слушая 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
,