Greasy Fork

Greasy Fork is available in English.

当页开搜

增强表单处理与回车搜索功能

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         当页开搜
// @namespace    
// @version      4.0
// @description  增强表单处理与回车搜索功能
// @author       YourName
// @match        *://*/*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    // 增强表单处理器(2025-02-28更新)
    const processElements = elements => {
        elements.forEach(element => {
            // 处理输入框回车事件
            if (element.matches('input[type="search"], input[type="text"]')) {
                element.addEventListener('keydown', e => {
                    if (e.key === 'Enter') {
                        // 兼容IME输入法状态
                        if (e.isComposing) return;

                        // 动态值同步(解决框架绑定问题)
                        const syncValue = () => {
                            element.dispatchEvent(new Event('input', {
                                bubbles: true,
                                composed: true
                            }));
                            element.dispatchEvent(new Event('change', {
                                bubbles: true,
                                composed: true
                            }));
                        };

                        // 执行搜索(支持现代框架)
                        setTimeout(() => {
                            syncValue();
                            const form = element.closest('form');
                            if (form) {
                                // 触发原生表单提交流程
                                const submitBtn = form.querySelector('[type="submit"]');
                                if (submitBtn) {
                                    submitBtn.click();
                                } else {
                                    form.requestSubmit(); // 触发验证
                                }
                            }
                        }, 10);
                    }
                });
            }

            // 清理表单属性
            if (element.matches('form, msnhp-search-box')) {
                ['target', 'onclick'].forEach(attr =>
                    element.removeAttribute(attr)
                );
            }
        });
    };

    // 高性能观察器(支持Shadow DOM v3)
    new MutationObserver(mutations => {
        mutations.forEach(({ addedNodes }) => {
            addedNodes.forEach(node => {
                if (node.nodeType === 1) {
                    processElements([
                        node,
                        ...node.querySelectorAll(
                            'form, input[type="search"], input[type="text"], msnhp-search-box'
                        )
                    ]);
                }
            });
        });
    }).observe(document, {
        childList: true,
        subtree: true
    });

    // 初始处理
    processElements([
        ...document.forms,
        ...document.querySelectorAll('input[type="search"], input[type="text"], msnhp-search-box')
    ]);

    // 强化表单原型方法
    const nativeSubmit = HTMLFormElement.prototype.submit;
    HTMLFormElement.prototype.submit = function() {
        this.target = '_self';
        return nativeSubmit.call(this);
    };
})();