簡體   English   中英

Window 焦點和模糊事件在 Android 瀏覽器上無法正常工作

[英]Window focus and blur events not working correctly on Android browser

我發現當附加到 window、文檔或正文時,Javascript 焦點和模糊事件在 Android 瀏覽器上無法正確觸發。

我編寫了一個簡單的測試腳本,它在桌面瀏覽器上正常工作,但在 Android 股票瀏覽器、Dolphin 和 Opera 移動設備上失敗:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
    <title>Focus test</title>

    <script type="text/javascript">

        window.onfocus = function() {
            document.getElementById('console').innerHTML += '<div>Focus event handler fired.</div>';
        };
        window.onblur = function() {
            document.getElementById('console').innerHTML += '<div>Blur event handler fired.</div>';
        };

    </script>
</head>

<body>
    <input id="test" name="test" />
    <div id="console"></div>
</body>

</html>

有趣的是,如果表單輸入獲得焦點,事件處理程序會觸發,並且在模糊時,模糊事件處理程序會觸發兩次。

有沒有人有一個好的解決方案或解決方法?

編輯:預期的結果是,如果我更改瀏覽器選項卡或更改為另一個應用程序,模糊事件應該觸發,如果我 go 回到瀏覽器選項卡,焦點事件應該觸發(這就是它在桌面上的工作方式)

我剛剛在運行 jellybean 的 Galaxy Nexus 上測試了您的代碼(我所擁有的),並且該代碼運行良好,並且兩個事件僅觸發一次。

document.getElementById('test').onfocus = function() {
    document.getElementById('console').innerHTML += '<div>Focus event handler fired.</div>';
};
document.getElementById('test').onblur = function() {
    document.getElementById('console').innerHTML += '<div>Blur event handler fired.</div>';
};​

可能是您的目標是在大多數移動設備上通常不能“模糊”本身的窗口。 確保你直接要求元素報告它自己的模糊和焦點事件。

編輯:另外,請確保在應用事件偵聽器之前等待 DOM 准備好。

我相信輪詢文檔的焦點狀態可能正是您想要的。 每 500 毫秒輪詢一次並不昂貴,並且會給你你需要的東西。 如果您想要文檔焦點更改幾乎立即發出警報,您可以嘗試 100 毫秒之類的時間。

let prevStateIsFocused = null // used to ensure that there is only one execution of a function for either the document focused or not

setInterval(() => {
    if(document.hasFocus()){
        if(prevStateIsFocused !== true){
            console.log('window is focused')
            // execute some function here ...
        }
        prevStateIsFocused = true
    }else{
        if(prevStateIsFocused !== false){
            console.log('window has lost focused, blurred')
            // execute some function here ...
        }
        prevStateIsFocused = false
    }
}, 500)

演示: https://jsfiddle.net/sanjaydookhoo/1h7gncaf/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM