TIX007

鼠标悬停密码框时显示明文密码

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @license MIT
// @name         TIX007
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  鼠标悬停密码框时显示明文密码
// @author       TIX007
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 处理密码框的函数
    function handlePasswordFields(passwordField) {
        let originalType = 'password';
        
        // 鼠标悬停时显示密码
        passwordField.addEventListener('mouseover', function() {
            if (this.type === 'password') {
                originalType = 'password';
                this.type = 'text';
            }
        });

        // 鼠标离开时恢复
        passwordField.addEventListener('mouseout', function() {
            if (this.type === 'text') {
                this.type = originalType;
            }
        });
    }

    // 初始处理现有密码框
    document.querySelectorAll('input[type="password"]').forEach(handlePasswordFields);

    // 观察DOM变化处理动态加载的密码框
    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            mutation.addedNodes.forEach(node => {
                if (node.nodeType === 1) { // Element node
                    const passwordFields = node.querySelectorAll('input[type="password"]');
                    passwordFields.forEach(handlePasswordFields);
                }
            });
        });
    });

    observer.observe(document.body, {
        childList: true,
        subtree: true
    });
})();