gpt4 book ai didi

javascript - 在 iframe 预订表单中选择元素时出现问题

转载 作者:行者123 更新时间:2023-12-01 15:03:36 26 4
gpt4 key购买 nike

我正在尝试在此 iframe 预订表格中选择电子邮件字段。我最终想对该字段做其他事情,但现在作为测试,我只想选择元素并更改占位符。

收到此错误,所以我没有正确选择它:
未捕获的类型错误:无法在 HTMLButtonElement.changeCopy 处设置 null 的属性“占位符”

您可以在此处查看我的代码的实时版本,并在单击顶部的按钮时在控制台中查看错误:https://finnpegler.github.io/cart_recover/

我还将代码作为片段包含在下面,但它会引发与跨源帧有关的不同错误。

var iframe = document.getElementById("booking-widget-iframe");
var field = iframe.contentWindow.document.querySelector("booking[email]");

function changeCopy() {
field.placeholder = "hello";
}

document.getElementById("button").addEventListener("click", changeCopy)
<!DOCTYPE html>
<html lang="en">
<head>
<title>Test site for Cart Recover Tool</title>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" media="screen" href="stylesheet.css" />
<link href="https://fonts.googleapis.com/css?family=Bree+Serif|Open+Sans&display=swap" rel="stylesheet">
<link rel="icon" href="favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
Clicking this button should change the placeholder text in the email field below
<button id = "button">Click</button>
</body>

<script src="https://bettercleans.launch27.com/jsbundle"></script><iframe id="booking-widget-iframe" src="https://bettercleans.launch27.com/?w_cleaning" style="border:none;width:100%;min-height:2739px;overflow:hidden" scrolling="no"></iframe>
<script src="script.js"></script>

最佳答案

field 为 null 的原因是因为在设置变量时,值被阻塞了。
尝试在页面上打开 JavaScript 控制台并粘贴

var iframe = document.getElementById("booking-widget-iframe");

就像在源代码中一样,它应该可以工作,但是然后看看当你输入时会发生什么:
var field = iframe.contentWindow.document.querySelector("booking[email]");

您应该得到类似以下错误的信息:
Uncaught DOMException: Blocked a frame with origin "https://finnpegler.github.io" from accessing a cross-origin frame.
at <anonymous>:1:34

所以问题不在于 field.placeholder = "hello";为空,就是该字段从未设置,因为它被跨域源阻止。

解决这个问题的方法:
如果您有权访问 https://bettercleans.launch27.com/?w_cleaning&iframe_id=j8szoz0b4 ,然后在该页面源的某处,输入以下脚本:
<script>
addEventListener("message", function(e) {
console.log(e.data);
if(e.data["setIt"]) {
document.querySelector("booking[email]").placeholder = e.data["setIt"];
e.source.postMessage({
hi:"I did it"
});
}

});


</script>

然后在您的 https://finnpegler.github.io/cart_recover/ 上页面源在某处,输入代码:
<script>
var iframe;
addEventListener("load", function() {
iframe = document.getElementById("booking-widget-iframe");
iframe.contentWindow.postMessage({
setIt: "hello"
});

});
addEventListener("message", function(e) {
console.log(e);
})
</script>

警告:未经测试的代码,但这是基本思想:
使用客户端 JavaScript,您不能直接编辑 iframe 的元素,因此与其通信的方式是使用 iframe.contentWindow.postMessage 向 iframe 发送消息。在 iframe 方面,您可以读取与事件监听器“消息”一起传入的消息(或者您可以执行 window.onmessage)。然后您可以将 JSON 数据或文本作为消息发送到 iframe,并使用 e.data 读取它。
所以在上面(未经测试)的例子中,当主 github 页面想要将占位符的值更改为特定数量时,它只是将包含占位符数据的 JSON 对象发送到 iframe,然后在 iframe 源端,它读取该传入消息,检查 JSON 是否具有用于设置占位符的设置键,如果具有该键,则将占位符的值设置为该属性的值。

如果您还有其他问题,请告诉我。

这里有一些引用:

https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
https://blog.teamtreehouse.com/cross-domain-messaging-with-postmessage
https://javascript.info/cross-window-communication
https://bl.ocks.org/pbojinov/8965299
https://www.ilearnjavascript.com/plainjs-postmessage-and-iframes/
https://medium.com/@Farzad_YZ/cross-domain-iframe-parent-communication-403912fff692

关于javascript - 在 iframe 预订表单中选择元素时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59779120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com