无法在Window对象中更改变量

时间:2017-04-17 03:51:34

标签: javascript cordova

我正在开发一个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;?感谢。

2 个答案:

答案 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的。

作为一般性建议,尽量不要在未来用不必要的变量污染全球范围。