javascript - 将事件监听器传递给事件监听器?

标签 javascript events titanium-mobile

我有一个从远程源填充的 tableView。我在每行动态添加几个按钮,每行的按钮和内容都在 for 循环中。我在按钮监听器中有一个警报对话框监听器。一旦出现此消息,如果选择确认(是),我希望能够更改按钮标题。

我收到以下错误:

        Uncaught TypeError: Cannot set property 'title' of undefined.

这是错误的根源:

        btn[i].title = "Finish" 

抱歉,我目前无法访问代码,也没有提供太多可使用的内容,但任何帮助/想法将不胜感激......

编辑:

虚拟代码:

        var btn = new Array();

        btn[i] = Ti.UI.createButton({
            backgroundImage: '/images/button.png',
            title:'Start',
            top: 0,
            left: 0,
            height: '20%',
            width: '20%'
        });

        btn[i].addEventListener('click', function(e){
            var alert = Titanium.UI.createAlertDialog({
                title : 'Dialog',
                message : 'Change Title',
                buttonNames : ['Yes', 'No']
            });
            alert.addEventListener('click', function(e) {
                if(e.index == 0) {
                    btn[i].title = "Finish";
                }
            });
            alert.show();
        });                                         
        tableViewRow.add(btn[i]);

最佳答案

某个地方有一个像这样的 for 循环:

for( i = 0;  i < btn.length;  i++ ) {
    // do stuff with btn[i]
}

将其更改为:

for( i = 0;  i < btn.length;  i++ ) {
    addButton( btn[i] );
}

function addButton( button ) {
    // do stuff with button
}

addButton() 函数的主体将是 for 循环中的所有代码,但有一点不同:btn[i ] 将其更改为按钮

通过将此代码移动到函数中,您可以创建一个“闭包”,它可以根据需要保留 button 变量的值,这与 btn[i]< 的原始代码不同。/code> 循环运行结束后无效。

请记住,事件监听器是在设置事件监听器的原始代码完成后很长时间才被调用的。如果您在事件监听器中使用循环索引,则该索引值不是您期望的值。该闭包以一种非常干净和简单的方式修复了这个问题。

您在评论中提到您还需要循环索引。在这种情况下,您可以这样做:

for( i = 0;  i < btn.length;  i++ ) {
    addButton( i );
}

function addButton( i ) {
    // do stuff with btn[i]
}

事实上,现在您不必更改循环体/函数体中的任何代码。您仍然可以像以前一样使用 btn[i]

或者,您可以这样做:

for( i = 0;  i < btn.length;  i++ ) {
    addButton( button, i );
}

function addButton( button, i ) {
    // do stuff with button (instead of btn[i]) and i where needed
}

现在您可以将 addButton() 函数内的所有 btn[i] 引用替换为 button,如第一个示例所示,并且当您需要时,您仍然可以使用i

关于javascript - 将事件监听器传递给事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17265595/

相关文章:

javascript - jQuery:如何获取外部图像的尺寸?

javascript - 如何根据共同值对数组进行分组?

android - Titanium android 设备 http 错误

javascript - 将一个类添加到所有下一个元素,直到有类的子元素

javascript - 如何在android中将文件从webview发送到javascript

java - Hibernate 启用 PostLoad 事件

javascript - 如何在JS中捕获<body>元素内容的所有更改

javascript - e.stopPropagation 不工作

javascript - 将 onload 函数的结果传递给变量

javascript - 如何隐藏/显示钛合金文本字段?