0

高级问题

谷歌日历中的“其他日历”没有取消全选。我们公司有很多员工,我在安排会议时会不断添加和删除用户。我意识到有一个“查找时间”功能,但除了那个论点之外,我想让它工作,因为我觉得它很有趣。

其他一些日历的屏幕截图

解决方案

创建一个页面操作 chrome 扩展,当标签位于 Google 日历网站上时,该扩展会出现。单击页面操作图标应通过模拟 mousedown 事件自动取消选择所有日历。

执行

除了实际取消选择日历外,页面操作正常运行。

我使用 Google Developer 工具查看当我手动取消选择时触发哪些事件,以及查看哪些元素注册了处理程序。密钥对似乎是document元素和mousedown事件。因此,我想自动调度事件以复制行为。我一开始直接在 div 上进行调度,假设它会冒泡,但是当它不起作用时,我看到唯一的事件侦听器在文档上,我试图直接在那里引发事件。

contentscript.js单击页面操作时执行以下方法:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    // Get the div containing other calendars
    var otherCalendars = document.getElementById("calendars_fav");
    // Get all divs representing a single selected calendar
    var selectedOtherCalendars = otherCalendars.getElementsByClassName("calListLabel-sel");
    for (var i=0 ; i < selectedOtherCalendars.length; i++) {
            // Get the span which contains the name of the calendar e.g. Contact's birthdays
        var c = selectedOtherCalendars[i].children[1];
        var name = c.innerHTML;
            // Find the location of this element relative to the document
        var x = getOffsetLeft(c) + (c.offsetWidth / 2);
        var y = getOffsetTop(c) + (c.offsetHeight / 2);
        console.log('mousedown on document targeting ' + name + ' x:' + x + ', y:' + y);
            // See http://goo.gl/WtlWpv
        simulate(document, "mousedown", { pointerX: x, pointerY: y });
    }
});

SO:如何使用Javascript模拟鼠标点击?- 我从这里解除了模拟实现

问题

日志看起来是正确的,没有错误,但什么也没有发生,模拟似乎失败了。

  • 当我以编程方式调度事件时,Chrome 开发人员工具时间轴中没有出现任何事件
  • 由于分派,没有执行 Google Calendar javascript

示例日志条目:

mousedown on body targeting  Ipswich Town x:85.5, y:494

标题说明

我不知道 dispatchEvent 是否可以在其他地方的谷歌日历上工作,我只从我的 chrome 扩展中尝试过contentscript.js

4

1 回答 1

1

您添加的 JavaScript 与网页的 JavaScript 是隔离的。尝试添加一个脚本来桥接这种隔离,方法是使用 JavaScript 将脚本元素放入 HTML,而不是尝试从 contentscript 上下文中获取 JavaScript 以与网页上下文进行通信。

请参阅:http: //developer.chrome.com/extensions/content_scripts.html#host-page-communication

于 2013-09-14T17:48:14.203 回答