用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();
  });
})();