szzxc 发表于 2024-9-30 11:53
if (location.href.includes('sogou') if (location.href.includes('baidu')) 这个两判断有什么用? 一 ...
本质上iframe也是一个新页面,原理是完全一样的:
// ==UserScript==
// @name 跨域交互
// @description ...
// @namespace ...
// @author ...
// @version 1.0
// @match https://www.baidu.com/*
// @match https://www.sogou.com/*
// @grant none
// @run-at document-idle
// ==/UserScript==
(function() {
'use strict';
if (location.href.includes('baidu')) {
const iframe = document.createElement('iframe');
iframe.src = 'https://www.sogou.com/';
iframe.id = 'aabbcc';
//iframe.style.display = 'none';
iframe.style.width = '100%'; // 根据需要调整宽度
iframe.style.height = '600px'; // 根据需要调整高度
document.body.appendChild(iframe);
window.addEventListener('message', e => {
if (e.data.loaded) {
console.log('搜狗已加载。');
document.querySelector('input#su').addEventListener('click', e2 => {
e2.preventDefault();
e2.stopImmediatePropagation();
e.source.postMessage({
search: true,
value: document.querySelector('input#kw').value
}, 'https://www.sogou.com');
}, true);
}
});
}
if (location.href.includes('sogou')) {
window.top.postMessage({
loaded: true
}, 'https://www.baidu.com');
window.addEventListener('message', e => {
if (e.data.search) {
document.querySelector('input#query').value = e.data.value;
document.querySelector('input#stb').click();
}
});
}
})();
你对iframe的理解似乎有点问题,iframe被嵌入后视作一个新页面,与原页面隔离,脚本也会注入一个新的实例在这个iframe页面内,此时location.href会变成iframe.src,所以判断location.href可以区分当前在主页面还是iframe作用域下,也就是说,上下两段代码每次只有一段会生效,这就是为什么我多次强调,你要把他看作2个脚本,主页面的脚本做主页面的事,iframe的脚本做iframe的事,postMessage起一个传递信息的作用。