1

我有一个Google Reader的用户脚本,作为该用户脚本的一部分,我需要触发刷新,我在 Firefox 中通过模拟keypress字母的 a 来执行此操作r

function simulateRefresh()
{
    var e = document.createEvent('KeyboardEvent');
    e.initKeyEvent('keypress', true, true, window, false, false, false, false, 82, 82);
    document.body.dispatchEvent(e);
}

这适用于 Firefox,但不适用于 Chrome。显然initKeyEvent不支持,我应该使用initKeyboardEvent.
到目前为止,我对此的运气为零(控制台中没有错误,但刷新不会触发。)如果这很重要,我正在使用 jQuery。

我也尝试触发click刷新按钮,但这在两个浏览器中都失败了(不知道为什么,点击事件根据 Chrome 调试器触发,但代码被混淆了,所以我无法弄清楚)。

4

4 回答 4

1

Google webapps 通常不使用简单的keypressor click,而使用复杂的状态序列。;-)

因此,向刷新按钮发送“点击”不起作用,但发送“上、下、上”三元组可以。像这样:

var refreshBtn = document.querySelector ('#viewer-refresh');

//--- Click by itself does not work!
triggerMouseEvent (refreshBtn, 'mouseover');
triggerMouseEvent (refreshBtn, 'mousedown');
triggerMouseEvent (refreshBtn, 'mouseup');

function triggerMouseEvent (node, eventType) {
    var clickEvent = document.createEvent('MouseEvents');
    clickEvent.initEvent (eventType, true, true);
    node.dispatchEvent (clickEvent);
}


键盘快捷键可能需要类似的状态序列。(测试继续。)

更新: 对于键盘事件,请参阅这个答案,其中提到了 Webkit Bug 16735:“使用 DOM 创建的键盘事件的 keyCode 和 charCode 为 0” ——4.5 年后仍然开放(!!)并且可能适用于此处。

于 2012-10-06T18:31:51.300 回答
0

您的解决方案是检查该initKeyboardEvent方法是否已实现。

var e = document.createEvent('KeyboardEvents');
(e.initKeyboardEvent || e.initKeyEvent).call(e, 'keypress', true, true, window, false, false, false, false, 82, 82);
document.body.dispatchEvent(e);

这在 Chrome 中对我有用。

于 2012-10-06T17:02:20.170 回答
0

试过了$('#refreshButton').trigger('click');吗?

于 2012-10-06T17:01:16.420 回答
0

我认为您正在尝试从您的内容脚本中分派事件,不幸的是这不起作用。您需要将代码注入页面

function injectJavaScript(textContent) {
  var scriptElement = document.createElement('script');
  scriptElement.textContent = textContent;

  (document.getElementsByTagName('head')[0] || document.body || document.documentElement).appendChild(scriptElement);
}

var code = '(' + function() {
  var e = document.createEvent('KeyboardEvents');
  e.initKeyboardEvent('keypress', true, true, window, false, false, false, false, 82, 82);
  document.body.dispatchEvent(e);
} + ')();';

injectJavaScript(code);
于 2012-10-06T18:27:17.437 回答