Javascript/Prototype在一个字段中添加两个事件处理程序,而我只需要一个

Javascript/Prototype在一个字段中添加两个事件处理程序,而我只需要一个,javascript,prototypejs,Javascript,Prototypejs,我使用prototype将事件处理程序附加到许多表单字段。表单字段名为“ContactAddress”、“ContactCity”、“ContactState”、“ContactZip”,以及另一组以“ContactProfile”开头的字段。现在,事件需要能够区分我更新“Contact”字段和“ContactProfile”字段时的区别,因此我有一个如下工作的数据结构和代码: var geos = { 'Contact' : [ 'Address', 'City', '

我使用prototype将事件处理程序附加到许多表单字段。表单字段名为“ContactAddress”、“ContactCity”、“ContactState”、“ContactZip”,以及另一组以“ContactProfile”开头的字段。现在,事件需要能够区分我更新“Contact”字段和“ContactProfile”字段时的区别,因此我有一个如下工作的数据结构和代码:

var geos = {
    'Contact' : [
        'Address', 'City', 'State', 'Zip'
    ],
    'ContactProfile' : [
        'Address', 'City', 'State', 'Zip'
    ]
};
// Called on page load
function watchGeo() {
    for(prefix in geos) {
        geos[prefix].each(function(item) {
            $(prefix + item).observe('change', function() {ajaxgeolocate(prefix, item);});
        })
    }
}
// Doesn't actually geolocate anything yet, just tells me that the event works and what params got passed.
function ajaxgeolocate(prefix, suffix) {
    alert(prefix + " " + suffix);
}
加载页面时,当我更改其中一个ContactProfile字段时,它会给我一个警告框,上面写着“ContactProfile地址”(例如),就像它应该的那样。但是,如果我更改其中一个联系人字段,它会给我一个警告框,上面还会显示“ContactProfile Address”。出于好奇,我检查了该字段,发现所有联系人字段中都添加了两个事件处理程序,而不是一个。ContactProfile字段都应该有一个事件

这里发生了什么事?

发生在这里:

function watchGeo() {
    for(prefix in geos) {
        geos[prefix].each(function(item) {
            //alert($(prefix + item))
            $(prefix + item).observe('change', function() {ajaxgeolocate(prefix, item);});
        })
    }
}
变量“prefix”是“watchGeo”的成员,包含在传递给.each()的闭包函数中。但是,当到达第二个前缀时,第一个前缀将在传递给.each()的所有以前的闭包中被覆盖

更糟糕的是,“prefix”变成了一个全局变量,因为您从未在函数范围内声明它

尝试:


如果是这样的话,为什么每个字段上没有两个事件处理程序呢;奥帕,这很有见地。事实上,我在一两天前已经“修复”了它,展开了循环并分别打了八个电话,但这很有见地。无意冒犯,我感谢你的最终回答,但你在我发布后一两分钟内就回答了我的问题,乍一看,我觉得你根本就没有理解这个问题。在我的头撞了几次墙之后,我终于打开了线圈,有几天没有再检查,所以直到现在我才看到你的最终反应。尽管如此,我还是很感激你付出了额外的努力来得到一个正确的答案,因此你会得到一个接受
function appendGeoWatcher(prefix, item) {
    $(prefix + item).observe('change', function() {ajaxgeolocate(prefix, item);});
}

function watchGeo() {
    for(var prefix in geos) { // var prefix, keeps it local.
        geos[prefix].each(function(item) {
            appendGeoWatcher(prefix, item)
        });
    }
}