PeisenXu / 公益学术平台-实现URL传参检索

// ==UserScript==
// @name         公益学术平台-实现URL传参检索
// @namespace    http://tampermonkey.net/
// @version      0.2.5
// @description  本工具不留存、不上传任何操作信息,脚本初衷仅供学习使用,因网站搜索较为繁琐,旨为快速进行学术检索参考
// @author       PeisenXu
// @match        https://pubscholar.cn/explore?key=*
// @icon         https://pubscholar.cn/static/app-logo-cas.png
// @grant        none
// @license GPL-3.0-or-later
// ==/UserScript==

(function() {
    'use strict';
    window.onload = function() {
        console.log("页面加载完成!");
        
        function checkInputExistence() {  
            var input = document.querySelector('#app > div.App__root > div > div.base-scrollbar__wrap > div > header > div.AppHeader__inner > div.AppHeaderSearchBar > div.AppHeaderSearchBar__input > span > span > div > div > div.base-input.base-input--suffix > input');  
          
            if (input) {  
                // 找到了输入元素,执行你想要的操作  
                console.log("Input found!");
                const url = new URL(window.location.href);
                const searchParams = url.searchParams;
                // 关键词参数
                var key = searchParams.get("key");
                // 回源站功能地址配置
                var service = searchParams.get("service");
                
                // 模拟点击input框
                input.click();
                // 模拟鼠标悬停在目标元素上
                input.dispatchEvent(new MouseEvent('mouseover', {
                    bubbles: true,
                    cancelable: true
                }));
        
                setTimeout(function() {
                    // 模拟键盘输入
                    var textToInput = key;
                    input.value = textToInput;
        
                    // 触发输入框的输入事件(例如 'input' 或 'change')
                    var inputEvent = new Event('input', { bubbles: true });
                    input.dispatchEvent(inputEvent);
        
                    // 选择 class 为 'base-icon-search' 的元素
                    const element = document.querySelector('.base-icon-search');
        
                    // 创建一个新的 MouseEvent 对象,模拟鼠标左键的 keydown 事件
                    var mouseEvent = new MouseEvent('mousedown', {
                        buttons: 1, // 表示左键
                        clientX: 0, // 鼠标的X坐标,这里设为0,你可以根据需要进行调整
                        clientY: 0, // 鼠标的Y坐标,这里设为0,你可以根据需要进行调整
                    });
        
                    // 如果元素存在,则触发该事件
                    if (element) {
                        element.dispatchEvent(mouseEvent);
                    }
                }, 100);
                
                // 获取vue一次性打包编码
                var divElement = document.querySelector('.AppNav__item');
                var dataKey = "data-" + Object.keys(divElement.dataset).find(i=>i.startsWith('v-'));
                
                var element = document.querySelector('.AppHeader__inner'); // 选择具有 class="AppHeader__inner" 的元素
                if (element) { // 确保元素存在
                    element.style.width = '1240px'; // 设置元素的 width 属性为 1240px
                }
                var newDiv = document.createElement('div');
                newDiv.className = 'AppNav__item';
                newDiv.setAttribute(dataKey, ''); 
        
                var newLink = document.createElement('a');
                newLink.textContent = '回源站';
                newLink.href = service == null ? 'http://192.168.210.12/sgeri' : service;
                newLink.className = 'AppNav__itemLink router-link-active';
                newLink.setAttribute(dataKey, ''); 
        
                // 添加样式属性
                newLink.style.display = 'inline-block';
                newLink.style.fontSize = '15px';
                newLink.style.padding = '0 15px';
                newLink.style.color = '#fff';
                newLink.style.position = 'relative';
                newLink.style.opacity = '.8';
                newLink.style.transition = 'opacity .3s';
                newLink.style.webkitTransition = 'opacity .3s'; // 为了兼容WebKit浏览器(如Safari和旧版Chrome)
        
                newDiv.appendChild(newLink);
                var container = document.querySelector('.AppNav');
                if (container.firstChild) {
                    container.insertBefore(newDiv, container.firstChild);
                } else {
                    container.appendChild(newDiv);
                }
                clearInterval(intervalId); // 清除定时器,停止检查  
            } else {
                console.log("Input Not found!");
            }
        }  
          
        var intervalId = setInterval(checkInputExistence, 500); // 每秒检查一次
        
        
    }
})();