我正在开发一个cordova应用程序,在其中,我使用的是iFrame。我使用以下代码在iFrame和应用程序本身之间进行通信:
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
var message = "";
var output = "";
eventer(messageEvent, function(e) {
message = e.data;
var data = JSON.parse(message);
for (var i = 0; i < data.messages.length; i++){
var msg = data.messages[i];
output = msg.msg;
alert(output); //*1
}
}, false);
我从这里复制代码:https://davidwalsh.name/window-iframe
* 1中的偶数内的警报显示输出变量是我想要的。但是,一旦超出此均衡功能,变量输出将恢复为空白。
经过一番研究后,我认为这可能是因为我正在创建一个Window对象,但我不确定是不是这种情况,也不确定它是什么。
如何透明地修改变量&#34;输出&#34;?感谢。
答案 0 :(得分:0)
尝试将for循环更改为:
for (var i = 0; i < data.messages.length; i++){
var dataMsg = data.messages[i].msg;
output = dataMsg; alert(output); //*1
}
我不知道将msg.msg分配给输出是否存在问题。
答案 1 :(得分:0)
问题在于您对事件如何运作的理解。
从您的评论来看,这就是您认为它的工作原理:
// Ordering
var output = ""; // 1. Assign empty string to output
eventer(messageEvent, function(e) {
// assign value to output // 2. Assign value to output
});
alert(output); // 3. Print output
实际上,它的工作原理如下:
var output = ""; // 1. Assign empty string to output
eventer(messageEvent, function(e) {
// assign value to output // 3. Assign value to output
});
alert(output); // 2. Print output
您的回调函数更改了值 ,但您以错误的顺序访问它。 eventer
,或在现代浏览器中,.addEventListener
,注册一个回调函数。您的回调函数只会在当前线程完成后触发。当然,它会打印出一个空值,因为alert
在您更改其值之前执行。
如果您不熟悉基于事件的编程基础知识,建议您查看this tutorial。
只是旁注,除非您有特定理由这样做,否则永远不要使用iframe
。而且,由于您使用Cordova,因此您不需要前几行。 attachEvent
是特定于IE的。
作为一般性建议,尽量不要在未来用不必要的变量污染全球范围。