Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Попробуйте:
if (_checkbox.addEventListener) {
_checkbox.addEventListener("click", setCheckedValues, false);
}
else {
_checkbox.attachEvent("onclick", setCheckedValues);
}
Обновление :: Для версий Internet Explorer до IE9, метод attachEvent должен использоваться для регистрации указанного прослушивателя в EventTarget вызывается, для других следует использовать addEventListener .
Вы можете использовать следующую функцию addEvent () для добавления событий для большинства вещей, но обратите внимание, что для XMLHttpRequest if (el.attachEvent)
не будет работать в IE8, потому что она не поддерживает XMLHttpRequest.attachEvent()
, поэтому вам нужно использовать XMLHttpRequest.onload = function() {}
.
function addEvent(el, e, f) {
if (el.attachEvent) {
return el.attachEvent('on'+e, f);
}
else {
return el.addEventListener(e, f, false);
}
}
var ajax = new XMLHttpRequest();
ajax.onload = function(e) {
}
Я выбрал быстрый Polyfill, основанный на приведенных выше ответах:
//# Polyfill
window.addEventListener = window.addEventListener || function (e, f) { window.attachEvent('on' + e, f); };
//# Standard usage
window.addEventListener("message", function(){ /*...*/ }, false);
Конечно, как и ответы выше, это не гарантирует существование window.attachEvent
, что может или не может быть проблемой.
Вы должны использовать attachEvent
в версиях IE до IE9. Определите, определен ли addEventListener
, и используйте attachEvent
, если это не так:
if(_checkbox.addEventListener)
_checkbox.addEventListener("click",setCheckedValues,false);
else
_checkbox.attachEvent("onclick",setCheckedValues);
// ^^ -- onclick, not click
Обратите внимание, что IE11 удалит attachEvent
.
См. Также:
Mayb проще (и имеет большую производительность), если вы делегируете обработку события другому элементу, например вашей таблице
$('idOfYourTable').on("click", "input:checkbox", function(){
});
, таким образом у вас будет только один обработчик событий, и это будет работа также для вновь добавленных элементов. Для этого требуется jQuery> = 1.7
В противном случае используйте делегат ()
$('idOfYourTable').delegate("input:checkbox", "click", function(){
});
Если вы используете jQuery, вы можете написать:
$( _checkbox ).click( function( e ){ /*process event here*/ } )
if (document.addEventListener) {
document.addEventListener("click", attachEvent, false);
}
else {
document.attachEvent("onclick", attachEvent);
}
function attachEvent(ev) {
var target = ev.target || ev.srcElement;
// custom code
}
Это также простое решение для кроссбраузеров:
var addEvent = window.attachEvent||window.addEventListener;
var event = window.attachEvent ? 'onclick' : 'click';
addEvent(event, function(){
alert('Hello!')
});
Вместо «щелчка» может быть любое событие, конечно.
addEventListener
является необязательным, так что это может быть хорошим решением, и это лучше, чем ветви if-else. Но в этом случае _checkbox
является целевым элементом, а не window
. :) Итак, возможно, вы могли бы создать функцию, в которой целью события является другой аргумент.
– Sk8erPeter
19 May 2013 в 00:09
addEventListener
- см. Этот раздел: stackoverflow.com/questions/1007340/… . Таким образом, для объекта window
он работает правильно, но не работает для других узлов внутри документа. Таким образом, ваше предложенное наложение не верно для случая, упомянутого в исходном вопросе! Каким будет ваш обход?
– Sk8erPeter
19 May 2013 в 00:59
IE не поддерживает addEventListener
до версии 9, поэтому вы должны использовать attachEvent
, вот пример:
if (!someElement.addEventListener) {
_checkbox.attachEvent("onclick", setCheckedValues);
}
else {
_checkbox.addEventListener("click", setCheckedValues, false);
}