Greasy Fork is available in English.
解决在输入法状态下按Enter键导致消息直接发送的问题;Solve the problem that pressing the Enter key in the input method state causes the message to be sent directly.
当前为
// ==UserScript==
// @name 阻止claude输入发送
// @description 解决在输入法状态下按Enter键导致消息直接发送的问题;Solve the problem that pressing the Enter key in the input method state causes the message to be sent directly.
// @match https://claude.ai/*
// @author sinoftj
// @version 1.0.
// @namespace http://greasyfork.icu/users/1457414
// ==/UserScript==
(function() {
'use strict';
// 输入法状态追踪
let imeActive = false;
let lastImeEndTime = 0;
const IME_BUFFER_TIME = 100; // 输入法结束后的缓冲时间(毫秒)
// 检查是否处于输入法状态
function isInImeContext(e) {
return imeActive ||
e.isComposing ||
e.keyCode === 229 ||
(Date.now() - lastImeEndTime < IME_BUFFER_TIME);
}
// 处理输入法事件
document.addEventListener('compositionstart', function() {
imeActive = true;
}, true);
document.addEventListener('compositionend', function() {
lastImeEndTime = Date.now();
setTimeout(() => { imeActive = false; }, IME_BUFFER_TIME);
}, true);
// 拦截Enter键事件
document.addEventListener('keydown', function(e) {
if ((e.key === 'Enter' || e.keyCode === 13) && isInImeContext(e)) {
e.stopImmediatePropagation();
e.preventDefault();
return false;
}
}, true);
// 备份保护:keypress事件拦截
document.addEventListener('keypress', function(e) {
if ((e.key === 'Enter' || e.keyCode === 13) && isInImeContext(e)) {
e.stopImmediatePropagation();
e.preventDefault();
return false;
}
}, true);
// 处理输入框元素
function protectInputElement(input) {
const originalKeyDown = input.onkeydown;
input.onkeydown = function(e) {
if ((e.key === 'Enter' || e.keyCode === 13) && isInImeContext(e)) {
e.stopPropagation();
e.preventDefault();
return false;
}
if (originalKeyDown) return originalKeyDown.call(this, e);
};
}
// 页面加载后处理现有输入框
window.addEventListener('load', function() {
setTimeout(() => {
document.querySelectorAll('textarea, input[type="text"]').forEach(protectInputElement);
// 监控DOM变化,处理新添加的输入框
if (window.MutationObserver) {
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.addedNodes && mutation.addedNodes.length > 0) {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1) {
if (node.tagName === 'TEXTAREA' ||
(node.tagName === 'INPUT' && node.type === 'text')) {
protectInputElement(node);
}
const inputs = node.querySelectorAll ?
node.querySelectorAll('textarea, input[type="text"]') : [];
if (inputs.length > 0) {
inputs.forEach(protectInputElement);
}
}
});
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
}
}, 1000);
});
})();