单击按钮在 Greasemonkey/Tampermonkey 脚本中不起作用。已经使用 waitForKeyElements() 尝试过标准鼠标事件
Button click doesn't work in Greasemonkey/Tampermonkey script. Already tried standard mouse events with waitForKeyElements()
我正在尝试使用 Tampermonkey 单击 URL http://www.sparhandy.de/handy-kaufen/ 上的 "Mehr Laden" 按钮。该按钮位于智能手机图片下方。这是我到目前为止编写的脚本:
// ==UserScript==
// @name SparhandyScript
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author Nigel
// @match http://www.sparhandy.de/handy-kaufen/
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
waitForKeyElements ("[data\-behavior=result\-paging]", triggerMostButtons);
function triggerMostButtons (jNode) {
triggerMouseEvent (jNode[0], "mouseover");
triggerMouseEvent (jNode[0], "mousedown");
triggerMouseEvent (jNode[0], "mouseup");
triggerMouseEvent (jNode[0], "click");
//alert(jNode[0].className);
//alert(jNode[0].parentNode.className);
}
function triggerMouseEvent (node, eventType) {
var clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent (eventType, true, true);
node.dispatchEvent (clickEvent);
}
该按钮在运行它的 jQuery 准备好触发之前加载。所以在这种情况下等待按钮是不够的。您还必须等待附加的 JS 初始化。
一个快速而肮脏的测试表明,对我来说,按钮在页面加载后超过一秒才准备好! (实际时间可能会有所不同,我并没有试图找到合适的状态标记(那是给你做的;)。)
因此,调整代码以允许按钮初始化,对我有用:
// ==UserScript==
// @name SparhandyScript
// @match http://www.sparhandy.de/handy-kaufen/
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
waitForKeyElements ("[data\-behavior=result\-paging]", clickButtonAfterDelay);
function clickButtonAfterDelay (jNode) {
if (document.readyState != "complete") return true;
//triggerMouseEvent (jNode[0], "click");
//-- WARNING: Fixed time may not always work unless it is ridiculously long.
setTimeout (triggerMouseEvent, 2222, jNode[0], "click");
}
function triggerMouseEvent (node, eventType) {
var clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent (eventType, true, true);
node.dispatchEvent (clickEvent);
}
注意:此代码将获取结果的第一个附加页,然后停止。它不会获取所有可能的页面;你需要一个更高级的状态机。
这超出了这个问题的范围。如果您需要这部分的帮助,请打开一个新问题(在诚实地尝试自己解决之后)。
我正在尝试使用 Tampermonkey 单击 URL http://www.sparhandy.de/handy-kaufen/ 上的 "Mehr Laden" 按钮。该按钮位于智能手机图片下方。这是我到目前为止编写的脚本:
// ==UserScript==
// @name SparhandyScript
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author Nigel
// @match http://www.sparhandy.de/handy-kaufen/
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
waitForKeyElements ("[data\-behavior=result\-paging]", triggerMostButtons);
function triggerMostButtons (jNode) {
triggerMouseEvent (jNode[0], "mouseover");
triggerMouseEvent (jNode[0], "mousedown");
triggerMouseEvent (jNode[0], "mouseup");
triggerMouseEvent (jNode[0], "click");
//alert(jNode[0].className);
//alert(jNode[0].parentNode.className);
}
function triggerMouseEvent (node, eventType) {
var clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent (eventType, true, true);
node.dispatchEvent (clickEvent);
}
该按钮在运行它的 jQuery 准备好触发之前加载。所以在这种情况下等待按钮是不够的。您还必须等待附加的 JS 初始化。
一个快速而肮脏的测试表明,对我来说,按钮在页面加载后超过一秒才准备好! (实际时间可能会有所不同,我并没有试图找到合适的状态标记(那是给你做的;)。)
因此,调整代码以允许按钮初始化,对我有用:
// ==UserScript==
// @name SparhandyScript
// @match http://www.sparhandy.de/handy-kaufen/
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
waitForKeyElements ("[data\-behavior=result\-paging]", clickButtonAfterDelay);
function clickButtonAfterDelay (jNode) {
if (document.readyState != "complete") return true;
//triggerMouseEvent (jNode[0], "click");
//-- WARNING: Fixed time may not always work unless it is ridiculously long.
setTimeout (triggerMouseEvent, 2222, jNode[0], "click");
}
function triggerMouseEvent (node, eventType) {
var clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent (eventType, true, true);
node.dispatchEvent (clickEvent);
}
注意:此代码将获取结果的第一个附加页,然后停止。它不会获取所有可能的页面;你需要一个更高级的状态机。
这超出了这个问题的范围。如果您需要这部分的帮助,请打开一个新问题(在诚实地尝试自己解决之后)。