window.open() & iframe

本文探讨了使用window.open()方法及iframe元素进行网页窗口管理和内容加载的策略。深入讲解了如何通过JavaScript创建弹窗并禁用父窗口,以及在iframe中加载不同来源URL的技术细节。此外,还提供了关于跨源资源共享(CORS)限制下iframe加载HTTPS资源的解决方案。

window.open() & iframe

https://www.w3schools.com/jsref/met_win_open.asp


window.open(URL, name, specs, replace);

740516-20190301153517669-1468090049.png

https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open3

740516-20190301153548123-755978067.png


<button onclick="myFunction()">Try it</button>



https://github.com/xyzdata/RAIO/issues/218

https://stackoverflow.com/questions/5660700/javascript-to-open-popup-window-and-disable-parent-window


var popupWindow=null;

function popup()
{
    popupWindow = window.open('child_page.html','name','width=200, height=200');
}

function parent_disable() {
    if(popupWindow && !popupWindow.closed)
    popupWindow.focus();
}

https://stackoverflow.com/questions/14104801/open-window-in-iframe

https://stackoverflow.com/questions/19759880/open-iframe-in-a-new-window

\n

740516-20190301155624060-928382701.png

ta;
<textarea data-dom=​"textarea" width=​"400" height=​"300">​</textarea>​
ta.innerText;
""
ta.innerHTML;
""
ta.value;
"https://photo.sina.cn/album_1_88610_353390.htm
https://photo.sina.cn/album_1_88610_353390.htm
https://photo.sina.cn/album_1_88610_353390.htm"
ta.value;
"http
http
http"
ta.value.includes(` `);
false
ta.value.length;
14
ta.value.includes(`\n`);
true
arr = ta.value.split(`\n`);
(3) ["http", "http", "http"]

forbidden iframe


http://www.whb.cn/zhuzhan/cs/20190128/238820.html
http://www.xjtj.gov.cn/tjfx/201901/t20190108_562446.html
http://med.sina.com/article_detail_103_2_59978.html
http://www.chinaz.com/news/mt/2019/0128/987390.shtml
http://www.canyin168.com/Article/jyaq/77176.html
http://www.nxjjjc.gov.cn/yw/201803/t20180301_4465305.html
http://www.shjcw.gov.cn/2015jjw/n2230/n2236/u1ai76732.html
http://bigdata.idcquan.com/news/157324.shtml
http://blockchain.idcquan.com/156300.shtml
http://dc.idcquan.com/xmzb/156311.shtml
http://cloud.idcquan.com/yjs/157991.shtml
http://news.idcquan.com/gjzx/158129.shtml
http://www.ccs.org.cn/ccswz/font/fontAction!article.do?articleId=8a818208685540b901689238410a4a23
http://www.cnnp.com.cn/art/2018/12/28/art_32_6097.html
http://www.chemm.cn/News/news-73639.html
http://finance.ce.cn/rolling/201901/28/t20190128_31372451.shtml
http://www.ce.cn/macro/more/201901/28/t20190128_31370083.shtml

740516-20190301193608658-1269075431.png


iframe & HTTPS & CORS

https://iframe.xgqfrms.xyz/eapp/index.html#blog.sina.cn

转载于:https://www.cnblogs.com/xgqfrms/p/10456694.html

private fun WebView.executeAutoFillScript(retryCount: Int = 0) { val maxRetries = 3 android.util.Log.d(&quot;WebView&quot;, &quot;开始执行自动填写脚本,延迟2秒... (重试次数: $retryCount)&quot;) postDelayed({ android.util.Log.d(&quot;WebView&quot;, &quot;开始执行JavaScript自动填写脚本&quot;) val autoFillScript = &quot;&quot;&quot; (function() { try { if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;开始自动填写表单 - 页面标题: &#39; + document.title + &#39;, URL: &#39; + window.location.href); } // 首先检查页面是否有iframe var iframes = document.querySelectorAll(&#39;iframe&#39;); if (iframes.length &gt; 0 &amp;&amp; window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;发现 &#39; + iframes.length + &#39; 个iframe&#39;); for (var i = 0; i &lt; iframes.length; i++) { try { var iframe = iframes[i]; // 方法1: 尝试直接访问iframe内容 var iframeDoc = null; try { iframeDoc = iframe.contentDocument || iframe.contentWindow.document; } catch (e) { window.Android.log(&#39;直接访问iframe[&#39; + i + &#39;]失败: &#39; + e.message); } // 方法2: 如果直接访问失败,尝试通过srcdoc或重新加载同源内容 if (!iframeDoc) { // 检查iframe是否有src属性 var iframeSrc = iframe.src; if (iframeSrc &amp;&amp; iframeSrc !== &#39;about:blank&#39;) { window.Android.log(&#39;iframe[&#39; + i + &#39;] src: &#39; + iframeSrc); // 方法3: 尝试通过XMLHttpRequest获取iframe内容 try { var xhr = new XMLHttpRequest(); xhr.open(&#39;GET&#39;, iframeSrc, false); // 同步请求 xhr.send(); if (xhr.status === 200) { // 创建一个新的iframe来加载内容 var tempDiv = document.createElement(&#39;div&#39;); tempDiv.innerHTML = xhr.responseText; // 从响应中提取表单元素 var tempInputs = tempDiv.querySelectorAll(&#39;input, textarea, select&#39;); window.Android.log(&#39;通过XHR获取iframe[&#39; + i + &#39;]内容,包含 &#39; + tempInputs.length + &#39; 个输入元素&#39;); // 处理提取的表单元素 if (tempInputs.length &gt; 0) { processExtractedIframeContent(tempDiv, iframeSrc, i); } } } catch (xhrError) { window.Android.log(&#39;XHR获取iframe[&#39; + i + &#39;]内容失败: &#39; + xhrError.message); } } else if (iframe.srcdoc) { // 处理srcdoc内容 var tempDiv = document.createElement(&#39;div&#39;); tempDiv.innerHTML = iframe.srcdoc; var tempInputs = tempDiv.querySelectorAll(&#39;input, textarea, select&#39;); window.Android.log(&#39;iframe[&#39; + i + &#39;] srcdoc包含 &#39; + tempInputs.length + &#39; 个输入元素&#39;); if (tempInputs.length &gt; 0) { processExtractedIframeContent(tempDiv, &#39;srcdoc&#39;, i); } } } else { // 直接访问成功 var iframeInputs = iframeDoc.querySelectorAll(&#39;input, textarea, select&#39;); window.Android.log(&#39;iframe[&#39; + i + &#39;] 包含 &#39; + iframeInputs.length + &#39; 个输入元素&#39;); if (iframeInputs.length &gt; 0) { // 在iframe内执行自动填写 executeInIframe(iframe, iframeDoc); } } } catch (e) { window.Android.log(&#39;处理iframe[&#39; + i + &#39;]时出错: &#39; + e.message); } } } // 定义要填写的用户名邮箱 var username = &#39;test&#39;; var email = &#39;test@qq.com&#39;; // 分析主页面结构 var allInputs = document.querySelectorAll(&#39;input, textarea, select&#39;); var allButtons = document.querySelectorAll(&#39;button, input[type=&quot;button&quot;], input[type=&quot;submit&quot;]&#39;); var allForms = document.querySelectorAll(&#39;form&#39;); if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;页面分析 - 输入框: &#39; + allInputs.length + &#39;, 按钮: &#39; + allButtons.length + &#39;, 表单: &#39; + allForms.length); } // 如果主页面有表单元素,优先处理主页面 if (allInputs.length &gt; 0 || allButtons.length &gt; 0 || allForms.length &gt; 0) { fillAndSubmitForm(username, email); } else { // 如果主页面没有表单元素,检查是否处理了iframe内容 if (iframes.length === 0) { if (window.Android &amp;&amp; window.Android.onFormError) { window.Android.onFormError(&#39;页面中没有找到任何表单元素&#39;); } } else { window.Android.log(&#39;主页面没有表单元素,但已处理 &#39; + iframes.length + &#39; 个iframe&#39;); } } } catch (error) { if (window.Android &amp;&amp; window.Android.onFormError) { window.Android.onFormError(&#39;脚本执行错误: &#39; + error.message); } if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;错误: &#39; + error); } } // 处理提取的iframe内容 function processExtractedIframeContent(tempDiv, source, iframeIndex) { try { var username = &#39;test&#39;; var email = &#39;test@qq.com&#39;; // 查找表单元素 var inputs = tempDiv.querySelectorAll(&#39;input, textarea, select&#39;); var forms = tempDiv.querySelectorAll(&#39;form&#39;); var buttons = tempDiv.querySelectorAll(&#39;button, input[type=&quot;submit&quot;]&#39;); window.Android.log(&#39;从&#39; + source + &#39;提取的表单 - 输入框: &#39; + inputs.length + &#39;, 表单: &#39; + forms.length + &#39;, 按钮: &#39; + buttons.length); // 如果找到表单元素,尝试模拟提交 if (inputs.length &gt; 0) { // 这里可以记录表单结构,但无法直接交互 for (var j = 0; j &lt; inputs.length; j++) { var input = inputs[j]; var info = &#39;iframe[&#39; + iframeIndex + &#39;]字段[&#39; + j + &#39;]: type=&#39; + input.type + &#39;, name=&#39; + input.name + &#39;, placeholder=&#39; + input.placeholder; window.Android.log(info); } // 由于无法直接交互,只能提供信息给用户 if (window.Android &amp;&amp; window.Android.onFormDetected) { window.Android.onFormDetected(&#39;检测到iframe中的表单,但无法自动填写跨域内容&#39;); } } } catch (error) { window.Android.log(&#39;处理提取的iframe内容时出错: &#39; + error.message); } } // 在iframe内执行自动填写 function executeInIframe(iframe, iframeDoc) { try { var username = &#39;test&#39;; var email = &#39;test@qq.com&#39;; // 创建在iframe内执行的脚本 - 修正版本 var iframeScript = &quot;(function() {&quot; + &quot;try {&quot; + &quot; var inputs = document.querySelectorAll(&#39;input, textarea, select&#39;);&quot; + &quot; var filled = 0;&quot; + &quot; var textInputs = Array.from(document.querySelectorAll(&#39;input[type=\\\&quot;text\\\&quot;], input:not([type]), textarea&#39;));&quot; + &quot; if (textInputs.length &gt;= 1) {&quot; + &quot; textInputs[0].value = &#39;&quot; + username + &quot;&#39;;&quot; + &quot; textInputs[0].dispatchEvent(new Event(&#39;input&#39;, { bubbles: true }));&quot; + &quot; filled++;&quot; + &quot; }&quot; + &quot; if (textInputs.length &gt;= 2) {&quot; + &quot; textInputs[1].value = &#39;&quot; + email + &quot;&#39;;&quot; + &quot; textInputs[1].dispatchEvent(new Event(&#39;input&#39;, { bubbles: true }));&quot; + &quot; filled++;&quot; + &quot; }&quot; + &quot; return { success: true, filled: filled, total: inputs.length };&quot; + &quot;} catch (e) {&quot; + &quot; return { success: false, error: e.message };&quot; + &quot;}&quot; + &quot;})();&quot;; // 尝试在iframe中执行脚本 try { var result = iframe.contentWindow.eval(iframeScript); if (result.success) { if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;在iframe中成功填写了 &#39; + result.filled + &#39;/&#39; + result.total + &#39; 个字段&#39;); } // 尝试提交iframe内的表单 setTimeout(function() { submitIframeForm(iframe); }, 1000); } else { if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;在iframe中执行脚本失败: &#39; + result.error); } // 尝试使用postMessage tryPostMessageCommunication(iframe); } } catch (evalError) { if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;无法在iframe中执行脚本: &#39; + evalError.message); } // 尝试使用postMessage tryPostMessageCommunication(iframe); } } catch (error) { if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;执行iframe脚本时出错: &#39; + error.message); } } } // 提交iframe内的表单 function submitIframeForm(iframe) { try { var iframeScript = &quot;(function() {&quot; + &quot;try {&quot; + &quot; var submitted = false;&quot; + &quot; var buttons = document.querySelectorAll(&#39;input[type=\\\&quot;submit\\\&quot;], button[type=\\\&quot;submit\\\&quot;], button&#39;);&quot; + &quot; for (var i = 0; i &lt; buttons.length; i++) {&quot; + &quot; var text = (buttons[i].textContent || buttons[i].value || &#39;&#39;).toLowerCase();&quot; + &quot; if (text.includes(&#39;submit&#39;) || text.includes(&#39;提交&#39;) || buttons.length === 1) {&quot; + &quot; buttons[i].click();&quot; + &quot; return { success: true, message: &#39;点击提交按钮&#39; };&quot; + &quot; }&quot; + &quot; }&quot; + &quot; var forms = document.querySelectorAll(&#39;form&#39;);&quot; + &quot; if (forms.length &gt; 0) {&quot; + &quot; forms[0].submit();&quot; + &quot; return { success: true, message: &#39;通过form.submit()提交&#39; };&quot; + &quot; }&quot; + &quot; return { success: false, message: &#39;未找到提交方式&#39; };&quot; + &quot;} catch (e) {&quot; + &quot; return { success: false, message: &#39;提交错误: &#39; + e.message };&quot; + &quot;}&quot; + &quot;})();&quot;; var result = iframe.contentWindow.eval(iframeScript); if (result.success) { if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;iframe表单提交: &#39; + result.message); } } else { if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;iframe表单提交失败: &#39; + result.message); } } } catch (error) { if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;提交iframe表单时出错: &#39; + error.message); } } } // 备选方案:通过postMessage与iframe通信 function tryPostMessageCommunication(iframe) { try { // 发送消息给iframe iframe.contentWindow.postMessage({ action: &#39;autofill&#39;, username: &#39;test&#39;, email: &#39;test@qq.com&#39; }, &#39;*&#39;); // 监听iframe的响应 window.addEventListener(&#39;message&#39;, function(event) { if (event.data &amp;&amp; event.data.action === &#39;autofill_result&#39;) { if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;通过postMessage通信结果: &#39; + event.data.message); } } }); } catch (error) { if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;postMessage通信失败: &#39; + error.message); } } } // 原有的表单填写提交函数保持不变 function fillAndSubmitForm(username, email) { try { var filledFields = 0; // 策略1: 尝试所有可能的输入字段 var allInputs = document.querySelectorAll(&#39;input, textarea&#39;); if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;找到 &#39; + allInputs.length + &#39; 个输入字段&#39;); } // 记录所有输入字段的信息 for (var i = 0; i &lt; allInputs.length; i++) { var input = allInputs[i]; var info = &#39;字段[&#39; + i + &#39;]: type=&#39; + input.type + &#39;, id=&#39; + input.id + &#39;, name=&#39; + input.name + &#39;, placeholder=&#39; + input.placeholder + &#39;, class=&#39; + input.className; if (window.Android &amp;&amp; window.Android.log) { window.Android.log(info); } } // 尝试填写所有文本输入框 var textInputs = Array.from(document.querySelectorAll(&#39;input[type=&quot;text&quot;], input:not([type]), textarea&#39;)); if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;找到文本输入框: &#39; + textInputs.length); } if (textInputs.length &gt;= 1) { textInputs[0].value = username; textInputs[0].dispatchEvent(new Event(&#39;input&#39;, { bubbles: true })); filledFields++; if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;已填写用户名到第一个文本字段&#39;); } } if (textInputs.length &gt;= 2) { textInputs[1].value = email; textInputs[1].dispatchEvent(new Event(&#39;input&#39;, { bubbles: true })); filledFields++; if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;已填写邮箱到第二个文本字段&#39;); } } // 尝试填写邮箱类型的输入框 var emailInputs = Array.from(document.querySelectorAll(&#39;input[type=&quot;email&quot;]&#39;)); if (emailInputs.length &gt; 0) { emailInputs[0].value = email; emailInputs[0].dispatchEvent(new Event(&#39;input&#39;, { bubbles: true })); filledFields++; if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;已填写邮箱字段&#39;); } } // 通知填写状态 if (window.Android &amp;&amp; window.Android.onFormFilled) { window.Android.onFormFilled(&#39;成功填写了 &#39; + filledFields + &#39; 个字段&#39;); } if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;自动填写完成,填写了 &#39; + filledFields + &#39; 个字段&#39;); } // 提交表单 setTimeout(function() { submitForm(); }, 1000); } catch (error) { if (window.Android &amp;&amp; window.Android.onFormError) { window.Android.onFormError(&#39;表单填写错误: &#39; + error.message); } } } function submitForm() { try { var submitted = false; // 方法1: 查找并点击所有可能的提交按钮 var allButtons = document.querySelectorAll(&#39;button, input[type=&quot;button&quot;], input[type=&quot;submit&quot;]&#39;); if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;找到按钮: &#39; + allButtons.length); } for (var i = 0; i &lt; allButtons.length; i++) { var button = allButtons[i]; var text = (button.textContent || button.value || &#39;&#39;).toLowerCase(); if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;按钮[&#39; + i + &#39;]: text=&#39; + text); } // 尝试点击任何看起来像提交的按钮 if (text.includes(&#39;submit&#39;) || text.includes(&#39;提交&#39;) || text.includes(&#39;login&#39;) || text.includes(&#39;登录&#39;) || text.includes(&#39;send&#39;) || text.includes(&#39;发送&#39;) || text.includes(&#39;go&#39;) || text.includes(&#39;确认&#39;) || text.includes(&#39;下一步&#39;) || text.includes(&#39;继续&#39;) || allButtons.length === 1) { button.click(); submitted = true; if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;点击按钮: &#39; + text); } break; } } // 方法2: 表单提交 if (!submitted) { var forms = document.querySelectorAll(&#39;form&#39;); if (forms.length &gt; 0) { forms[0].submit(); submitted = true; if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;通过form.submit()提交&#39;); } } } // 方法3: 尝试触发表单的submit事件 if (!submitted) { var forms = document.querySelectorAll(&#39;form&#39;); if (forms.length &gt; 0) { var submitEvent = new Event(&#39;submit&#39;, { bubbles: true }); forms[0].dispatchEvent(submitEvent); submitted = true; if (window.Android &amp;&amp; window.Android.log) { window.Android.log(&#39;触发submit事件&#39;); } } } if (submitted) { if (window.Android &amp;&amp; window.Android.onFormSubmitted) { window.Android.onFormSubmitted(&#39;表单提交成功&#39;); } } else { if (window.Android &amp;&amp; window.Android.onFormError) { window.Android.onFormError(&#39;无法找到提交方式&#39;); } } } catch (error) { if (window.Android &amp;&amp; window.Android.onFormError) { window.Android.onFormError(&#39;提交错误: &#39; + error.message); } } } })(); &quot;&quot;&quot;.trimIndent() evaluateJavascript(autoFillScript) { result -&gt; android.util.Log.d(&quot;WebView&quot;, &quot;JavaScript执行完成&quot;) // 如果没有找到表单元素,尝试重试 if (retryCount &lt; maxRetries) { android.util.Log.d(&quot;WebView&quot;, &quot;准备重试表单填写 (${retryCount + 1}/$maxRetries)&quot;) executeAutoFillScript(retryCount + 1) } } }, 2000) // 延迟2秒确保页面完全加载 }修改该函数,解决2025-10-21 10:27:43.762 16886-16972 WebViewJS com.example.my1020 D 直接访问iframe[0]失败: Failed to read a named property &#39;document&#39; from &#39;Window&#39;: Blocked a frame with origin &quot;https://sophiadesign.buzz&quot; from accessing a cross-origin frame. 2025-10-21 10:27:43.762 16886-16972 WebViewJS com.example.my1020 D iframe[0] src: https://test01.sophiadesign.buzz/test/frame.html这个问题
10-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值