// ==UserScript==
// @name 美元转人民币
// @namespace http://your.namespace/
// @version 1.6
// @description 在网页中识别美元金额,并在后面添加相应的人民币金额
// @author You
// @match *://*/*
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @license MIT
// @downloadURL https://update.greasyfork.icu/scripts/482844/%E7%BE%8E%E5%85%83%E8%BD%AC%E4%BA%BA%E6%B0%91%E5%B8%81.user.js
// @updateURL https://update.greasyfork.icu/scripts/482844/%E7%BE%8E%E5%85%83%E8%BD%AC%E4%BA%BA%E6%B0%91%E5%B8%81.meta.js
// ==/UserScript==
(function () {
'use strict';
// 获取用户自定义的汇率比例,如果没有设置,则使用默认值
let userExchangeRate = GM_getValue('userExchangeRate', null);
// 如果用户没有保存汇率,则使用默认值
if (userExchangeRate === null) {
userExchangeRate = 7.14;
}
// 创建按钮
const exchangeRateButton = document.createElement('button');
exchangeRateButton.id = 'exchangeRateButton';
// exchangeRateButton.innerText = `设置汇率 当前:${userExchangeRate}`;
exchangeRateButton.innerHTML = `汇率:${userExchangeRate}`;
document.body.appendChild(exchangeRateButton);
// 默认不显示
exchangeRateButton.style.display = 'none';
// 样式调整
GM_addStyle(`
#exchangeRateButton {
position: fixed;
top: 50%;
left: 10px;
z-index: 1000;
cursor: pointer;
padding: 5px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 3px;
}
#exchangeRateButton:hover {
background-color: #f0f0f0;
}
`);
// 添加点击事件,显示悬浮输入框
exchangeRateButton.addEventListener('click', showFloatingInput);
function showFloatingInput() {
// 移除按钮
exchangeRateButton.style.display = 'none';
// 创建悬浮输入框的容器
const floatingInputContainer = document.createElement('div');
floatingInputContainer.id = 'floatingInputContainer';
// 创建悬浮输入框
const floatingInput = document.createElement('div');
floatingInput.innerHTML = `
`;
floatingInputContainer.appendChild(floatingInput);
document.body.appendChild(floatingInputContainer);
// 设置默认值
document.getElementById('exchangeRateInput').value = userExchangeRate;
// 样式调整
GM_addStyle(`
#exchangeRateInput {
margin-right: 5px;
padding: 5px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 3px;
}
#saveExchangeRate {
cursor: pointer;
padding: 5px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 3px;
}
#saveExchangeRate:hover {
background-color: #f0f0f0;
}
#exchangeRateInput, #saveExchangeRate {
box-sizing: border-box;
}
#floatingInputContainer {
position: fixed;
top: 50%;
left: 10px;
z-index: 1000;
background-color: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
padding: 10px;
}
label {
margin-right: 5px;
font-size: 14px;
}
`);
// 添加点击事件,保存用户自定义的汇率比例
document.getElementById('saveExchangeRate').addEventListener('click', function () {
const exchangeRateInput = document.getElementById('exchangeRateInput');
const exchangeRate = parseFloat(exchangeRateInput.value);
if (!isNaN(exchangeRate)) {
GM_setValue('userExchangeRate', exchangeRate);
location.reload(); // 刷新页面
//alert('汇率比例已保存');
} else {
alert('请输入有效的汇率比例');
}
});
}
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
// 在这里添加你的处理逻辑
convertUSDToCNY(mutation.target);
});
});
const observerConfig = { childList: true, subtree: true };
observer.observe(document.body, observerConfig);
const usdRegex1 = /\$\s?(\d+(\.\d{1,2})?)/g;
const usdRegex2 = /\b(\d+(\.\d{1,2})?)\s?(\$|USD)\b/g;
function convertUSDToCNY(targetNode) {
if (targetNode.nodeType === Node.TEXT_NODE) {
handleTextNode(targetNode);
} else {
const textNodes = getTextNodes(targetNode);
textNodes.forEach(handleTextNode);
}
}
function handleTextNode(textNode) {
if (!textNode._processed) {
let matches;
matches = textNode.nodeValue.match(usdRegex1);
if (matches) {
exchangeRateButton.style.display = 'block';
matches.forEach(match => {
const usdAmount = parseFloat(match.replace(/\$/, '').replace(',', ''));
const cnyAmount = (usdAmount * userExchangeRate).toFixed(2);
textNode.nodeValue = textNode.nodeValue.replace(match, `${match}(约¥${cnyAmount})`);
});
}
matches = textNode.nodeValue.match(usdRegex2);
if (matches) {
exchangeRateButton.style.display = 'block';
matches.forEach(match => {
const usdAmount = parseFloat(match.replace(/\s?\$|USD|美元/g, '').replace(',', ''));
const cnyAmount = (usdAmount * userExchangeRate).toFixed(2);
textNode.nodeValue = textNode.nodeValue.replace(match, `${match}(约¥${cnyAmount})`);
});
}
textNode._processed = true;
}
}
function getTextNodes(node) {
const walker = document.createTreeWalker(
node,
NodeFilter.SHOW_TEXT,
{ acceptNode: function (node) { return NodeFilter.FILTER_ACCEPT; } },
false
);
const textNodes = [];
let currentNode = walker.nextNode();
while (currentNode) {
textNodes.push(currentNode);
currentNode = walker.nextNode();
}
return textNodes;
}
document.body.appendChild(exchangeRateButton);
})();