簡體   English   中英

跨JavaScript對象引用事件偵聽器

[英]Reference an event listener across JavaScript objects

所以我編寫了一個API,允許不同的應用程序處理在線/離線檢測:

function onOffAPI() {

    var connection;

    function init() {
        var onLoadStatus = window.navigator.onLine;

        window.addEventListener('online', function() {
            connection.status = true;
        }, false);

        window.addEventListener('offline', function() {
            connection.status = false;
        }, false);

        return {
            status: onLoadStatus
        };
    }

    return {
        getStatus: function () {
            if (!connection) {
                connection = init();
            }
            return connection;
        }
    };
}

因此,示例應用程序使用以下代碼來檢測應用程序何時在線或離線:

var $alert = $('.alert');
var notification = new onOffAPI();
var networkStatus = notification.getStatus().status;

$alert.text('Online: ' + notification.getStatus().status); //returns true if online, false if offline

能夠在應用程序加載時引用API很簡單,但是我困惑的是,每當網絡連接突然從聯機更改為脫機時,如何引用事件偵聽器,反之亦然。 有人可以幫幫我嗎?

我可以看到你想要做什么,但我認為你是以錯誤的方式去做。 您真正想要的是將在線和離線事件重新公開為新的“connectionStatus”事件。 您目前擁有的將要求您輪詢api以獲取狀態,而您確實希望它是事件驅動的。

看起來你正在使用jQuery,所以我希望你不介意我在這個例子中使用jQuery。 以下有兩種方法可以通知狀態。 一種方法是使用jQuery回調,另一種方法是公開一個新的事件“connectionStatus”:

var apiOnlineOffline = (function () {
    var callbacks = $.Callbacks('unique memory'),
        eventName = 'connectionStatus';

    function setStatus(status) {
        $(window).trigger(eventName, status);
        callbacks.fire(status);
    }

    function addCallback(callback) {
        callbacks.add(callback);
    }

    return {
        init: function () {
            // document.body #becauseIE8
            document.body.addEventListener('online', function () {
                setStatus(true);
            });
            document.body.addEventListener('offline', function () {
                setStatus(false);
            })

            // Set the initial status; assume true for browsers that don't support onLine property.
            setStatus(window.navigator.onLine || true)
        },

        addCallback: addCallback
    };
}());

用法:

<p>
    Current connection status (event): <span id="statusEvent"></span>
</p>

<p>
    Current connection status (callback): <span id="statusCallback"></span>
</p>

<script type="text/javascript">
    $(function () {
        // Using events.
        $(window).on('connectionStatus', function (event, online) {
            $('#statusEvent').text(online.toString());
        });

        // Using callbacks.
        apiOnlineOffline.addCallback(function (online) {
            $('#statusCallback').text(online.toString());
        })

        // Note; this must appear last or the event version won't work.
        apiOnlineOffline.init();
    });
</script>

希望這可以幫助。

參考: caniuse.com在線離線文章

暫無
暫無

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

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