Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2012, 16:23   #1
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию Сохранение переменой после выполнения функции

Ситуация следующая. Работаю с динамическим созданием/удалением событий. Необходимо удалять конкретные привязанные события.

Простейший пример логики (хоть он на jquery, но смысл понятен):
Код:
// Имеем две функции
var foo = function() {
alert("Раз");
};
var boo = function() {
alert("Два");
};
// Привязываем к одному элементу оба события
$('#test').bind('mouseup',foo).bind('mouseup',foo);
// Если сейчас нажать на элемент, то мы увидим два сообщения - "Раз" и "Два"

// Удалим одно из них 
$('#test').unbind('mouseup',foo);
// Если сейчас нажать на элемент, то мы увидим одно сообщение - "Два"
Приём знакомый большинству профессионалов. Тут всё прекрасно работает, если область видимости глобальная. Но мне требуется выполнить подобные манипуляции в отдельной функции.

Пример логики, как мне нужно:
Код:
function buf() {
// Удаляем предыдущие привязанные события
$('#test').unbind('mouseup',foo);
var foo = function() {
alert("Раз");
};
// Устанавливаем новые
$('#test').bind('mouseup',foo);
}
Здесь переменая-функция foo уже не глобальная. Из-за этого unbind('mouseup',foo) не срабатывает и, как результат, после нескольких вызовов внешней функции buf() мы имеем на элементе несколько привязанных событий foo (при нажатии выскочит несколько сообщений).

Подозреваю, что необходимо использовать замыкания для сохранения состояния переменныой-функции foo. Но как это записать никак не пойму.
Виталий Желтяков вне форума Ответить с цитированием
Старый 24.03.2012, 16:31   #2
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Код HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script language="JavaScript" src="http://jqbook.narod.ru/jquery-1.2.6.js"></script>
<script>
// Имеем две функции
var foo = function() {
alert("Раз");
};
var boo = function() {
alert("Два");
};
$(document).ready(function(){

	// Привязываем к одному элементу оба события
	$('#test').bind('mouseup',foo).bind('mouseup',boo);
	// Если сейчас нажать на элемент, то мы увидим два сообщения - "Раз" и "Два"
	
});

function del() {
	$('#test').unbind('mouseup',foo);
}

function buf() {
// Удаляем предыдущие привязанные события
$('#test').unbind('mouseup',foo); // foo глобальна
var foo100500 = function() { // foo100500 не глобальна
alert("Раз 100500");
};
// Устанавливаем новые
$('#test').bind('mouseup',foo100500);
}

</script>
</head>
<body>
<span id="test">нажми на меня</span>

<a href="#" onClick="del()">Удалить</a><br>
<a href="#" onClick="buf()">Buf click</a>
</body>
</html>

Последний раз редактировалось Lesha; 24.03.2012 в 16:38.
Lesha вне форума Ответить с цитированием
Старый 24.03.2012, 20:40   #3
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
$('#test').unbind('mouseup',foo); // foo глобальна
Мне нужно, что бы foo - было не глобальной. В этом вся фишка.
Виталий Желтяков вне форума Ответить с цитированием
Старый 25.03.2012, 11:11   #4
StagnantIce
Пользователь
 
Регистрация: 05.03.2011
Сообщений: 60
По умолчанию

Посути вам нужно сохранять эту переменную где-то чтобы снять событие именно это. Поэтому не использовать не глобальные перменные не получится.

Чтобы получить доступ именно к глобавльной, используйте window.foo обращение.

Также стоит посмотреть в сторону того, чтобы просто снимать события, типа
Код:
document.getElementById('test').ommouseup = '';
Мои статьи по веб-программированию http://pihpi.ru
StagnantIce вне форума Ответить с цитированием
Старый 25.03.2012, 11:19   #5
StagnantIce
Пользователь
 
Регистрация: 05.03.2011
Сообщений: 60
По умолчанию

Затирать событие onmouseup кстати можно и спомощью Jquery

http://kill-9.ru/jquery/jquery-bind-i-unbind/
Мои статьи по веб-программированию http://pihpi.ru
StagnantIce вне форума Ответить с цитированием
Старый 25.03.2012, 16:10   #6
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Виталий Желтяков, если честно, то я не очень понял) Несмотря на это осмелюсь предложить пару вариантов : )

Код:
function buf() {
            
    (function() {
        // Удаляем предыдущие привязанные события
        $( '#test' ).unbind( 'mouseup' , foo );
    }).call( window );
            
    var foo = function() {
        alert( 'Раз' );
    };
            
    // Устанавливаем новые
    $( '#test' ).bind( 'mouseup' , foo );
}
            
            
// либо
            
            
function buf() {
            
    // Удаляем предыдущие привязанные события
    $( '#test' ).unbind( 'mouseup' , foo );
            
    (function() {
        var foo = function() {
            alert( 'Раз' );
        };
            
        // Устанавливаем новые
        $( '#test' ).bind( 'mouseup' , foo );
    })();
}
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 25.03.2012, 19:59   #7
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
Посути вам нужно сохранять эту переменную где-то чтобы снять событие именно это. Поэтому не использовать не глобальные перменные не получится.
Это возможно через замыкания - так например, половина функций jquery работает.
Цитата:
Несмотря на это осмелюсь предложить пару вариантов : )
Я их уже пробовал - не работают.

Задачка вроде бы элементарная, но...
Виталий Желтяков вне форума Ответить с цитированием
Старый 26.03.2012, 00:41   #8
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Всё... нашел решение. Необходимо использовать пространство имён. Для jQuery решение будет выглядеть так:
Код:
function buf() {
// Удаляем предыдущие привязанные события
$('#test').unbind('mouseup.boo');
var foo = function() {
alert("Раз");
};
// Устанавливаем новые
$('#test').bind('mouseup.boo',foo);
}
Тему можно закрывать. Всем спасибо.
Виталий Желтяков вне форума Ответить с цитированием
Старый 26.03.2012, 06:27   #9
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Цитата:
Необходимо использовать пространство имён
чтото новенькое
Lesha вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
непонятная ошибка после выполнения программы TotKtoNado Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 16 30.12.2011 18:46
Окно после выполнения запроса mortal2010 Microsoft Office Access 6 25.02.2011 13:18
Обновление таблицы после выполнения селекта Tatochka Microsoft Office Access 5 15.01.2010 10:40
Сохранение полученных данных после выполнения поиска Pirat_of Microsoft Office Access 1 14.05.2009 08:38
Button после выполнения ProgressBar }{oт@бь)ч Общие вопросы Delphi 7 25.01.2009 12:33