2010-01-08 2 views
1

У меня есть этот код:Динамическое назначение функции onclick с динамическими параметрами в JavaScript?

document.getElementById('img'+i).onclick = function(){popup_show('popup',array_msg[i]+'|||'+date('Y-m-d',strtotime(lec_date))+'-==-'+str_view_forConflict, 'AddEditSchedule;;popup_drag2;;EditSched;;'+String(array_msg_id[3])+';;view', 'popup_drag', 'popup_exit', 'screen-center', 0, 0);}; 

... но когда я нажимаю на изображении, данные array_msg[i] являются последними данными цикла, то есть индекс длина цикла. Для этого я использую IE.

Пожалуйста, дайте мне представление о том, как это сделать. В FF он отлично работает, потому что я использую setAttribute.

@bobince

document.getElementById('img'+i).onclick= popup_show.bind(window, 'popup',array_msg[i]+'|||'+date('Y-m-d',strtotime(lec_date))+'-==-'+str_view_forConflict,'AddEditSchedule;;popup_drag2;;EditSched;;'+array_msg_id[3]+';;view','popup_drag', 'popup_exit', 'screen-center', 0, 0 ); 
       if (!('bind' in Function.prototype)) { 
        Function.prototype.bind= function(owner) { 
         var that= this; 
         var args= Array.prototype.slice.call(arguments, 1); 
         return function() { 
          return that.apply(owner, 
           args.length===0? arguments : arguments.length===0? args : 
           args.concat(Array.prototype.slice.call(arguments, 0)) 
          ); 
         }; 
        }; 
       } 

ответ

2

Treby, это очищенная версия вашего ответа. Дополнительная анонимная анонимная функция, которую вы добавили, не требуется.

for (var i = 0, l = array.length; i < l; i++) { 
    document.getElementById(i + '05').onclick = (function(tmp) { 
    return function() { 
     popup_show(
     "popup", 
     array_msg[tmp] + '|||' + date('Y-m-d', strtotime(lec_date)) + '-==-' + str_view_forConflict, 
     "AddEditSchedule;;popup_drag2;;EditSched;;" + String(array_msg_id[3]) + ";;view", 
     "popup_drag", "popup_exit", "screen-center", 0, 0 
    ); 
    }; 
    })(i); 
} 

Edited исправить проблему

+0

есть ошибка: «tmp не определен» – Treby

+0

Упс, исправлено. –

+0

у вас есть .. голосуйте за мой вопрос .. спасибо .. – Treby

2

Вы должны использовать closure. Это поможет, если вы предоставили код цикла, а также код, который выполняется в цикле, но если у вас есть стандартный for цикла итерации через массив, следующий код должен работать:

for (var i = 0, l = array.length; i < l; i++) 
{ 
    (function(i) { 
     document.getElementById("img" + i).addEventListener("click", function() { 
      popup_show("popup", array_msg[i] + "|||" + date("Y-m-d", strtotime(lec_date)) + "-==-" + str_view_forConflict, "AddEditSchedule;;popup_drag2;;EditSched;;" + String(array_msg_id[3]) + ";;view", "popup_drag", "popup_exit", "screen-center", 0, 0); 
     }, false); 
    })(i); 
} 

Кроме того, вы не следует использовать setAttribute в Firefox. Вместо этого используйте element.onclick или, предпочтительно, element.addEventListener, что позволяет добавлять несколько функций для вызова при возникновении события и, таким образом, это хорошо играет с другим кодом (если два бита кода назначают функцию, например, событие click в форма element.onclick = function() { ..., то второе присваивание отменяет первое, а не хорошее). Я использовал element.addEventListener в моем примере кода выше.

+0

закрытия, что вы предлагаете использовать то? .по щелчку?? – Treby

+0

Да. 'onclick' совместим с кросс-браузерами, начиная более десятилетия. На самом деле это IE, а не Firefox, который неправильно выполняет функцию setAttribute; в любом случае вы никогда не должны использовать 'setAttribute' в HTML-документе. (Он по-прежнему используется в XML.) – bobince

+0

как это сделать .. то же, что и с моим кодом IE .. – Treby

2

Вы попали в проблему с закрытием цикла. Это очень распространенный вопрос в языках C-стиля с закрытием, например JavaScript и Python. См. Принятый ответ this question для решения, связывающего переменные цикла во втором закрытии.

Несколько менее вложенным решением является использование function.bind():

for (var i= 0; i<something.length; i++) { 
    document.getElementById('img'+i).onclick= popup_show.bind(window, 'popup', 
     array_msg[i]+'|||'+date('Y-m-d',strtotime(lec_date))+'-==-'+str_view_forConflict, 
     'AddEditSchedule;;popup_drag2;;EditSched;;'+array_msg_id[3]+';;view', 
     'popup_drag', 'popup_exit', 'screen-center', 0, 0 
    ); 
} 

однако, поскольку этот метод является ECMAScript Fifth Edition функция не поддерживается большинством браузеров пока она нуждается в небольшой помощи - см в нижней части this answer для обратная совместимость.

+0

я есть ошибка детали произойдет ошибка Сообщение: 'нулевой' равно нулю или не является объектом Line: 261 Char: 3 Код: 0 строка 261 относится к document.getElementById (; popup_drag;) ['target'] = id; – Treby

+0

Невозможно сказать без кода этой функции, но он ищет элемент с заданным ID и не находит его. Я не знаю, что там делают точки с запятой; если бы в вашем исходном коде действительно было что-то вроде синтаксической ошибки и не запускалось вообще. – bobince

+0

проверить мой вопрос: это то, что я сделал – Treby

1

Закрытие. Вам нужно использовать закрытие JavaScript. См. Ответы на вопросы this question.

-1

Работа Ответ:

var closures = []; 
for (var i = 0; i < array.length; i++){ 
    closures[i] = (function(tmp) { 
     return function() { 
     document.getElementById(tmp + '05').onclick = function(){popup_show("popup", array_msg[tmp]+'|||'+date('Y-m-d',strtotime(lec_date))+'-==-'+str_view_forConflict, "AddEditSchedule;;popup_drag2;;EditSched;;"+ String(array_msg_id[3]) +";;view", "popup_drag", "popup_exit", "screen-center", 0, 0)}; 
     }; 
})(i); 

    closures[i](); 
} 

Благодаря Steve Harrison Ответ. У меня есть идея обернуть его

+0

Для этого проголосовать за голос Steve Harrison – Treby

+0

Если на вопрос ответили, отметьте его как таковой. Заметка о коде: вероятно, нет причин сохранять ссылки на каждое закрытие. См. Мой ответ для пересмотренной версии того, что у вас есть. –

+0

Не решение. –

Смежные вопросы