浏览代码

fix: forms block not working on some websites

Ahmad Kholid 3 年之前
父节点
当前提交
9b68a13d5a
共有 1 个文件被更改,包括 18 次插入6 次删除
  1. 18 6
      src/utils/handleFormElement.js

+ 18 - 6
src/utils/handleFormElement.js

@@ -1,4 +1,4 @@
-import { sleep } from '@/utils/helper';
+import { sleep, objectHasKey } from '@/utils/helper';
 import { keyDefinitions } from '@/utils/USKeyboardLayout';
 import simulateEvent from './simulateEvent';
 
@@ -7,9 +7,17 @@ const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
   'value'
 ).set;
 function reactJsEvent(element, value) {
+  console.dir(element);
+  console.log(
+    objectHasKey(element, '_valueTracker'),
+    element.parentElement.hasChildNodes(element)
+  );
+  console.log(!element._valueTracker, element._valueTracker, element);
   if (!element._valueTracker) return;
 
+  const previousValue = element.value;
   nativeInputValueSetter.call(element, value);
+  element._valueTracker.setValue(previousValue);
 }
 
 function formEvent(element, data) {
@@ -57,11 +65,11 @@ async function inputText({ data, element, isEditable }) {
 
   if (data.delay > 0 && !document.hidden) {
     for (let index = 0; index < data.value.length; index += 1) {
+      if (elementKey === 'value') reactJsEvent(element, element.value);
+
       const currentChar = data.value[index];
       element[elementKey] += currentChar;
 
-      if (elementKey === 'value') reactJsEvent(element, element.value);
-
       formEvent(element, {
         type: 'text-field',
         value: currentChar,
@@ -71,10 +79,10 @@ async function inputText({ data, element, isEditable }) {
       await sleep(data.delay);
     }
   } else {
-    element[elementKey] += data.value;
-
     if (elementKey === 'value') reactJsEvent(element, element.value);
 
+    element[elementKey] += data.value;
+
     formEvent(element, {
       isEditable,
       type: 'text-field',
@@ -102,7 +110,11 @@ export default async function (element, data) {
   }
 
   if (data.type === 'text-field' && textFields.includes(element.tagName)) {
-    if (data.clearValue) element.value = '';
+    if (data.clearValue) {
+      element?.select();
+      reactJsEvent(element, '');
+      element.value = '';
+    }
 
     await inputText({ data, element });
     return;