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,

Другие вопросы по тегам