| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- 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);
-
- }
|