Выполнение следующих команд в таком порядке устранило проблему для меня:
cordova plugin rm cordova-plugin-compat --force --save
cordova plugin add cordova-plugin-compat@1.2 --save
rm -rf ~/.gradle/caches/*
cd platforms/android -> gradlew clean
Необходимо использовать этот небольшой прием закрытия - создают и выполняют функцию, которая возвращает функцию обработчика событий.
var links = [ 'one', 'two', 'three' ];
for( var i = 0; i < links.length; i++ ) {
var a = document.createElement( 'div' );
a.innerHTML = links[i];
a.onclick = (function(i) { return function() { alert( i ) } })(i);
document.body.appendChild( a );
}
Я рекомендую Christophs путь с одной функцией, так как это использует меньше ресурсов.
Ниже иначе, который хранит значение на функции (который возможен, потому что функция является объектом), и пользователи argument.callee для получения ссылки на функцию в функции. В этом случае это не имеет большого смысла, но я показываю технику, так как это может быть полезно другими способами:
var links = [ 'one', 'two', 'three' ];
for( var i = 0; i < links.length; i++ ) {
var a = document.createElement( 'div' );
a.innerHTML = links[i];
a.onclick = function() { alert( arguments.callee.i ) }
a.onclick.i = i;
document.body.appendChild( a );
}
Техника полезна, когда Ваша функция должна хранить персистентную информацию между вызовами. Замените часть выше этим:
a.id="div"+i;
a.onclick = function() {
var me = arguments.callee;
me.count=(me.count|0) + 1;
alert( me.i );
}
и можно позже получить, сколько раз это назвали:
for( var i = 0; i < links.length; i++ ){
alert(document.getElementById("div"+i).onclick.count);
}
Это может также привыкнуть к информации о кэше между вызовами.
Я остался бы с Вашим собственным решением, но изменил бы его следующим образом:
var links = [ 'one', 'two', 'three' ];
function handler() {
alert( this.i );
}
for( var i = 0; i < links.length; i++ ) {
var a = document.createElement( 'div' );
a.innerHTML = links[i];
a.i = i; //set a property of the current element with the current value of i
a.onclick = handler;
document.body.appendChild( a );
}
Таким образом, только один функциональный объект создается - иначе, функциональный литерал будет оценен на каждом итеративном шаге!
Решение через закрытие еще хуже мудрый производительностью, чем Ваш исходный код.
Метод RoBorg является определенно способом пойти, но мне нравится немного отличающийся синтаксис. Оба выполняют то же самое создания закрытия, которое сохраняет 'меня', этот синтаксис просто более ясен мне и требует меньшего количества модификации Вашего существующего кода:
var связывается = ['один', 'два', 'три'];
for( var i = 0; i < links.length; i++ ) (function(i) {
var a = document.createElement( 'div' );
a.innerHTML = links[i];
a.onclick = function() { alert( i ) }
document.body.appendChild( a );
})(i);