用mac 在ns里搜东西的时候
中文输入法写英文 比如写个dmit 习惯不切输入法 按一下enter
这时候就直接就搜索了
用gpt写了一个油猴脚本 用着就没这个问题了。
使用效果:中文输入法下,按回车确认英文字母时只上屏;再按一次回车才搜索,点击“搜索”按钮也可以正常搜索。脚本只处理 NS 搜索框。
安装方法:油猴 → 添加新脚本 → 全选替换为下面的完整代码 → 保存,然后刷新 NS 页面。
// ==UserScript==
// @name NodeSeek 搜索框输入法回车修复
// @namespace local.nodeseek.ime-enter-fix
// @version 1.0.0
// @description 输入法确认文字时不误触搜索;保留正常回车搜索。仅处理 NodeSeek 搜索框。
// @match https://www.nodeseek.com/*
// @match https://nodeseek.com/*
// @run-at document-start
// @noframes
// @grant none
// @license MIT
// ==/UserScript==
(() => {
'use strict';
// 顶栏搜索框,以及当前 NodeSeek 搜索面板内的输入框。
const searchSelector = '#search-site2, .glass-input-group > input';
let states = new WeakMap();
function searchInput(event) {
const target = event.target;
return target instanceof Element && target.matches(searchSelector) ? target : null;
}
function stateFor(input) {
let state = states.get(input);
if (!state) {
state = { composing: false, ignoreEnterUp: false, enterDown: false };
states.set(input, state);
}
return state;
}
function isEnter(event) {
return event.key === 'Enter' || event.code === 'Enter' ||
event.code === 'NumpadEnter' || event.keyCode === 13;
}
function isImeEvent(event, state) {
// 某些输入法会先结束组合,再派发确认按键;此时 isComposing 已为 false,
// 但 keyCode 仍是 229。因此保留这个兼容判断。
return state.composing || event.isComposing || event.keyCode === 229;
}
document.addEventListener('compositionstart', event => {
const input = searchInput(event);
if (!input) return;
const state = stateFor(input);
state.composing = true;
state.ignoreEnterUp = false;
state.enterDown = false;
}, true);
document.addEventListener('compositionend', event => {
const input = searchInput(event);
if (!input) return;
const state = stateFor(input);
state.composing = false;
// 确认文字后,输入法可能只留下一个 Enter keyup;不要让它触发搜索。
// 若用户随后重新按下正常回车,下面的 keydown 会立即清除此标记。
state.ignoreEnterUp = true;
}, true);
document.addEventListener('keydown', event => {
const input = searchInput(event);
if (!input) return;
const state = stateFor(input);
if (!isEnter(event)) {
if (!isImeEvent(event, state)) {
state.ignoreEnterUp = false;
state.enterDown = false;
}
return;
}
if (!event.repeat || !state.enterDown) {
state.ignoreEnterUp = isImeEvent(event, state);
state.enterDown = true;
}
// 只隔离网页监听,绝不 preventDefault,以免阻止输入法正常确认文字。
if (state.ignoreEnterUp) event.stopImmediatePropagation();
}, true);
document.addEventListener('keyup', event => {
const input = searchInput(event);
if (!input || !isEnter(event)) return;
const state = stateFor(input);
const ignore = state.ignoreEnterUp || isImeEvent(event, state);
state.ignoreEnterUp = false;
state.enterDown = false;
if (ignore) event.stopImmediatePropagation();
}, true);
// 切换焦点后清除未配对的按键,避免影响下一次正常搜索。
document.addEventListener('blur', event => {
const input = searchInput(event);
if (input) states.delete(input);
}, true);
window.addEventListener('blur', () => {
states = new WeakMap();
});
})();