Estou tentando selecionar o campo de email neste formulário de reserva de iframe. Eventualmente, quero fazer outra coisa com o campo, mas por enquanto, como teste, só quero selecionar o elemento e alterar o espaço reservado.
Obtendo este erro para que eu não o selecione corretamente: TypeError não capturado: Não é possível definir a propriedade 'espaço reservado' de null em HTMLButtonElement.changeCopy
Você pode visualizar uma versão ao vivo do meu código aqui e ver o erro no console ao clicar no botão na parte superior: https://finnpegler.github.io/cart_recover/
Também incluí o código como um trecho abaixo, mas gera um erro diferente relacionado aos quadros de origem cruzada.
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>
javascript
dom
iframe
FinnPegler
fonte
fonte
Respostas:
O motivo pelo qual o campo é nulo é que, quando a variável foi configurada, o valor foi bloqueado. Tente abrir seu console JavaScript na página e cole
Como na fonte, que deve funcionar, mas veja o que acontece quando você entra:
Você deve receber algo como o seguinte erro:
Portanto, o problema não é
field.placeholder = "hello";
ser nulo, pois esse campo nunca foi definido porque foi bloqueado de uma origem de origem cruzada.A maneira de corrigir isso: se você tiver acesso a https://bettercleans.launch27.com/?w_cleaning&iframe_id=j8szoz0b4 , em algum lugar da fonte dessa página, digite o seguinte script:
Em sua fonte da página https://finnpegler.github.io/cart_recover/ , em algum lugar, digite o código:
Aviso: código não testado, mas aqui está a idéia básica: com o JavaScript do lado do cliente, você não pode editar diretamente os elementos de um iframe; portanto, a maneira de se comunicar com ele é enviar uma mensagem para o iframe usando iframe.contentWindow.postMessage. No lado do iframe, você pode ler a mensagem que está chegando com o ouvinte "message" do ouvinte de eventos (ou pode fazer window.onmessage). Em seguida, você pode enviar dados ou texto JSON como uma mensagem para o iframe e lê-lo com e.data. Portanto, no exemplo acima (não testado), quando a página principal do github deseja alterar o valor do espaço reservado para uma quantidade específica, ela simplesmente envia um objeto JSON que contém os dados do espaço reservado para o iframe e, em seguida, no lado da fonte do iframe, lê essa mensagem recebida, verifica o JSON se ele possui a chave definida para definir o espaço reservado e, se possui essa chave,
Entre em contato se tiver mais alguma dúvida.
Aqui estão algumas referências:
https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage https://blog.teamtreehouse.com/cross-domain-messaging-with-postmessage https://javascript.info/ comunicação entre janelas 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
fonte
Primeiro, vamos esclarecer o que realmente está acontecendo. Para ajudar na análise, modifiquei seu script sem introduzir nenhum efeito colateral da seguinte maneira:
O carregamento do documento com o script acima provou o seguinte resultado:
O que aprendemos com o resultado?
Antes de clicar no botão,
iframe.contentWindow.document.querySelector( "booking[email]" )
avalia comonull
. Portanto, a variávelfield
era essencialmentenull
.Por que
iframe.contentWindow.document.querySelector( "booking[email]" )
avaliarnull
antes de clicar no botão ?iframe
documento não foi carregado, o navegador (Safari) considerou subótimo executar políticas de segurança entre os quadros pai e filho.Até o momento eu pressionado no Click botão, o
document
de#booking-widget-iframe
(quadro filho) tinha carregado completamente, e aplicação de políticas de segurança entre o pai ea criança quadros foi habilitado. Conseqüentemente, a tentativa de acessoiframe.contentWindow
foi prontamente bloqueada devido à falha na conformidade com a política de quadros de origem cruzada.Possíveis resoluções:
domain
(por exemplo, https://bettercleans.launch27.com ) eport
(irrelevante para o caso em consideração )Supondo que você possa aplicar a resolução, há outro problema que deve aparecer 🙂.
iframe.contentWindow.document.querySelector("booking[email]")
ainda serianull
. A causa raiz do problema subsequente deveu-se a nenhum elemento nomeadobooking
encontrado no documento de destino. Em outras palavras, o seletor"booking[email]"
está errado.fonte