Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
Я тут попытался применить взятые из Интернета способы скрывания блоков при клике вне каждого из них. Почему-то не получается: ни с обоими тестовыми блоками, ни даже с каждым из них отдельно. Проблему я выделил в 3 файла (html+css+js), а сами применённые мной варианты - закомментированы в конце js-файла. Если раскомментировать хоть один из них - то мои блоки даже не вызываются на экран :( Единственное, что мне удалось установить - операция скрывания блоков происходит почему-то ВСЕГДА сразу же после их появления на экране, не взирая на все ограничивающие условия. А мне нужно, чтобы каждый из блоков скрывался при клике вне его (по принципу выпадающего списка). Посмотрите, пожалуйста, что я делаю неправильно. Прилагаю тестовые файлы (поскольку код, даже самый необходимый для вопроса, занял бы тут на странице слишком много места). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 18:29 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 21:42 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
skyANA, Да я бы и рад был так сделать, но как туда приобщить графические файлы, задействованные в css-оформлении и img-теге? А без них - картина страницы получается вообще не понятная, я локально проверял - строки и столбцы таблицы теряют свои нормальные габариты, и тогда вообще не понятно, КУДА именно надо кликать для раскрытия упомянутых мной блоков :( Можно, конечно, тут html-css-js-коды представить под спойлерами - но те же необходимые графические элементы всё равно приобщать к посту придётся... А так - достаточно лишь извлечь файлы из приложенного мной архива и открыть в браузере html-ник. Если у Вас найдётся время - гляньте, пожалуйста. Может Вы сразу же сможете увидеть какую-нибудь очевидную несуразность в моём коде? Мне б хотя бы понять, в чём затык - я бы хоть уразумел, в каком направлении рыть дальше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 23:39 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
Добавлю ещё, что в моем проблемном тесте почему-то реакция на клик вне блока происходит даже в том случае, когда он ещё невидим на странице, хотя в условии клика я чётко указал - срабатывать лишь при уже выведенном на экран (раскрытом) блоке... Это уже не первый случай, когда события в JS-коде не соблюдают предполагаемую мной хронологию - видимо, в моих предположениях есть какое-то фундаментальное непонимание. Именно его я и хочу уловить. Проще говоря - хочу уяснить для себя, почему в JS - иногда случается так, что написанная мной функция срабатывает уже на этапе её объявления (декларации), не дожидаясь этапа её вызова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 23:54 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
neznajka, я скрывал через onblur Самодельный Combobox Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. Самодельный CheckCombobox Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:34 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
Спасибо, user89! Я тут, кажется, уже почти разобрался, почему у меня ни один из заимствованных мной из Интернета вариантов не работает. По всему выходит, что всё дело - во "всплытии" клика (есть, оказывается, такой интересный прибаб а х в JS:). Для всякого скрытого блока открывающий его элемент -то всегда является видимым и находится ВНЕ этого самого скрытого блока. Вот и выходит, что даже если явно задавать ограничение - "клику на скрытие блока срабатывать только в том случае, если блок уже открыт/видим" - то это ничего не даёт: ведь происходит такая последовательность: - сначала при клике на видимом открывающем элементе срабатывает обработчик открытия (вывода на экран) скрытого блока и он становится видимым; - затем этот же самый клик (произведённый заведомо ВНЕ только что открытого блока) всплывает до самого верхнего уровня (document), где вполне правомерно срабатывает уже обработчик его закрытия (ведь все условия для его срабатывания уже выполнены: блок уже открыт и клик был произведён именно ВНЕ его). Выходит, что для корректного срабатывания - вполне достаточно прервать процесс всплытия клика. Подозреваю, что для этого нужно просто поставить "return false" в нужном месте. Вероятнее всего - сразу после открытия (вывода на экран) того самого скрытого блока. Проверю на досуге. Конечно, любому маститому JS-нику - это всё вполне очевидно. Но для меня, как для новичка, - это маленькое открытие :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:22 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
neznajkaВыходит, что для корректного срабатывания - вполне достаточно прервать процесс всплытия клика. Подозреваю, что для этого нужно просто поставить "return false" в нужном местеНа всякий случай посмотрите Прекращение всплытия и там же ниже по тексту, есть третий аргумент addEventListener ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:56 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
user89, благодарю Вас - я когда-то уже наталкивался на такой материал, но тогда он мне был ещё не нужен. А сейчас вот с Вашей подачи снова вспомнил о нём - буду вникать по мере необходимости. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 13:14 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
Не, не получается всё равно - за целый день уже всё вышеперечисленное перепробовал: всплытие всё равно проходит наверх, не замечая никаких команд-преград, и упрямо скрывает блок сразу же после его открытия :( Видимо, если на странице предусмотрено НЕСКОЛЬКО самописных select'ов (блоков), то их таким образом не закрыть никак. Буду закрывать через ESC - уж такой-то "ломик" сработает в любом случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 18:30 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
Всё-таки попробую ещё раз - может с помощью гуру всё получится :) skyANA, по Вашему совету я создал тестовый пример , но в нём все 5 вариантов проблемной функции закрытия 2-х блоков (в самом конце js-файла) - сейчас закомментированы. Сделано это для того, чтобы можно было увидеть, как раскрываются (становятся видимыми) на странице упомянутые мной 2 блока. Если раскомментировать хоть один из тех вариантов - то раскрытие/визуализация блоков полностью блокируется :( Т.е. - любой вариант скрытия блоков почему-то срабатывает сразу же после их раскрывания и потому их увидеть вообще невозможно. Потому и закомментировал пока - чтобы можно было хотя бы увидеть, о каких именно блоках я тут толкую. Если у Вас найдётся минутка - гляньте пожалуйста, раскомментировав, например 5-й вариант в самом конце файла - именно он мне кажется самым "перспективным" для отладки. Мне почему-то кажется, что Вы эту проблему победите сразу же, "одной левой" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 15:20 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
neznajka, обычно все это делают так Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. setTimeout в данном случае приводит все реализации "всплытия" событий к единообразию. Он откладывает выполнение привязки закрытия события на время, когда событие закончится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 16:12 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
Спасибо за участие, mage.lan, Логика Вашего объяснения мне понятна. Но применение на практике - вызывает затруднения, я пока ещё не настолько продвинутый в вопросах JS/JQ. Потому, к сожалению, применить предложенный Вами шаблон кода пока не получается: не могу привязать это всё к своим DIV'ам - ни к открывающим, ни к скрываемым :( Посмотрите, пожалуйста, как я попытался применить предложенный Вами способ. Поправьте или подскажите, как надо правильно сделать, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 18:39 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
mage.lan, добавлю, что предложенный Вами там в моём JS-файле шаблон начинается с 83-й строки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 18:42 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 19:23 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
Спасибо, mage.lan, Не совсем то. Такое я уже сам смог бы сделать. Простите, что не слишком понятно и путано объясняю - трудно сориентироваться в специфике JS-терминологии. Говоря проще - мне нужно, чтобы каждый из скрытых блоков вёл себя как выпадающий список: КАЖДЫЙ из них (если уже раскрылся - стал видимым на экране) должен закрываться при щелчке на ЛЮБОМ элементе страницы ВНЕ этого самого блока. А при щелчке внутри блока - он закрываться не должен, т.к. для этого случая у меня уже есть своя процедура обработки. Т.е. например, 2-й блок (если уже выведен на экран и видим) должен скрываться при левом клике ВНЕ этого 2-го блока, в том числе - и при клике на 1-м блоке или его "открывалке"). Аналогично должен себя вести и 1-й блок. Но у меня пока не получается побороть хотя бы один из них. Вот я и провожу свои эксперименты пока только над 2-м :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 12:40 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
neznajka, Честно говоря задачка не очень интересная, деревьев написал в свое время много, считаю такие контролы античеловеческим злом. Могу предложить вам следующие: 1. отдельно решить задачу дерева 2. отдельно решить задачу с попап 3. объеденить их (тут у вас начнутся проблемы с логикой поведения, но вы будете решать только их не отвлекаясь на решенные задач 1 и 2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 13:07 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
mage.lan, Дерево работает нормально (просто в тесте я убрал графическое оформление). Насчёт поэтапного решения - я так и начал уже делать. Сейчас я уберу из 2-го блока дерево - для данного теста оно и вправду не нужно, Вы правы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 13:22 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
mage.lan, посмотрите, пожалуйста, "очищенный вариант теста" Предложенный вчера Вами шаблон кода начинается там в js-окне с 31-строки. На всё, что выше - не обращайте внимания: всё то лишь открывает 1-й блок в нужной позиции. Гляньте, пожалуйста с 31-строки - именно оттуда начинаются мои проблемы :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 13:44 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
neznajka, Все тоже самое В 40й строке у вас ошибка (доверьте работать jQuery с DOM) В HTML 7 строка - кривая версия jQuery В HTML 43 строка - убран onclick ($('#ukz').on('click', ...) и так уже цепляется за эту кнопку) Советую вам потратить день на изучение селекторов в jQuery и убрать в своем коде все id. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 15:30 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
mage.lan, О, спасибо! - почти то, что надо. Насчёт 40-й строки - Вы правы: торопился и пропустил style при копировании. Насчёт версии JQ - вроде ж рабочую ссылку вставлял... Или там была указана локальная копия? Не помню уже, честно говоря. Или Вы имеете в виду, что задействована не последняя версия JQ? Так мне так и надо. Ибо все последующие - очень тормозят уже применённые мной на странице эффекты. Даже простой эффект "лупа" - и то уходит в спячку, если применить свежую версию JQ. Вероятнее всего - надо тогда что-то в коде применённых мной эффектов адаптировать к свежей версии. Или искать обновлённую лупу. Но тогда - и все остальные... Долго это. Да и не совсем необходимо для данного случая. Потому и оставил старую версию. Если именно это имели в виду под выражением "кривая версия". А ссылка на неё - я только что проверил - работает. Насчёт селекторов в jQuery - Вы тоже правы. Я ими в более простых случаях и пользуюсь. Но при таком количестве кода - мне легче ориентироваться именно по id-шникам. jQuery-селекторы я пока воспринимаю не так легко, приходится слишком долго вдумываться над каждым из них, о каком именно элементе идёт речь. Так что - для этой задачи пусть пока остаются id-шники. Но следующий проект - буду делать, по возможности, исключительно с применением JQ. А пока - попытался распространить Ваш код также и на закрытие 1-го блока, который открывается по клику на красной полоске. Не выходит. Я не пойму, куда именно надо вставлять переменную, представляющую этот блок. Попробовал в функции closePopup поставить не одну, а рядом две команды: Код: javascript 1. 2. Но и это никак не повлияло на закрытие 1-го блока :( Может, тут я должен как-то задействовать параметр e , применённый Вами в функциях openPopup(e) и closePopup(e) ? Подскажите, ещё, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 18:20 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
mage.lan, Да, ещё хотел спросить - а с какой целью Вы в 40-й строке вставили вывод в консоль самого объекта JQ - console.info($) ? Чтобы проверить, что файл JQ подключен и работает? Или это нужно для чего-то другого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 18:26 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
Ура, mage.lan, - у меня таки получилось победить и 1-й блок! Спасибо огромное Вам! Я его "нагнул"-таки, задействовав в Вашем шаблоне его собственную функцию показа/раскрытия (ZvetVybor) - просто в самый конец файла добавил: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Теперь осталось только добавить функции обработки перед закрытием - чтобы обработать выбранный в результате клика под-элемент скрытого блока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 18:41 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
mage.lan, Вот, я тут по Вашим рекомендациям привожу всё к JQ-виду: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Конечно, если не на "экспорт" - то мне нравится. Компактненько, вроде, получается :) Только не нашёл в Интернете, как подгоняются под JQ вот такие выражения: Код: javascript 1. Пробовал вот так $('tdItog').getBoundingClientRect().width - не проходит. А как было бы правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 20:27 |
|
||
|
Клик вне элемента - не могу заставить работать ожидаемым образом :(
|
|||
|---|---|---|---|
|
#18+
neznajka, Код: javascript 1. 2. 3. как то так надо Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. если вы хотите работать с элементами методами DOM, можно писать так Код: javascript 1. 2. но это плохая практика. В jQuery есть все методы, которые могут потребоваться для манипуляциями с DOM и они более менее кросбраузерные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 11:09 |
|
||
|
|

start [/forum/topic.php?fid=22&msg=39356775&tid=1444862]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
158ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 289ms |
| total: | 531ms |

| 0 / 0 |
