如何确定用户是否正在拖动选项卡

时间:2014-08-24 10:27:58

标签: google-chrome-extension

我想弄清楚,如果用户拖动标签,任何标签。我不关心它是哪个标签,我只需要知道,是否有任何标签被拖动。

这样做的最佳方式是什么?

请注意:我问a similar question。然而,在我想知道的另一个问题中,当拖动停止时我可以执行我的移动操作。那里给出的解决方案(重试直到它起作用)似乎并不适用于这个新问题。

2 个答案:

答案 0 :(得分:2)

无法判断是否有任何标签被“拖动”(=在标签上按住鼠标按钮)。

如果您想知道标签拖动发生(反对“即将发生”),那么您可以使用chrome.tabs.onMoved(在标签内移动)和/或chrome.tabs.onAttached / chrome.tabs.onDetached事件。

答案 1 :(得分:0)

我基于以下事实构建了一个解决方案:Chrome不允许在包含当前被拖动的标签的窗口中移动标签。 在这种情况下,chrome.runtime.lastError.message将为Tabs cannot be edited right now (user may be dragging a tab)

我通过获取焦点窗口的第一个选项卡并将其移动到索引来利用它。因为我使用自己的索引,所以当操作成功时,实际上并没有视觉上的变化。

var Chrome = {
    isUserDragging: function (callback) {
        chrome.windows.getAll({ populate: true }, function (windows) {
            var window = windows.filter(function (x) {
                return x.type === 'normal' && x.focused && x.tabs
                       && x.tabs.length;
            })[0];
            if (window === undefined)
                return;
            var tab = window.tabs[0];
            chrome.tabs.move(tab.id, { index: tab.index }, function () {
                callback(
                    chrome.runtime.lastError !== undefined &&
                    chrome.runtime.lastError.message.indexOf('dragging') !== -1);
            });
        });
    }
}

用法是:

Chrome.isUserDragging(function(userIsDragging) {
    if(userIsDragging)
        // do something
    else
        // do something else
}); 

现在,基于此,我使用setTimeout构建了一个轮询机制,当用户停止拖动时,我会定期检查用户是否仍在拖动并执行操作。

可以看到完整的实施here,并使用these two辅助类。