Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Удаление прослушивания события (https://javascript.ru/forum/misc/56995-udalenie-proslushivaniya-sobytiya.html)

Patr56 14.07.2015 15:08

Удаление прослушивания события
 
Приветствую, помогите, знающие люди, как решить проблему?
function some(x, y) {
	console.log(x, y)
}

// Как передать параметры x,y или организовать функцию?
$(window).on ('resize', some);
// Что бы потом спокойно удалить этот handler
$(window).off('resize', some);


Самое простое решение
function some(x, y) {
	console.log(x, y)
}

// Передаю данные в анонимную функцию
$(window).on ('resize', function () {
   some(x, y)
});
// Удаляю все слушатели
$(window).off('resize');

Но хотелось бы удалить конкретную функцию

jackdempsey2015 14.07.2015 15:26

Patr56,
скорей всего жеквери использует нативные JS-переменные. Попробуйте onresize=null. Если не получиться, используйте вместо $(window).on... onresize=some

Patr56 14.07.2015 15:41

Решение примерно такое получилось, с замыканием
function someGloba() {
    "use strict";
    console.log('someGlobal start');
    var x;
    var y;
    function getX() {
        return x;
    }
    function getY() {
        return y;
    }
    function setY(value) {
        y = value;
    }
    function setX(value) {
        x = value;
    }
    return {
        getX: getX,
        getY: getY,
        setY: setY,
        setX: setX
    };
}

var someGlobal = someGloba();

function some(x, y) {
    console.log(x, y)
}
function someWrap(event) {
  some(someGlobal.getX(), someGlobal.getY())
}

someGlobal.setX(x);
someGlobal.setY(y);

$(window).on ('resize', someWrap);

$(window).off('resize', someWrap);

jackdempsey2015 14.07.2015 15:57

Patr56,
Дело конечно ваше, но Ваше решение не особо гибкое. нет возможности свободно удалять и добавлять обработчики. Я бы на вашем месте сделал как-то так
<html>


<button onclick="window.onresize()">
 test
</button>
<button onclick="window.handlers.remove(alert1)">
 remove
</button>

<script>



Handlers=function(){this.handlers=[]}
Handlers.prototype={
 remove: function(handler){this.handlers=this.handlers.filter(function(h){return handler!==h})},
 add: function(handler){this.handlers.push(handler)},
 call: function(){this.handlers.forEach(function(handler){handler()})}
}
handlers=new Handlers
alert1=function(){alert(1)}
alert2=function(){alert(2)}

handlers.add(alert1)
handlers.add(alert2)

onresize=function(){handlers.call()}

</script>
</html>

nerv_ 14.07.2015 16:10

Цитата:

Сообщение от Patr56
Как передать параметры x,y

очевидно, почитать документацию

Patr56 14.07.2015 16:57

nerv_,
Спасибо большое, отличное решение :)


Часовой пояс GMT +3, время: 08:26.