Скрыть элементы при клике за их пределами
На странице может быть куча элементов открытых, за каждым надо следить если кликнули мимо.
вот что я сделал, конечно работает но это ужасный способ: 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 убрать если не открыто ни одно окно которое нужно закрыть при промыхе |
Maxmaxmахimus, вот и зря! Поспешишь как говориться...
|
Maxmaxmахimus, опять всё не прочёл ? :) убрать прослушку это не проблема, важен алгоритм когда его убирать :) одной булевой переменной не обойдёшься.Может быть куча окон открыто, посмотри как я написал пример, он рабочий но безобразный
|
в общем может кому понадобиться, сделал вот так
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 срабатывает хотя должен только после промоха по инпуту, почему так ? |
masClos - массив индекс которого аргументы функции, что тут не понятного ?
ой только давай не будешь прикрываться старой доброй фразой про телепатию.Код выложил рабочий, исписал всё. Если что не понятно спроси, не надо жаловаться. Спешол фо ю могу каждую строчку разжувать. И ещё раз повторюсь дабы никто экстрасенсорные волны не излучал перед тем как внимательно прочесть топик. Представим себе div id="form" в котором есть форма, изначально мы видим только один input в этой форме и если мы на него кликнули, то появилась вся форма.Представил ? поехали дальше... Не захотел я заполнять форму, мышкой щёлкнул в другое место сайта и форма скрылась.Это думаю то же понятно.Вот таких вот форм может быть много.Соответственно при клике на инпут запускаем прослушку, если ли же ни один инпут не был такой нажат значит нам нечего слушать. Переходим к следующему шагу, это код запуска в инпуте: onfocus="closeT('#pseClose','#add_str')" первый аргумент это id div'a по которому проходит условие, то есть если мы не попали по нему, то... берём второй аргумент и скрываем div с id этого аргумента. Куда дотошней объяснять я не знаю.Сори за возможный сарказм, но как ко мне так и я в ответ. |
я если честно мало чего понял :)
masClos=new Array(); в первом коде есть, забыл впихнуть в последнее сообщение с кодом, т.к. просто функцию переписал да и по коду думаю заметно что это просто булевой массив Ну да ладно спор какой-то уже пошёл. Мне интересно есть у кого нибудь другие решения ну или хотя бы узнать почему при клике на инпут срабатывает click, если к ссылке привязать вызов функции или ещё куда то всё норм |
Часовой пояс GMT +3, время: 15:37. |