#javascript #post #iframe
#javascript #Публикация #iframe
Вопрос:
Как передать переменную через postMessage. Я могу вызвать родительскую функцию следующим образом:
function parent_goTopPage() {
window.parent.postMessage({"func": "goTopPage"}, "*");
}
Но не нашел способа передать переменную в функции. Например, переменная myvar в родительской функции checkVar:
function checkVar(myvar) {
alert(myvar);
}
Следующий javascript не работает:
function parent_checkVar(myvar) {
window.parent.postMessage({"func": "checkVar(" myvar "}, "*");
}
Редактировать
Я, наконец, понял, что у меня уже была такая возможность с опцией «сообщение» window[data.func].call(null, data.message);
В родительском окне:
function checkVar(myvar) {
alert(myvar);
}
window.addEventListener("message", onMessage, false);
function onMessage(event) {
// Check sender origin to be trusted
if (event.origin !== "https://example.com") {
alert("Error Cross-origin onMessage.");
return;
};
var data = event.data;
if (typeof(window[data.func]) == "function") {
window[data.func].call(null, data.message);
}
}
Внутри iframe:
function parent_checkVar(myvar) {
window.parent.postMessage({"func": "checkVar", "message":myvar}, "*");
}
parent_checkVar(3);
Выбор «сообщения» был мне не очень понятен, я изменил его на var1 только в (родительских окнах):
window[data.func].call(null, data.var1);
И далее (iframe):
window.parent.postMessage({"func": "checkVar", "var1":myvar}, "*");
С выбором «сообщение» произошло недоразумение с этой строкой (родительское окно) window.addEventListener("message", onMessage, false);
. "message"
должно оставаться с этим именем.
Ответ №1:
Во-первых, опубликованный вами JavaScript содержит искаженный объект. Это должно быть {"func": "checkVar(" myvar ")"}
Во-вторых, хотя вы и не опубликовали его, я почти уверен, что вы хотите использовать eval()
for checkVar(myVar)
. Вместо этого вы можете создать объект и назначить функцию с ключевым именем «checkVar». Когда вы сделаете это, вы можете передать переменную checkVar отдельно и вызвать функцию, используя объект. Вы можете увидеть пример ниже:
Передайте дополнительный ключ / значение с вашим объектом. Я добавил "thisvar":myvar
.
window.parent.postMessage({"func": "checkVar", "thisvar":myvar}, "*");
На вашем слушателе вы создаете объект с вашей функцией внутри него.
var postFunctions = {
'checkVar': function(myvar) {window.alert(myvar);}
}
window.addEventListener('message', function(event) {
// checks if the function "checkVar" exists inside the "postFunctions" object
if (postFunctions[event.data.func]) {
// if it does exist, call that function and pass the variable as an argument
postFunctions[event.data.func](event.data.thisvar);
}
});
Комментарии:
1. Я взял этот код из примера и не все понял, но с вашим кодом я наконец понял, что у меня уже была такая возможность с опцией «сообщение»
window[data.func].call(null, data.message);