|
|
@@ -2,7 +2,7 @@ function assistLoad(itemId) {
|
|
|
// 页面为加载完毕就不断等待
|
|
|
if (!document.body) {
|
|
|
setTimeout(() => {
|
|
|
- assistLoad()
|
|
|
+ assistLoad(itemId)
|
|
|
}, 500);
|
|
|
return
|
|
|
}
|
|
|
@@ -44,7 +44,7 @@ function assistLoad(itemId) {
|
|
|
}, '*');
|
|
|
};
|
|
|
function sendCallBack(callBackID, value) {
|
|
|
- if (!event.data.callBackID) return
|
|
|
+ if (!callBackID) return
|
|
|
iframe.contentWindow.postMessage({
|
|
|
type: "callBack",
|
|
|
value,
|
|
|
@@ -68,38 +68,103 @@ function assistLoad(itemId) {
|
|
|
// 接收子页面发来的消息
|
|
|
window.addEventListener('message', (event) => {
|
|
|
// console.log('来自子页面的消息:', event.data);
|
|
|
+ let domTemp = null
|
|
|
+ if (event.data.target) {
|
|
|
+ if (typeof event.data.target === "string") {
|
|
|
+ domTemp = document.querySelector(event.data.target);
|
|
|
+ } else {
|
|
|
+ domTemp = document.querySelectorAll(event.data.target[0])[event.data.target[1]];
|
|
|
+ }
|
|
|
+ }
|
|
|
switch (event.data.type) {
|
|
|
// assistMsg('click','#shi')
|
|
|
case "click":
|
|
|
- if (typeof event.data.target === "string") {
|
|
|
- if (document.querySelector(event.data.target)) {
|
|
|
- document.querySelector(event.data.target).click()
|
|
|
- sendCallBack(event.data.callBackID, {"err": 0})
|
|
|
- } else {
|
|
|
- sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"})
|
|
|
- }
|
|
|
-
|
|
|
+ if (domTemp) {
|
|
|
+ document.querySelector(event.data.target).click()
|
|
|
+ sendCallBack(event.data.callBackID, {"err": 0})
|
|
|
} else {
|
|
|
- if (document.querySelectorAll(event.data.target[0])[event.data.target[1]]) {
|
|
|
- document.querySelectorAll(event.data.target[0])[event.data.target[1]].click()
|
|
|
- sendCallBack(event.data.callBackID, {"err": 0})
|
|
|
- } else {
|
|
|
- sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"})
|
|
|
- }
|
|
|
+ sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"})
|
|
|
}
|
|
|
-
|
|
|
break;
|
|
|
case "setValue":
|
|
|
- const domTemp = document.querySelector(event.data.target)
|
|
|
if (domTemp) {
|
|
|
- domTemp.value = event.data.value
|
|
|
- // 触发 `input` 事件,让 Vue/React 或监听的代码能检测到变化
|
|
|
- domTemp.dispatchEvent(new Event("input", { bubbles: true }));
|
|
|
- sendCallBack(event.data.callBackID, {"err": 0})
|
|
|
+ try {
|
|
|
+ const element = domTemp;
|
|
|
+ const newValue = event.data.value;
|
|
|
+
|
|
|
+ // 统一处理值设置
|
|
|
+ if (element.type === 'checkbox' || element.type === 'radio') {
|
|
|
+ element.checked = Boolean(newValue);
|
|
|
+ } else if (element.tagName === 'SELECT' && element.multiple) {
|
|
|
+ // 多选select
|
|
|
+ const values = Array.isArray(newValue) ? newValue : [newValue];
|
|
|
+ Array.from(element.options).forEach(option => {
|
|
|
+ option.selected = values.includes(option.value);
|
|
|
+ });
|
|
|
+ } else if (element.isContentEditable) {
|
|
|
+ // 可编辑元素
|
|
|
+ element.innerHTML = newValue;
|
|
|
+ } else {
|
|
|
+ // 普通input/textarea/select
|
|
|
+ element.value = newValue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 触发所有可能的事件
|
|
|
+ const events = [
|
|
|
+ 'input', // Vue/React/Svelte
|
|
|
+ 'change', // 传统框架
|
|
|
+ 'blur', // 表单验证
|
|
|
+ 'keyup', // 键盘事件
|
|
|
+ 'keydown',
|
|
|
+ 'keypress'
|
|
|
+ ];
|
|
|
+
|
|
|
+ events.forEach(eventType => {
|
|
|
+ element.dispatchEvent(new Event(eventType, {
|
|
|
+ bubbles: true,
|
|
|
+ cancelable: true
|
|
|
+ }));
|
|
|
+ });
|
|
|
+
|
|
|
+ // 额外处理特殊事件
|
|
|
+ if (element.type === 'checkbox' || element.type === 'radio') {
|
|
|
+ element.dispatchEvent(new Event('click', { bubbles: true }));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 等待下一个事件循环,确保事件处理完成
|
|
|
+ setTimeout(() => {
|
|
|
+ // 再次触发change事件,确保异步处理完成
|
|
|
+ element.dispatchEvent(new Event('change', { bubbles: true }));
|
|
|
+ }, 0);
|
|
|
+
|
|
|
+ sendCallBack(event.data.callBackID, {"err": 0, "msg": "设置成功"});
|
|
|
+
|
|
|
+ } catch (error) {
|
|
|
+ sendCallBack(event.data.callBackID, {"err": 2, "msg": `设置失败: ${error.message}`});
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"});
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "getInnerText":
|
|
|
+ if (domTemp) {
|
|
|
+ sendCallBack(event.data.callBackID, {"err": 0, "value": domTemp.innerText})
|
|
|
+ } else {
|
|
|
+ sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"})
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "getInnerHTML":
|
|
|
+ if (domTemp) {
|
|
|
+ sendCallBack(event.data.callBackID, {"err": 0, "value": domTemp.innerHTML})
|
|
|
} else {
|
|
|
sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"})
|
|
|
}
|
|
|
-
|
|
|
+ break;
|
|
|
+ case "turnURL":
|
|
|
+ location.href = event.data.value;
|
|
|
+ break;
|
|
|
+ case "getURL":
|
|
|
+ sendCallBack(event.data.callBackID, {"err": 0, "value": location.href})
|
|
|
break;
|
|
|
// assistMsg('fetch', {
|
|
|
// url: "https://obfuscator.lamp.run",
|
|
|
@@ -130,15 +195,20 @@ function assistLoad(itemId) {
|
|
|
sendCallBack(event.data.callBackID, returnList)
|
|
|
break;
|
|
|
case "fetch":
|
|
|
- fetch(event.data.value.url, event.data.value.options)
|
|
|
- .then((response) => response.text())
|
|
|
- .then((result) => {
|
|
|
- console.log(result)
|
|
|
- if (event.data.callBackID) {
|
|
|
- sendCallBack(event.data.callBackID, result)
|
|
|
+ chrome.runtime.sendMessage(
|
|
|
+ {
|
|
|
+ name: 'fetch',
|
|
|
+ url: event.data.url,
|
|
|
+ options: event.data.options
|
|
|
+ },
|
|
|
+ function(response) {
|
|
|
+ console.log(response)
|
|
|
+ if (response.success) {
|
|
|
+ sendCallBack(event.data.callBackID, {"err": 0, "value": response.data, "headers": response.headers, "status": response.status})
|
|
|
+ } else {
|
|
|
+ sendCallBack(event.data.callBackID, {"err": 1, "msg": response.error})
|
|
|
}
|
|
|
- })
|
|
|
- .catch((error) => console.error(error));
|
|
|
+ });
|
|
|
break;
|
|
|
case "closeWindow":
|
|
|
window.close();
|