Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   как предотвратить повторное создание функции (https://javascript.ru/forum/jquery/21348-kak-predotvratit-povtornoe-sozdanie-funkcii.html)

kichSman 06.09.2011 03:27

как предотвратить повторное создание функции
 
Уважаемые форумчане, есть некий код плагина, скрипт в упрощенном варианте представлен ниже.
var $this = $(':text');

function showList(){
	$(document).click( function(e){
		if ( e.target !== $this.get(0) ){ $('ul').hide() };
	});
	
	$('ul').show()
		.children('li').click(function(e){
			e.stopPropagation();
			alert('Selected ME');
		});
}
$this.delegate( 'focusin', showList() );

Так вот, вопрос в следующем, как предотвратить повторное создание функций "Клика" для документа и элементов LI.
Суть в следующем, указанный скрипт прописан в самом плагине, элемент UL очень часто появляется (при фокусе) и исчезает, по этой причине, советы типа: вызвать единожды оба клика за пределами плагина - не вариант.

При существующем коде, тестовое алерт-сообщение выскакивает нарастающим количеством при каждом новом получении фокуса текстовым полем.

Заранее признателен.

devote 06.09.2011 08:03

var $this = $(':text'),
    assignedEvent = false;
  
function showList(){

    var ul = $('ul').show();

    if ( !assignedEvent ) {

        assignedEvent = true;

        $(document).click( function(e){ 
            if ( e.target !== $this.get(0) ){ $('ul').hide() }; 
        }); 

        ul.children('li').click(function(e){ 
            e.stopPropagation(); 
            alert('Selected ME'); 
        });
    }
} 
$this.delegate( 'focusin', showList() );

kichSman 06.09.2011 10:27

Цитата:

Сообщение от devote (Сообщение 125100)
....

Честно говоря, в моем случае это не очень хороший вариант, в частности, из-за проблемы присвоения assignedEvent

nikita.mmf 06.09.2011 13:49

var $this = $(':text');

function showList(){
	$(document).unbind("click.gavnoplugin").bind("click.gavnoplugin", function(e){
		if ( e.target !== $this.get(0) ){ $('ul').hide() };
	});
	
	$('ul').show()
		.children('li').unbind("click.gavnoplugin").bind("click.gavnoplugin", function( e ){
			e.stopPropagation();
			alert('Selected ME');
		});
}
$this.delegate( 'focusin', showList );


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