fordealfill

自动填写表单数据的Tampermonkey脚本

  1. // ==UserScript==
  2. // @name fordealfill
  3. // @name:zh 自动填表
  4. // @name:en fordealfill
  5. // @namespace https://github.com/mixterjim
  6. // @version 1.3
  7. // @author yy
  8. // @description 自动填写表单数据的Tampermonkey脚本
  9. // @description:en Tampermonkey Script for Autofilling Form Data
  10. // @match https://*.fordeal.com/zh-CN/goods/publish/*
  11. // @grant GM_setValue
  12. // @grant GM_getValue
  13. // @license GPL-3.0
  14. // ==/UserScript==
  15.  
  16. (function() {
  17. // 引入按钮组件样式
  18. const modalStyle = `
  19. /* 设置界面容器 */
  20. .settings-modal {
  21. top: 50%;
  22. left: 50%;
  23. transform: translate(-50%, -50%);
  24. zIndex: 9999;
  25. height:800px;
  26. width: 400px;
  27. padding: 20px;
  28. background-color: #fff;
  29. box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
  30. border-radius: 4px;
  31. display: flex;
  32. flex-direction: column;
  33. position: fixed;
  34. opacity: 0.8;
  35. transition: opacity 0.3s ease;
  36. }
  37.  
  38. .settings-modal:hover {
  39. /* 鼠标悬停时的样式 */
  40. opacity: 1;
  41. }
  42.  
  43. /* 标签样式 */
  44. .settings-label {
  45. font-weight: bold;
  46. margin-bottom: 10px;
  47. display: block;
  48. }
  49.  
  50. /* 输入框样式 */
  51. .settings-textarea {
  52. width: 100%;
  53. padding: 8px;
  54. height:400px;
  55. border: 1px solid #ccc;
  56. border-radius: 4px;
  57. background-color: #f8f8f8;
  58. color: #333;
  59. box-sizing: border-box;
  60. transition: border-color 0.3s ease;
  61. }
  62.  
  63. .settings-pricearea {
  64. width: 100%;
  65. height:40px;
  66. border: 1px solid #ccc;
  67. border-radius: 4px;
  68. background-color: #f8f8f8;
  69. color: #333;
  70. font-size:small;
  71. box-sizing: border-box;
  72. transition: border-color 0.3s ease;
  73. }
  74.  
  75. .settings-zhongliangarea {
  76. width: 100%;
  77. height:40px;
  78. border: 1px solid #ccc;
  79. border-radius: 4px;
  80. background-color: #f8f8f8;
  81. color: #333;
  82. font-size:small;
  83. box-sizing: border-box;
  84. transition: border-color 0.3s ease;
  85. }
  86.  
  87. .settings-titletextarea {
  88. width: 100%;
  89. padding: 8px;
  90. height:90px;
  91. border: 1px solid #ccc;
  92. border-radius: 4px;
  93. background-color: #f8f8f8;
  94. color: #333;
  95. box-sizing: border-box;
  96. transition: border-color 0.3s ease;
  97. }
  98.  
  99. .settings-input:focus {
  100. outline: none;
  101. border-color: #007bff;
  102. box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.1);
  103. }
  104.  
  105. /* 按钮Div */
  106. .settings-buttons {
  107. display: flex;
  108. }
  109.  
  110. /* 按钮样式 */
  111. .settings-button {
  112. flex: 1;
  113. padding: 8px 16px; /* 调整按钮的内边距 */
  114. margin-top: 10px;
  115. border: none;
  116. border-radius: 4px;
  117. color: #fff;
  118. background-color: #007bff;
  119. cursor: pointer;
  120. transition: background-color 0.3s ease;
  121. font-size: 14px; /* 调整按钮的字体大小 */
  122. }
  123.  
  124. .settings-button:not(:last-child) {
  125. margin-right: 20px;
  126. }
  127.  
  128. .settings-button:hover {
  129. background-color: #0056b3;
  130. }
  131.  
  132. .settings-button:active {
  133. background-color: #004f9d;
  134. }
  135.  
  136. /* 关闭按钮样式 */
  137. .close-button {
  138. position: absolute;
  139. top: 10px;
  140. right: 10px;
  141. padding: 6px;
  142. border: none;
  143. background-color: transparent;
  144. color: #333;
  145. font-size: 18px;
  146. cursor: pointer;
  147. }
  148.  
  149. .close-button:hover {
  150. color: #007bff;
  151. }
  152. `;
  153. function trimNewlines(str) {
  154. return str.replace(/^[\r\n]+|[\r\n]+$/g, '');
  155. }
  156.  
  157. // 创建设置按钮
  158. function createSettingsButton() {
  159. const button = document.createElement('button');
  160. button.innerText = 'fordealfill';
  161. button.style.position = 'fixed';
  162. button.style.top = '10px';
  163. button.style.right = '10px';
  164. button.style.zIndex = '9999';
  165. button.style.opacity = 0.8;
  166. button.style.color = 'gray';
  167. button.style.textShadow = '0 2px 6px rgba(0, 0, 0, 0.3)';
  168. button.addEventListener('click', openSettingsModal);
  169. return button;
  170. }
  171.  
  172. // 创建设置按钮
  173. function createSettingsButton2() {
  174. const button = document.createElement('button');
  175. button.innerText = '跳转跟卖页面';
  176. button.style.position = 'fixed';
  177. button.style.top = '50px';
  178. button.style.right = '10px';
  179. button.style.zIndex = '9999';
  180. button.style.opacity = 0.8;
  181. button.style.color = 'gray';
  182. button.style.textShadow = '0 2px 6px rgba(0, 0, 0, 0.3)';
  183. button.addEventListener('click', opengengmaiModal);
  184. return button;
  185. }
  186.  
  187. // 创建设置模态框
  188. function createSettingsModal() {
  189. const modal = document.createElement('div');
  190. modal.className = 'settings-modal';
  191. modal.style.zIndex = '9999'; // 解决部分网站会遮挡的问题
  192.  
  193. const createElement = (tagName, className, text, eventListener) => {
  194. const element = document.createElement(tagName);
  195. if (className) element.className = className;
  196. if (text) element.innerText = text;
  197. if (eventListener) element.addEventListener('click', eventListener);
  198. return element;
  199. };
  200.  
  201. const titleLable = createElement('label', 'settings-label', '标题:');
  202. const inputtitleField = createElement('textarea', 'settings-titletextarea');
  203.  
  204. const priceLable = createElement('label', 'settings-label', '成本价:');
  205. const priceField = createElement('textarea', 'settings-pricearea');
  206.  
  207. const zhongliangLable = createElement('label', 'settings-label', '重量:');
  208. const zhongliangField = createElement('textarea', 'settings-zhongliangarea');
  209.  
  210. const inputLabel = createElement('label', 'settings-label', '款式图片链接/自动填充:');
  211. const closeButton = createElement('button', 'close-button', 'x', closeSettingsModal);
  212. const inputField1 = createElement('textarea', 'settings-textarea');
  213. const buttons = createElement('div', 'settings-buttons');
  214. const inputLabel2 = createElement('label', 'settings-label', '商品轮播图链接:');
  215. const inputField2 = createElement('textarea', 'settings-textarea');
  216.  
  217. const saveButton = createElement('button', 'settings-button', '自动填充', saveFormData);
  218. const fillButton = createElement('button', 'settings-button', '恢复', fillForm);
  219. const clearButton = createElement('button', 'settings-button', '清空', clearFormData);
  220.  
  221. modal.appendChild(titleLable);
  222. modal.appendChild(inputtitleField);
  223. modal.appendChild(priceLable);
  224. modal.appendChild(priceField);
  225. modal.appendChild(zhongliangLable);
  226. modal.appendChild(zhongliangField);
  227.  
  228. modal.appendChild(inputLabel);
  229. modal.appendChild(closeButton);
  230. modal.appendChild(inputField1);
  231. modal.appendChild(inputLabel2);
  232. modal.appendChild(inputField2);
  233.  
  234. modal.appendChild(buttons);
  235. buttons.appendChild(saveButton);
  236. // buttons.appendChild(fillButton);
  237. // buttons.appendChild(clearButton);
  238.  
  239. // 引入样式
  240. const styleElement = document.createElement('style');
  241. styleElement.textContent = modalStyle;
  242. document.head.appendChild(styleElement);
  243.  
  244. return modal;
  245. }
  246.  
  247. // 打开跟卖
  248. function opengengmaiModal() {
  249. window.location.href = window.location.href.replace("copyItemId","itemId").replace("copy","follow").replace("online","follow");
  250.  
  251.  
  252. }
  253. function delay(ms) {
  254. return new Promise(function(resolve) {
  255. setTimeout(resolve, ms);
  256. });
  257. }
  258.  
  259. // 打开设置模态框
  260. function openSettingsModal() {
  261. const formData = getFormData();
  262. const modal = createSettingsModal();
  263. const inputField = modal.querySelector('textarea');
  264.  
  265. inputField.value = "";
  266.  
  267. // Check if the modal is already open
  268. if (!document.querySelector('.settings-modal')) {
  269. document.body.appendChild(modal);
  270. delay(300).then(function() {
  271. let inputField =document.querySelectorAll('.settings-modal textarea')[3];
  272. inputField.addEventListener('keyup', function(event) {
  273. // 当用户释放键盘按键时,如果是修改了textarea的内容,这里的代码会被执行
  274. if (event.target.value.indexOf("biaoti:") > -1) {
  275. console.log('内容变化了:', event.target.value);
  276. var allvalue = event.target.value;
  277. var zhutu = "";
  278. var skutu ="";
  279. var title ="";
  280. if (allvalue.indexOf("zhutu:") > -1) {
  281. zhutu = allvalue.split("zhutu:")[1]
  282. allvalue = allvalue.split("zhutu:")[0]
  283. document.querySelectorAll('.settings-modal textarea')[4].value = trimNewlines(zhutu);
  284. }
  285. if (allvalue.indexOf("sku:") > -1) {
  286. skutu = allvalue.split("sku:")[1]
  287. allvalue = allvalue.split("sku:")[0]
  288. document.querySelectorAll('.settings-modal textarea')[3].value = trimNewlines(skutu);
  289.  
  290. }
  291. console.log("sfdgsdf:"+allvalue)
  292. title = allvalue.split("biaoti:")[1]
  293. document.querySelector('.settings-modal textarea').value = trimNewlines(title)
  294.  
  295.  
  296.  
  297.  
  298. }
  299. });
  300. })
  301.  
  302. }
  303. }
  304.  
  305. // 关闭设置模态框
  306. function closeSettingsModal() {
  307. const modal = document.querySelector('.settings-modal');
  308. if (modal) {
  309. modal.remove();
  310. }
  311. }
  312.  
  313.  
  314. // 在需要延迟执行的地方调用delay函数
  315. //delay();
  316.  
  317. // "kuangshidialog" 款式框弹出来
  318. // "kuangshijia" 款式加号
  319. // "kuanshifinish"
  320. // "daxiao" 大小
  321. var price = "";
  322. var weight = "";
  323. var zhuantai = "start";
  324. var ks = 2;
  325. var ksArr ="";
  326. var shanpingArr = "";
  327. var formData2 = "";
  328.  
  329. function jisuanjiage(jinhuoprice) {
  330. var numberprice = Number(jinhuoprice);
  331. if (numberprice > 100) {
  332. return numberprice*1.93/6.8
  333. }
  334. if (numberprice > 80) {
  335. return numberprice*1.96/6.8;
  336. }
  337. if (numberprice > 50) {
  338. return numberprice*2.01/6.8;
  339. }
  340. if (numberprice > 30) {
  341. return numberprice*2.06/6.8;
  342. }
  343. if (numberprice < 8) {
  344. return numberprice*2.86/6.8;
  345. }
  346. return numberprice*2.48/6.8;
  347. }
  348.  
  349. // 通用点按钮上传图片,并关闭窗口
  350. function shangchuangtupian() {
  351. setTimeout(function() {
  352. let textarea = document.querySelector('[rows="20"]');
  353. document.querySelector('[rows="20"]').value=formData2;
  354. console.log(shanpingArr);
  355. textarea.dispatchEvent(new Event('input', { bubbles: true }));
  356. setTimeout(function() {
  357. //确定按钮开始上传
  358. document.getElementsByClassName("el-button el-button--primary el-button--small")[document.getElementsByClassName("el-button el-button--primary el-button--small").length-1].click();
  359. //关闭窗口
  360. setTimeout(function() {
  361. document.getElementsByClassName("el-dialog__close el-icon el-icon-close")[document.getElementsByClassName("el-dialog__close el-icon el-icon-close").length-1].click();
  362.  
  363. // X按钮
  364. /* document.getElementsByClassName("el-dialog__close el-icon el-icon-close")[document.getElementsByClassName("el-dialog__close el-icon el-icon-close").length-1].click();
  365. delay(1000).then(function() {
  366. // 确定按钮
  367. document.getElementsByClassName("alert-main-footer border")[0].getElementsByClassName("el-button el-button--primary el-button--small")[0].click();
  368. });*/
  369.  
  370. },2000);
  371.  
  372. },600)
  373. },400)
  374. }
  375.  
  376. var zhuantaitupianfinishid = 0;
  377. // 等待款式图片传玩
  378. function waitingtupianfinish(i) {
  379. if (document.getElementsByClassName("delete")) {
  380.  
  381. delay(100).then(function() {
  382. // 确定按钮
  383. document.getElementsByClassName("alert-main-footer border")[0].getElementsByClassName("el-button el-button--primary el-button--small")[0].click();
  384. });
  385. zhuantaitupianfinishid = i;
  386. if (i == ks) {
  387. console.log("kuanshifinish !!!");
  388. zhuantai = "kuanshifinish";
  389.  
  390. }
  391. return;
  392. } else {
  393. delay(200).then(function () {
  394. console.log("等图片传玩xxxxx" +i);
  395. waitingtupianfinish();
  396. })
  397. }
  398.  
  399. }
  400.  
  401. // 等待上一个款式弄完
  402. function kuanshitupian1(i) {
  403. console.log("sdfdsfd" + zhuantai + i);
  404. if (document.getElementsByClassName("sku-item-img-dialog-body") && document.getElementsByClassName("sku-item-img-dialog-body").length > 0 && i > 1 && zhuantaitupianfinishid != i -1) {
  405. delay(500).then(function () {
  406. console.log("等上一个图片xxxxx" +i);
  407. kuanshitupian1(i);
  408. })
  409. return;
  410. }
  411. document.getElementsByClassName("add")[i-1].click();
  412. delay(100).then(function() {
  413. document.getElementsByClassName("upload-tit")[1].click();
  414. })
  415. setTimeout(function() {
  416. let textarea = document.querySelector('[rows="20"]');
  417. document.querySelector('[rows="20"]').value=ksArr[i-1];
  418. textarea.dispatchEvent(new Event('input', { bubbles: true }));
  419.  
  420. },500)
  421. setTimeout(function() {
  422. //确定按钮开始上传
  423. document.getElementsByClassName("el-button el-button--primary el-button--small")[document.getElementsByClassName("el-button el-button--primary el-button--small").length-1].click();
  424. //关闭窗口
  425. setTimeout(function() {
  426. // X按钮
  427. document.getElementsByClassName("el-dialog__close el-icon el-icon-close")[document.getElementsByClassName("el-dialog__close el-icon el-icon-close").length-1].click();
  428. delay(1000).then(function() {
  429. // 确定按钮
  430. waitingtupianfinish(i);
  431. });
  432.  
  433. },2200);
  434.  
  435. },600)
  436.  
  437. }
  438.  
  439. // 上传款式图片
  440. function kuanshitupian() {
  441. //上传图片
  442. if (zhuantai == "kuangshijia") {
  443. console.log("kuanshitupian");
  444. } else {
  445. delay(400).then(function() {
  446. kuanshitupian();
  447. })
  448. return;
  449. }
  450. for (let i = 1; i <= ks; i++) {
  451. setTimeout(function() {
  452. kuanshitupian1(i)
  453. }, (i) * 1000);
  454. }
  455. }
  456.  
  457.  
  458. // 款式选择
  459. function kuanshixuanzhe() {
  460. if (zhuantai == "kuangshidialog" || zhuantai == "kuangshijia") {
  461. console.log("dddd");
  462. return;
  463. } else {
  464. delay(300).then(function() {
  465. kuanshixuanzhe();
  466. })
  467. }
  468.  
  469. if (document.querySelector('[alt=款式1]')) {
  470. zhuantai="kuangshidialog";
  471. console.log("kuangshidialog show");
  472. for (let i = 1; i <= ks; i++) {
  473. setTimeout(function() {
  474. let name = "款式"+i;
  475. document.querySelector('[alt='+name+']').click();
  476.  
  477. console.log(name);
  478. if (i == ks) {
  479. setTimeout(function() {
  480. //确定按钮
  481. document.getElementsByClassName("el-button el-button--primary el-button--small")[2].click();
  482. zhuantai = "kuangshijia";
  483. }, 300);
  484. }
  485. }, i * 150);
  486. }
  487. }
  488. }
  489. // 款式
  490. function kuangshi() {
  491. // 添加款式按钮
  492. document.getElementsByClassName("el-button el-button--primary el-button--small")[0].click();
  493. // 款式框是否显示完成
  494. delay(300).then(function() {
  495. kuanshixuanzhe();
  496. })
  497.  
  498. // 上传图片
  499. delay(400).then(function() {
  500. kuanshitupian()
  501. })
  502.  
  503. }
  504.  
  505. // 价格和重量
  506. function jiagezhongliang() {
  507. if (zhuantai !== "kuanshifinish") {
  508. console.log("等待款式弄完");
  509. delay(1000).then(function() {
  510. jiagezhongliang();
  511. })
  512. return;
  513. }
  514. // 价格
  515. var jiageelement = document.getElementsByClassName("el-form-item__content")[2].getElementsByClassName("el-input__inner")[0];
  516. jiageelement.value=jisuanjiage(price);
  517. let inputevent = new InputEvent('input', {
  518. 'bubbles': true,
  519. 'cancelable': false
  520. })
  521. jiageelement.dispatchEvent(inputevent)
  522. let changeEvent = new Event('change', {
  523. 'bubbles': true
  524. })
  525. jiageelement.dispatchEvent(changeEvent)
  526.  
  527. // 库存
  528. var kucunelement = document.getElementsByClassName("el-form-item__content")[3].getElementsByClassName("el-input__inner")[0];
  529. kucunelement.value="1111";
  530. kucunelement.dispatchEvent(inputevent)
  531. kucunelement.dispatchEvent(changeEvent)
  532.  
  533. // 重量
  534. var zhongliangelement = document.getElementsByClassName("el-form-item__content")[4].getElementsByClassName("el-input__inner")[0];
  535. zhongliangelement.value = weight;
  536. zhongliangelement.dispatchEvent(inputevent)
  537. zhongliangelement.dispatchEvent(changeEvent)
  538.  
  539. delay(200).then(function() {
  540. document.getElementsByClassName("mod-batch-action")[0].getElementsByClassName("el-button el-button--primary el-button--small")[0].click();
  541. })
  542. }
  543.  
  544.  
  545. //商品轮播图
  546. function shangpinlunbotu() {
  547. if (zhuantai !== "kuanshifinish") {
  548. console.log("等待款式弄完");
  549. delay(900).then(function() {
  550. shangpinlunbotu();
  551. })
  552. return;
  553. }
  554. console.log("shangpinglunbotu");
  555.  
  556. document.getElementsByClassName("main-content")[0].scrollTo({ top: 5*document.body.scrollHeight,
  557. behavior: 'smooth'
  558. });
  559. //商品详情图 begin
  560. delay(1000).then(function() {
  561. let letold = document.querySelectorAll('[class=delete]');
  562. let oldsize = letold.length;
  563. let xx =1;
  564. console.log("sdfsdfdelete"+oldsize);
  565.  
  566. for ( xx; xx<=oldsize;xx++) {
  567. console.log("delete"+xx);
  568. setTimeout(function() {
  569. document.querySelectorAll('[class=delete]')[0].click();
  570. }, xx*100)
  571.  
  572. };
  573.  
  574. delay(400+xx*90).then(function() {
  575. document.getElementsByClassName("com-upload__content")[1].getElementsByClassName("upload-tit")[1].click();
  576. setTimeout(function() {
  577. shangchuangtupian();
  578. },1000)});
  579. });
  580. }
  581.  
  582.  
  583.  
  584. // 保存表单数据到本地存储
  585. function saveFormData() {
  586. // 滑动到底部
  587.  
  588. delay(100).then(function() {
  589. const modal = document.querySelector('.settings-modal');
  590. if (modal) {
  591. modal.remove();
  592. }
  593. });
  594.  
  595. var title = document.querySelector('.settings-modal textarea').value.split(/[(\r\n)\r\n]+/);
  596. console.log(title);
  597.  
  598. price =document.querySelectorAll('.settings-modal textarea')[1].value;
  599. weight = document.querySelectorAll('.settings-modal textarea')[2].value;
  600.  
  601. console.log("price:"+price)
  602. console.log("weight:"+weight)
  603. var inputField = document.querySelectorAll('.settings-modal textarea')[3];
  604. var formData = inputField.value;
  605. ksArr = formData.split(/[(\r\n)\r\n]+/);
  606.  
  607. console.log(ksArr);
  608. ks = ksArr.length;
  609. if (formData == '')
  610. ks = 0
  611. formData2 = document.querySelectorAll('.settings-modal textarea')[4].value;
  612. shanpingArr=formData2.split(/[(\r\n)\r\n]+/);
  613.  
  614.  
  615. //输入文案
  616. let pdf = document.getElementsByClassName("el-textarea__inner")[0];
  617. pdf.value=title[0];
  618. pdf.dispatchEvent(new Event('input', { bubbles: true }));
  619.  
  620. delay(1000).then(function() {
  621. let pdf = document.getElementsByClassName("el-input__inner")[1];
  622. // pdf.value="自有品牌";
  623. pdf.dispatchEvent(new Event('input', { bubbles: true }));
  624. let event = new MouseEvent('click', {
  625. 'bubbles': true,
  626. 'cancelable': false
  627. });
  628.  
  629. // 触发点击
  630. pdf.dispatchEvent(event);
  631. delay(600).then(function() {
  632. let pdfxx = document.getElementsByClassName("el-select-dropdown__item")
  633. let lenxx = pdfxx.length;
  634. let event = new MouseEvent('click', {
  635. 'bubbles': true,
  636. 'cancelable': false
  637. });
  638. pdfxx[lenxx-1].dispatchEvent(event);
  639. })
  640. })
  641.  
  642.  
  643. delay(1400).then(function() {
  644. document.getElementsByClassName("main-content")[0].scrollTo({ top: 2*document.body.scrollHeight,
  645. behavior: 'smooth'
  646. });
  647. })
  648.  
  649.  
  650.  
  651. // document.getElementsByClassName("main-content")[0].scrollTop=10000;
  652.  
  653. // document.getElementsByClassName("el-input__inner")[1].value='自有品牌';
  654.  
  655. // ----------------- 商品规格 begin--------------------------
  656. // 先吧以前的删了
  657. if (ks > 0) {
  658. delay(2000).then(function(){
  659.  
  660. let letold = document.querySelectorAll('[class=el-icon-error]');
  661. let oldsize = letold.length;
  662. let xx =1;
  663. for ( xx; xx<=oldsize-1;xx++) {
  664. console.log("dddd");
  665. setTimeout(function() {
  666. document.querySelectorAll('[class=el-icon-error]')[0].click();
  667. }, xx*100)
  668.  
  669. };
  670.  
  671.  
  672. delay(oldsize*300).then(function() {
  673. kuangshi();
  674. }) ;
  675.  
  676. if (price != "" && weight != "") {
  677. delay(1000).then(function() {
  678. jiagezhongliang();
  679.  
  680. })
  681. }
  682. });
  683. }
  684.  
  685. //商品详情图 end
  686. if (shanpingArr.length > 0 && formData2 != '') {
  687. delay(3000+ks*3100).then(function() {
  688. shangpinlunbotu();
  689. })
  690. }
  691.  
  692. // 保存表单数据到本地存储
  693. // localStorage.setItem('formData', formData);
  694. // console.log(formData);
  695. // closeSettingsModal();
  696. }
  697.  
  698. // 清空表单数据
  699. function clearFormData() {
  700. // 清空本地存储中的表单数据
  701. localStorage.removeItem('formData');
  702.  
  703. // 清空表单中的值
  704. const formFields = document.querySelectorAll('input, textarea, select');
  705. formFields.forEach(function(field) {
  706. field.value = '';
  707. });
  708.  
  709. closeSettingsModal();
  710. }
  711.  
  712. // 获取表单数据
  713. function getFormData() {
  714. const formFields = document.querySelectorAll('input, textarea, select');
  715. const formData = {};
  716. const form = document.querySelector('form');
  717.  
  718. formFields.forEach(function(field) {
  719. formData[field.name] = field.value;
  720. });
  721.  
  722. return JSON.stringify(formData);
  723. }
  724.  
  725. // 设置表单数据
  726. function setFormData(formData) {
  727. try {
  728. const parsedData = JSON.parse(formData);
  729. const formFields = document.querySelectorAll('input, textarea, select');
  730.  
  731. formFields.forEach(function(field) {
  732. if (field.name in parsedData) {
  733. field.value = parsedData[field.name];
  734. }
  735. });
  736. } catch (error) {
  737. console.error('无法解析表单数据:', error);
  738. }
  739. }
  740.  
  741. // 自动填充表单数据
  742. function fillForm() {
  743. // 检查本地存储中是否存在已保存的表单数据
  744. const savedFormData = localStorage.getItem('formData');
  745. if (savedFormData) {
  746. setFormData(savedFormData);
  747. }
  748. closeSettingsModal();
  749. }
  750.  
  751. // 在页面完全加载后执行
  752. window.addEventListener('load', function() {
  753. // 添加设置按钮
  754. const settingsButton = createSettingsButton();
  755. const settingsButton2 = createSettingsButton2();
  756.  
  757. document.body.appendChild(settingsButton);
  758. document.body.appendChild(settingsButton2);
  759.  
  760. setTimeout(openSettingsModal,2000);
  761. // 自动填充表单数据
  762. setTimeout(fillForm, 1000); // 延迟填充数据,防止表单未完全载入
  763. });
  764. })();