使用 tampermonkey 在按键上提取跨度值
Extracting span values on keypress with tampermonkey
(我主要使用 Matlab,但我需要来自网页的一些输入数据才能使其成为 运行。我对 Javascript 和任何形式的 Grease/Tampermonkey 完全陌生.)
我的意图是每次在网页上按下一个键按钮时得到四个特定的跨度值。我想将这些值堆叠在一个数组中,稍后将它们导出到 csv 中。
鼠标悬停在页面上时跨度值会发生变化。理想情况下,我将光标移动到我需要获取的数据,按下一个键并保存数据。
我无法让这些工作。使用此函数调用数据,因为有 4 个值具有相同的类名,我打算循环遍历索引以获取所有值。
function readvalue(index){
let text = document.getElementsByClassName("pane-legend-item-value")[index].innerhtml;
}
也许像这样调用 kreypress?
if (event.key === "Enter") {
event.preventDefault();
let v1 = readvalue(0);
let v2 = readvalue(1);
let v3 = readvalue(2);
let v4 = readvalue(3);
console.log(v1);
}
我很想在这里得到一些帮助!如果您有空闲时间帮助我,请随时通过电子邮件给我发消息。 (rage271@gmx.de)
感谢您阅读本文。
干杯,马尔特
存储解决方案
一种解决方案是在鼠标悬停事件上存储值,并在您按下回车键时打印存储的值。
我认为这个解决方案在更大的网页上获得正确的值有点棘手。
let valueStore = '';
document.querySelectorAll('.pane-legend-item-value').forEach(function(elem) {
elem.addEventListener("mouseleave", function(event) {
valueStore = '';
elem.style.backgroundColor = '#ffffff';
});
elem.addEventListener("mouseover", function(event) {
valueStore = event.target.innerHTML;
elem.style.backgroundColor = '#ff0000';
});
});
document.addEventListener('keyup', function() {
if (event.key === "Enter") {
console.log(valueStore);
}
});
<div class="pane-legend-item-value">value 1</div>
<div class="pane-legend-item-value">value 2</div>
<div class="pane-legend-item-value">value 3</div>
<div class="pane-legend-item-value">value 4</div>
定位解
另一种解决方案是存储鼠标位置并使用elementFromPoint
方法获取元素。
但是当两个元素相互重叠时会发生什么?
let x;
let y;
document.onmousemove = function(event){
event = event || window.event;
x = event.clientX;
y = event.clientY;
};
function getElementAtMousePosition() {
return document.elementFromPoint(x,y);
}
document.addEventListener('keyup', function() {
if (event.key === "Enter") {
console.log(getElementAtMousePosition().innerHTML);
}
});
<div class="pane-legend-item-value">value 1</div>
<div class="pane-legend-item-value">value 2</div>
<div class="pane-legend-item-value">value 3</div>
<div class="pane-legend-item-value">value 4</div>
使用 jQuery's .map()
function 轻松提取值(并且 jQuery 使用户脚本更容易,并在通过 @require
使用时在本地加载)。
请注意,对于键盘事件处理程序:
- 您通常应该阻止默认操作以防止意外的副作用。
keyup
尤其是 keypress
在某些情况下可以被抑制。通常在这种情况下最好使用keydown
。
所以,这里是一个完整的工作用户脚本(它只是******
块上方的部分)。
要查看实际效果,运行 代码段。
// ==UserScript==
// @name _Grab span values on keypress
// @match *://YOUR_SERVER.COM/YOUR_PATH/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.
/* global $ */
$(window).keydown (keyboardShortcutHandler);
function keyboardShortcutHandler (zEvent) {
if (zEvent.key == "Enter") {
grabStatsFromSpans ();
zEvent.preventDefault ();
zEvent.stopPropagation ();
return false;
}
}
function grabStatsFromSpans () {
var zStats = $(".pane-legend-item-value").map (
(K, node) => node.textContent.trim ()
).get ();
console.log ("zStats: ", zStats);
}
/********************************************************************
******* Everything below this block is simulated target page. *******
******* It's NOT part of the userscript. *******
********************************************************************/
$("table").on ("mouseover", "td", zEvent => {
var jSqr = $(zEvent.target);
var stats = jSqr.data ("stats");
$(".pane-legend-item-value:eq(0)").text (jSqr.text() );
$(".pane-legend-item-value:eq(1)").text (stats[0]);
$(".pane-legend-item-value:eq(2)").text (stats[1] === "m" ? "male" : "female");
$(".pane-legend-item-value:eq(3)").text (stats[2].toLocaleString('en') );
} );
table {border-spacing: 1em; margin: -1em;}
td {border: 1px solid gray; padding: 1em 2em;}
h3 {margin-bottom: 0;}
label {margin-left: 3em; width: 5em; display: inline-block;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<p><strong>Click in this area.</strong> Then, Mouse over squares and press enter.</p>
<table><tr>
<td data-stats='["human","m",1.1e3]'>Aksel</td>
<td data-stats='["cat","f",7.3e7]'>Babette</td>
<td data-stats='["dog","f",9.6e6]'>Cajsa</td>
</tr></table>
<h3>Stats:</h3>
<label>Name: </label><span class="pane-legend-item-value"></span><br>
<label>Species: </label><span class="pane-legend-item-value"></span><br>
<label>Gender: </label><span class="pane-legend-item-value"></span><br>
<label>Likes: </label><span class="pane-legend-item-value"></span>
(我主要使用 Matlab,但我需要来自网页的一些输入数据才能使其成为 运行。我对 Javascript 和任何形式的 Grease/Tampermonkey 完全陌生.)
我的意图是每次在网页上按下一个键按钮时得到四个特定的跨度值。我想将这些值堆叠在一个数组中,稍后将它们导出到 csv 中。
鼠标悬停在页面上时跨度值会发生变化。理想情况下,我将光标移动到我需要获取的数据,按下一个键并保存数据。
我无法让这些工作。使用此函数调用数据,因为有 4 个值具有相同的类名,我打算循环遍历索引以获取所有值。
function readvalue(index){
let text = document.getElementsByClassName("pane-legend-item-value")[index].innerhtml;
}
也许像这样调用 kreypress?
if (event.key === "Enter") {
event.preventDefault();
let v1 = readvalue(0);
let v2 = readvalue(1);
let v3 = readvalue(2);
let v4 = readvalue(3);
console.log(v1);
}
我很想在这里得到一些帮助!如果您有空闲时间帮助我,请随时通过电子邮件给我发消息。 (rage271@gmx.de)
感谢您阅读本文。
干杯,马尔特
存储解决方案
一种解决方案是在鼠标悬停事件上存储值,并在您按下回车键时打印存储的值。
我认为这个解决方案在更大的网页上获得正确的值有点棘手。
let valueStore = '';
document.querySelectorAll('.pane-legend-item-value').forEach(function(elem) {
elem.addEventListener("mouseleave", function(event) {
valueStore = '';
elem.style.backgroundColor = '#ffffff';
});
elem.addEventListener("mouseover", function(event) {
valueStore = event.target.innerHTML;
elem.style.backgroundColor = '#ff0000';
});
});
document.addEventListener('keyup', function() {
if (event.key === "Enter") {
console.log(valueStore);
}
});
<div class="pane-legend-item-value">value 1</div>
<div class="pane-legend-item-value">value 2</div>
<div class="pane-legend-item-value">value 3</div>
<div class="pane-legend-item-value">value 4</div>
定位解
另一种解决方案是存储鼠标位置并使用elementFromPoint
方法获取元素。
但是当两个元素相互重叠时会发生什么?
let x;
let y;
document.onmousemove = function(event){
event = event || window.event;
x = event.clientX;
y = event.clientY;
};
function getElementAtMousePosition() {
return document.elementFromPoint(x,y);
}
document.addEventListener('keyup', function() {
if (event.key === "Enter") {
console.log(getElementAtMousePosition().innerHTML);
}
});
<div class="pane-legend-item-value">value 1</div>
<div class="pane-legend-item-value">value 2</div>
<div class="pane-legend-item-value">value 3</div>
<div class="pane-legend-item-value">value 4</div>
使用 jQuery's .map()
function 轻松提取值(并且 jQuery 使用户脚本更容易,并在通过 @require
使用时在本地加载)。
请注意,对于键盘事件处理程序:
- 您通常应该阻止默认操作以防止意外的副作用。
keyup
尤其是keypress
在某些情况下可以被抑制。通常在这种情况下最好使用keydown
。
所以,这里是一个完整的工作用户脚本(它只是******
块上方的部分)。
要查看实际效果,运行 代码段。
// ==UserScript==
// @name _Grab span values on keypress
// @match *://YOUR_SERVER.COM/YOUR_PATH/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.
/* global $ */
$(window).keydown (keyboardShortcutHandler);
function keyboardShortcutHandler (zEvent) {
if (zEvent.key == "Enter") {
grabStatsFromSpans ();
zEvent.preventDefault ();
zEvent.stopPropagation ();
return false;
}
}
function grabStatsFromSpans () {
var zStats = $(".pane-legend-item-value").map (
(K, node) => node.textContent.trim ()
).get ();
console.log ("zStats: ", zStats);
}
/********************************************************************
******* Everything below this block is simulated target page. *******
******* It's NOT part of the userscript. *******
********************************************************************/
$("table").on ("mouseover", "td", zEvent => {
var jSqr = $(zEvent.target);
var stats = jSqr.data ("stats");
$(".pane-legend-item-value:eq(0)").text (jSqr.text() );
$(".pane-legend-item-value:eq(1)").text (stats[0]);
$(".pane-legend-item-value:eq(2)").text (stats[1] === "m" ? "male" : "female");
$(".pane-legend-item-value:eq(3)").text (stats[2].toLocaleString('en') );
} );
table {border-spacing: 1em; margin: -1em;}
td {border: 1px solid gray; padding: 1em 2em;}
h3 {margin-bottom: 0;}
label {margin-left: 3em; width: 5em; display: inline-block;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<p><strong>Click in this area.</strong> Then, Mouse over squares and press enter.</p>
<table><tr>
<td data-stats='["human","m",1.1e3]'>Aksel</td>
<td data-stats='["cat","f",7.3e7]'>Babette</td>
<td data-stats='["dog","f",9.6e6]'>Cajsa</td>
</tr></table>
<h3>Stats:</h3>
<label>Name: </label><span class="pane-legend-item-value"></span><br>
<label>Species: </label><span class="pane-legend-item-value"></span><br>
<label>Gender: </label><span class="pane-legend-item-value"></span><br>
<label>Likes: </label><span class="pane-legend-item-value"></span>