JS - Window Focus并在Firefox

时间:2016-03-22 17:46:13

标签: javascript jquery firefox firefox-addon

我正在尝试为javascript插件(Greasemoneky)中运行的 Firefox 设置一个小脚本。我们有一个队列,我们​​监控到达的门票,我编写了一些应该每2分钟刷新页面的内容并执行以下操作:

如果在这种情况下找到门票

if (isEmpty($('#incident_table > tbody'))&isEmpty($('#task_table > tbody')))

然后我希望发生以下情况:
- 任务栏闪烁并显示一条消息,以便可见
- 如果窗口被聚焦,它将显示“队列中的门票!”立即提醒
- 如果窗口没有聚焦,它将等待10秒,如果仍然没有聚焦 - 显示“门票在队列中!”提醒并将窗户拉到前面。

我有刷新和闪烁的部分,但我无法让焦点部分工作......我一直在四处寻找,我看到Firefox与window.focus()和所有“问题” “带到前面”,下面的大部分代码都是受到我在本网站上发现的东西的启发。

任何输入都表示赞赏!我也开放了替代方案 - 最后我需要做的是刷新,检查条件并通知我是否已经在看它或者它是否没有集中等待10秒用“软通知”(闪烁)然后带它如果我没注意到它就到前面。

此致

 { 
newExcitingAlerts = (function () {
var oldTitle = document.title;
var msg = "***NEW***";
var timeoutId;
var blink = function() { document.title = document.title == msg ? 'Tickets in queue!' : msg; };
var clear = function() {
clearInterval(timeoutId);
document.title = oldTitle;
window.onmousemove = null;
timeoutId = null;

};

    return function () {
        if (!timeoutId) {
            timeoutId = setInterval(blink, 1000);
            window.onmousemove = clear;
        }
    };
}());


$(document).ready(function(){

   function isEmpty( el ){
        return !$.trim(el.html());
    }
     if (isEmpty($('#incident_table > tbody'))&isEmpty($('#task_table > tbody'))) {

    }


else{

        newExcitingAlerts();

    }

    setTimeout(function() {
        location.reload();
    }, 120000);
});

}

2 个答案:

答案 0 :(得分:0)

在Windows操作系统中,您无法在关注另一个进程的窗口时聚焦窗口。你必须使用js-ctypes来解决这个问题。

在Mac OS X和Linux上,我不确定您是否可以使用正常功能让您的进程从另一个进程中获取焦点。但是,如果你不能确定使用js-ctypes来完成工作。

以下是在Windows中执行此操作的方法 - https://stackoverflow.com/a/32038880/1828637

Windows在OS X和Linux上更难。我使用js-ctypes在所有系统上集中窗口。因此,如果您无法了解如何处理可用的功能,请告诉我们。

答案 1 :(得分:0)

这是我使用过的替代方案,就像魅力一样。 Web API通知。

document.addEventListener('DOMContentLoaded', function () {
  if (Notification.permission !== "granted")
    Notification.requestPermission();
});

function notifyMe() {
  if (!Notification) {
    alert('Desktop notifications not available in your browser. Try Chromium.'); 
    return;
  }

  if (Notification.permission !== "granted")
    Notification.requestPermission();
  else {
    var notification = new Notification('Tickets in queue!', {
      icon: 'http://siliconangle.com/files/2014/05/servicenow-icon.png',
      body: "There are new tickets in queue, please acknowledge!",
    });

    notification.onclick = function () {
      window.open("https://cchprod.service-now.com/task_list.do?sysparm_query=assignment_group%3D3139519437b7f1009654261953990e1f^ORassignment_group%3D31de85e337818a00ef8898a543990e99^ORassignment_group%3Da40029e937ec420065aa261953990eb5^ORassignment_group%3De903ad2d37ec420065aa261953990ecb^ORassignment_group%3Dd25fe5323779c24065aa261953990e54^ORassignment_group%3D508639363779c24065aa261953990e29^ORassignment_group%3D51fe5a37379e0a00ef8898a543990ea2^ORassignment_group%3D3d8171b23779c24065aa261953990e21^ORassignment_group%3Decfe5a37379e0a00ef8898a543990e6c^ORassignment_group%3D48c0b9723779c24065aa261953990e5d^ORassignment_group%3De5fde9fe3739c24065aa261953990e75^ORassignment_group%3D15fe5a37379e0a00ef8898a543990e99^ORassignment_group%3D15fe5a37379e0a00ef8898a543990ea7^ORassignment_group%3D1ed3f1f23779c24065aa261953990e47^active%3Dtrue^sys_class_name%3Dincident^ORsys_class_name%3Dsc_req_item^assigned_toISEMPTY&sysparm_first_row=1&sysparm_view=");      
    };

  }

}




{ 
newExcitingAlerts = (function () {
var oldTitle = document.title;
var msg = "***NEW***";
var timeoutId;
var blink = function() { document.title = document.title == msg ? 'Tickets in queue!' : msg; };
var clear = function() {
clearInterval(timeoutId);
document.title = oldTitle;
window.onmousemove = null;
timeoutId = null;

};

    return function () {
        if (!timeoutId) {
            timeoutId = setInterval(blink, 1000);
            window.onmousemove = clear;
        }
    };
}());



  $(document).ready(function () {
  function isEmpty(el) {
    return !$.trim(el.html());
  }
  var x = document.getElementById("task_table").getAttribute("grand_total_rows");

  if( x != "0" ) {   newExcitingAlerts();
        notifyMe(); }

      else 

        {    }

    setTimeout(function() {
        location.reload();
    }, 120000);
});


}