document.hidden ошибочно имеет значение false при использовании в элементе управления WebBrowser.

Я хочу определить, когда окно свернуто в JavaScript, поэтому я использую document.hidden. В приведенном ниже фрагменте нажмите «Пуск» и сверните окно, нажав кнопку свертывания, переключив значок приложения на панели задач, используя Win + Стрелка вниз, используя 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 + Стрелка вниз
  • Победа + 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>


person pushkin    schedule 14.06.2018    source источник


Ответы (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.

person pushkin    schedule 16.06.2018