Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.04.2012, 03:21
Интересующийся
Отправить личное сообщение для gradus Посмотреть профиль Найти все сообщения от gradus
 
Регистрация: 18.02.2011
Сообщений: 24

Скрыть элементы при клике за их пределами
На странице может быть куча элементов открытых, за каждым надо следить если кликнули мимо.
вот что я сделал, конечно работает но это ужасный способ:
masClos=new Array();
 $(document).click( function(event){
 var txt='';
       for(var idC in masClos){
 txt+='idC='+idC+'\n';
	if( $(event.target).closest(masClos[idC][0]).length ) 
        continue;
      $(masClos[idC][1]).hide();
      delete masClos[idC];
	}
	alert(txt);
	event.stopPropagation();
    });
 function closeT(idif,idcl){
 if(!idcl) idcl=idif;
	masClos.push([idif,idcl]);
}

<input type="text"  name="adds_n_p" id="adds_n_p" value="Введите имя" 
onfocus="closeT('#pseClose','#add_str')">

ужасный потому что
1)нет проверки на повторный вызов, можно кликать и всё время будет добавляться массив
2)даже если нажать один раз и потом кликнуть вне элемента, alert(txt); выдаёт
idC=0
idC=1 // - откуда второй взялся я не понял

В общем подскажите способ, в идеале вообще бы $(document).click убрать если не открыто ни одно окно которое нужно закрыть при промыхе

Последний раз редактировалось gradus, 04.04.2012 в 03:33.
Ответить с цитированием
  #2 (permalink)  
Старый 04.04.2012, 03:33
Интересующийся
Отправить личное сообщение для gradus Посмотреть профиль Найти все сообщения от gradus
 
Регистрация: 18.02.2011
Сообщений: 24

Maxmaxmахimus, вот и зря! Поспешишь как говориться...
Ответить с цитированием
  #3 (permalink)  
Старый 04.04.2012, 11:25
Интересующийся
Отправить личное сообщение для gradus Посмотреть профиль Найти все сообщения от gradus
 
Регистрация: 18.02.2011
Сообщений: 24

Maxmaxmахimus, опять всё не прочёл ? убрать прослушку это не проблема, важен алгоритм когда его убирать одной булевой переменной не обойдёшься.Может быть куча окон открыто, посмотри как я написал пример, он рабочий но безобразный
Ответить с цитированием
  #4 (permalink)  
Старый 04.04.2012, 11:51
Интересующийся
Отправить личное сообщение для gradus Посмотреть профиль Найти все сообщения от gradus
 
Регистрация: 18.02.2011
Сообщений: 24

в общем может кому понадобиться, сделал вот так
function closeT(idif,idcl){
var t=idif+idcl;
if(!masClos[t])
	{
	masClos[t]=true;
        $(document).bind('click.'+t, function(e) {
	alert(true);
            if ($(e.target).closest(idif).length == 0) {
                 $(idcl).hide();
		 masClos[t]=false;
                $(document).unbind('click.'+t);
            }
        });
	}
 }

только опять косяк не пойму почему, если жмякаем на инпут , то alert срабатывает хотя должен только после промоха по инпуту, почему так ?

Последний раз редактировалось gradus, 04.04.2012 в 12:24.
Ответить с цитированием
  #5 (permalink)  
Старый 04.04.2012, 17:47
Интересующийся
Отправить личное сообщение для gradus Посмотреть профиль Найти все сообщения от gradus
 
Регистрация: 18.02.2011
Сообщений: 24

masClos - массив индекс которого аргументы функции, что тут не понятного ?
ой только давай не будешь прикрываться старой доброй фразой про телепатию.Код выложил рабочий, исписал всё.
Если что не понятно спроси, не надо жаловаться. Спешол фо ю могу каждую строчку разжувать.
И ещё раз повторюсь дабы никто экстрасенсорные волны не излучал перед тем как внимательно прочесть топик.

Представим себе div id="form" в котором есть форма, изначально мы видим только один input в этой форме и если мы на него кликнули, то появилась вся форма.Представил ? поехали дальше...
Не захотел я заполнять форму, мышкой щёлкнул в другое место сайта и форма скрылась.Это думаю то же понятно.Вот таких вот форм может быть много.Соответственно при клике на инпут запускаем прослушку, если ли же ни один инпут не был такой нажат значит нам нечего слушать.

Переходим к следующему шагу, это код запуска в инпуте:
onfocus="closeT('#pseClose','#add_str')"
первый аргумент это id div'a по которому проходит условие, то есть если мы не попали по нему, то... берём второй аргумент и скрываем div с id этого аргумента.
Куда дотошней объяснять я не знаю.Сори за возможный сарказм, но как ко мне так и я в ответ.

Последний раз редактировалось gradus, 04.04.2012 в 17:51.
Ответить с цитированием
  #6 (permalink)  
Старый 04.04.2012, 17:59
Интересующийся
Отправить личное сообщение для gradus Посмотреть профиль Найти все сообщения от gradus
 
Регистрация: 18.02.2011
Сообщений: 24

я если честно мало чего понял
masClos=new Array();
в первом коде есть, забыл впихнуть в последнее сообщение с кодом, т.к. просто функцию переписал да и по коду думаю заметно что это просто булевой массив
Ну да ладно спор какой-то уже пошёл.
Мне интересно есть у кого нибудь другие решения ну или хотя бы узнать почему при клике на инпут срабатывает click, если к ссылке привязать вызов функции или ещё куда то всё норм
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При клике ссылки, открыть DIV блок, и при клике ещё раз, закрыть его Simon Общие вопросы Javascript 59 28.05.2017 17:31
Вопрос по jquery. Как запретить один из скриптов при клике vuler Общие вопросы Javascript 1 07.03.2012 22:35
Запись cookes при клике pavdin Общие вопросы Javascript 3 06.02.2012 17:19
При клике в любом месте документа должен удаляться определенный id DorianLeroy jQuery 2 24.12.2011 22:05
Закрыть элемент при клике вне его masterm Общие вопросы Javascript 3 31.07.2009 11:27