window.zknumber = prompt("将当页折扣统一设置为:", ""); if (window.zknumber !== null) { runJob () } function forceReactUpdate(element, value) { console.log('🎯 强制React更新,新值:', value); // 方法1:尝试直接修改React内部状态 const reactKeys = Object.keys(element).filter(key => key.startsWith('__react') || key.includes('Props') || key.includes('Handler') ); console.log('找到的React属性:', reactKeys); // 如果有React内部属性,尝试直接修改 if (reactKeys.length > 0) { for (const key of reactKeys) { try { const obj = element[key]; if (obj && typeof obj === 'object') { // 尝试找到onChange或onBlur if (obj.onChange) { console.log('找到 onChange,尝试调用'); const event = { target: element, currentTarget: element, type: 'change' }; element.value = String(value); obj.onChange(event); } if (obj.onBlur) { console.log('找到 onBlur,尝试调用'); const event = { target: element, currentTarget: element, type: 'blur' }; obj.onBlur(event); } } } catch (e) { console.warn('访问React属性失败:', key, e.message); } } } // 方法2:同时触发所有可能的事件 console.log('🔨 触发所有相关事件'); // 设置值 element.value = String(value); // 创建事件数组,按正确顺序触发 const eventSequence = [ { type: 'focus', isFocus: true }, { type: 'focusin', isFocus: true }, { type: 'click' }, { type: 'mousedown' }, { type: 'mouseup' }, { type: 'keydown', isKey: true, key: ' ' }, { type: 'keypress', isKey: true, key: ' ' }, { type: 'input', isInput: true, data: String(value), inputType: 'insertText' }, { type: 'keyup', isKey: true, key: ' ' }, { type: 'change' }, { type: 'blur', isFocus: true }, { type: 'focusout', isFocus: true } ]; eventSequence.forEach((eventConfig, index) => { setTimeout(() => { let event; if (eventConfig.isFocus) { event = new FocusEvent(eventConfig.type, { bubbles: true, cancelable: true, view: window }); } else if (eventConfig.isKey) { event = new KeyboardEvent(eventConfig.type, { bubbles: true, cancelable: true, key: eventConfig.key || ' ', code: eventConfig.key === ' ' ? 'Space' : 'Key' + eventConfig.key?.toUpperCase(), view: window }); } else if (eventConfig.isInput) { event = new InputEvent(eventConfig.type, { bubbles: true, cancelable: true, data: eventConfig.data, inputType: eventConfig.inputType, view: window }); } else { event = new Event(eventConfig.type, { bubbles: true, cancelable: true, view: window }); } // 设置目标 Object.defineProperty(event, 'target', { value: element }); Object.defineProperty(event, 'currentTarget', { value: element }); console.log(`触发 ${eventConfig.type} 事件`); element.dispatchEvent(event); }, index * 20); // 每个事件间隔20ms }); // 最后触发blur setTimeout(() => { element.blur(); console.log('✅ 所有事件已触发'); }, eventSequence.length * 20 + 50); } // 或者使用 React Test Utilities 风格 function simulateReactChange(element, value) { element.value = value; // React 16+ 使用这些事件 element.dispatchEvent(new Event('input', { bubbles: true })); element.dispatchEvent(new Event('change', { bubbles: true })); // 对于 React 17+ element.dispatchEvent(new Event('change', { bubbles: true, composed: true })); } function runJob () { document.querySelectorAll('[aria-label="percentageInput"]').forEach(element => { forceReactUpdate(element, window.zknumber) }); setTimeout(() => { if (!document.querySelector('.andes-pagination__button--next').classList.contains('andes-pagination__button--disabled')) { document.querySelector('[title="Next"]').click() setTimeout(() => { runJob () }, 2000); } else { alert('执行完毕!') } }, 1000); }