Браузер кнопка назад коснитесь дважды
Почему же кнопки браузера не запускают свои собственные события !?
(Примечание: согласно отзывам Шарки, я включил код для обнаружения возврата)
Итак, я часто видел эти вопросы в SO, и недавно я столкнулся с проблемой управления функциональностью кнопки «назад». После нескольких дней поиска наилучшего решения для моего приложения («Одностраничная с хэш-навигацией») я разработал простую кросс-браузерную систему без библиотек для обнаружения кнопки «назад».
Большинство людей рекомендуют использовать:
Однако эта функция также будет вызываться, когда пользователь использует элемент на странице, который изменяет хэш расположения. Не лучший пользовательский опыт, когда ваш пользователь нажимает и страница перемещается назад или вперед.
Чтобы дать вам общее представление о моей системе, я заполняю массив предыдущими хэшами, когда мой пользователь перемещается по интерфейсу. Это выглядит примерно так:
Довольно прямо вперед. Я делаю это для обеспечения кросс-браузерной поддержки, а также поддержки старых браузеров. Просто передайте новый хеш функции, и он сохранит его для вас, а затем изменит хеш (который затем заносится в историю браузера).
Я также использую кнопку возврата на странице, которая перемещает пользователя между страницами с помощью массива lasthash . Это выглядит так:
Так что это вернет пользователя к последнему хешу и удалит этот последний хеш из массива (у меня сейчас нет кнопки вперед).
Так. Как определить, использовал ли пользователь мою кнопку возврата на странице или кнопку браузера?
Сначала я посмотрел на window.onbeforeunload , но безрезультатно - он вызывается только в том случае, если пользователь собирается менять страницы. Этого не происходит в одностраничном приложении, использующем хеш-навигацию.
Итак, после еще нескольких копаний я увидел рекомендации по установке переменной-флага. Проблема с этим в моем случае заключается в том, что я попытался бы установить его, но, поскольку все является асинхронным, он не всегда будет установлен вовремя для оператора if в изменении хеша. .onMouseDown не всегда вызывался в щелчке, и добавление его в onclick никогда не вызовет его достаточно быстро.
Это когда я начал смотреть на разницу между document и window . Мое окончательное решение состояло в том, чтобы установить флаг, используя document.onmouseover , и отключить его, используя document.onmouseleave .
Что происходит, когда мышь пользователя находится внутри области документа (читай: отображаемая страница, но исключая фрейм браузера), мой логический параметр установлен в true . Как только мышь покидает область документа, логическое значение переходит на false .
Таким образом, я могу изменить свой window.onhashchange на:
Итак, вкратце, и для людей, которые не обязательно используют кнопку возврата на странице или массив для хранения истории:
Чтобы убедиться, что пользователь не использует backspace для запуска события back, вы также можете включить следующее (благодаря @thetoolman на этот вопрос):
В этой главе приведены инструкции по использованию экранного диктора с функцией сенсорного ввода на поддерживающих эту возможность компьютерах с Windows, а также представлен список некоторых основных сенсорных жестов Windows.
Сенсорные жесты
С помощью жестов можно взаимодействовать с экранным диктором и устройством.
Для изучения и озвучивания элементов на экране, перемещайте один палец по экрану. Когда будет озвучен необходимый элемент, дважды коснитесь экрана одним пальцем, чтобы активировать его. Для перемещения по элементам на экране проведите одним пальцем влево и вправо.
Если требуется выбрать режим перемещения — по символам, словам, строкам или ссылкам —проведите пальцем вверх или вниз, чтобы изменить представление экранного диктора. Например, чтобы прослушать написание элемента, проведите вверх, пока не услышите слово "символы". Затем проведите пальцем влево и вправо для перемещения в выбранном элементе по одной букве.
Ниже приведены полезные жесты, который помогут вам начать работу.
Чтобы отклонять контекстные меню (совместив клавишу ESCAPE), трижды коснитесь двумя пальцами.
Чтобы изменить режим экранного диктора, проведите одним пальцем вверх и вниз.
Чтобы прокрутить содержимое на экране, проведите двумя пальцами вверх, вниз, влево или вправо.
Чтобы отобразить контекстные меню, дважды коснитесь экрана двумя пальцами.
Чтобы изменить уровень детализации, один раз коснитесь экрана тремя пальцами.
Для непрерывного озвучивания содержимого с текущего места, проведите тремя пальцами вниз.
Чтобы перейти к следующему или предыдущему элементу управления, проведите тремя пальцами влево или вправо.
Чтобы отобразить список команд экранного диктора, трижды коснитесь экрана четырьмя пальцами.
Чтобы открыть центр уведомлений, проведите пальцем от правого края экрана.
Чтобы открыть представление задач для переключения между приложениями и разными рабочими столами, проведите пальцем от левого края экрана.
Полный список сенсорных жестов можно найти в приложении B: сочетания клавиш и сенсорные жестыэкранного диктора.
Печать касанием
При переходе в область редактирования, например, в текстовое поле, в нижней части экрана отобразится сенсорная клавиатура и экранный диктор воспроизведет звуковой сигнал, оповещающий о ее отображении. Чтобы ввести текст, дважды коснитесь символов, которые требуется ввести.
Чтобы быстрее ввести текст, выберите кнопку Пуск, а затем Параметры ,выберите "Специальными возможности" ивыберите "Диктор". Затем, когда я убираю палец, включаю клавиши рядом с полем На сенсорных клавиатурах, чтобы вводить символы, как только вы уберите палец с символа.
В этой главе приведены инструкции по использованию экранного диктора с функцией сенсорного ввода на поддерживающих эту возможность компьютерах с Windows, а также представлен список некоторых основных сенсорных жестов Windows.
Сенсорные жесты
С помощью жестов можно взаимодействовать с экранным диктором и устройством.
Для изучения и озвучивания элементов на экране, перемещайте один палец по экрану. Когда будет озвучен необходимый элемент, дважды коснитесь экрана одним пальцем, чтобы активировать его. Для перемещения по элементам на экране проведите одним пальцем влево и вправо.
Если требуется выбрать режим перемещения — по символам, словам, строкам или ссылкам —проведите пальцем вверх или вниз, чтобы изменить представление экранного диктора. Например, чтобы прослушать написание элемента, проведите вверх, пока не услышите слово "символы". Затем проведите пальцем влево и вправо для перемещения в выбранном элементе по одной букве.
Ниже приведены полезные жесты, который помогут вам начать работу.
Чтобы изменить режим экранного диктора, проведите одним пальцем вверх и вниз.
Чтобы прокрутить содержимое на экране, проведите двумя пальцами вверх, вниз, влево или вправо.
Чтобы отобразить контекстные меню, дважды коснитесь экрана двумя пальцами.
Чтобы изменить уровень детализации, один раз коснитесь экрана тремя пальцами.
Для непрерывного озвучивания содержимого с текущего места, проведите тремя пальцами вниз.
Чтобы перейти к следующему или предыдущему элементу управления, проведите тремя пальцами влево или вправо.
Чтобы отобразить список команд экранного диктора, трижды коснитесь экрана четырьмя пальцами.
Чтобы открыть центр уведомлений, проведите пальцем от правого края экрана.
Чтобы открыть представление задач для переключения между приложениями и разными рабочими столами, проведите пальцем от левого края экрана.
Полный список сенсорных жестов можно найти в приложении B: сочетания клавиш и сенсорные жестыэкранного диктора.
Печать касанием
При переходе в область редактирования, например, в текстовое поле, в нижней части экрана отобразится сенсорная клавиатура и экранный диктор воспроизведет звуковой сигнал, оповещающий о ее отображении. Чтобы ввести текст, дважды коснитесь символов, которые требуется ввести.
Чтобы быстрее ввести текст, выберите Пуск кнопку, а затем Параметры , выберите Ease of Access , а затем выберите Narrator. Затем, когда я убираю палец, включаю клавиши рядом с полем На сенсорных клавиатурах, чтобы вводить символы, как только вы уберите палец с символа.
Почему на земле нет кнопок браузера, запускающих собственные события!?
ОТВЕТЫ
Ответ 1
(Примечание. Согласно обратной связи Sharky, я включил код для обнаружения обратных пространств)
Большинство людей рекомендуют использовать:
Однако эта функция также вызывается, когда пользователь использует элемент внутри страницы, который изменяет хэш местоположения. Не лучший пользовательский интерфейс, когда пользователь нажимает, а страница идет назад или вперед.
Чтобы дать вам общую схему моей системы, я заполняю массив предыдущими хэшами, когда мой пользователь перемещается по интерфейсу. Это выглядит примерно так:
Довольно прямо. Я делаю это, чтобы обеспечить кросс-браузерную поддержку, а также поддержку старых браузеров. Просто передайте новый хэш функции, и он сохранит его для вас, а затем изменит хэш (который затем помещается в историю браузера).
Я также использую кнопку возврата на странице, которая перемещает пользователя между страницами с помощью массива lasthash . Это выглядит так:
Итак, это вернет пользователя к последнему хэшу и удалит последний хэш из массива (у меня нет прямой кнопки прямо сейчас).
Итак. Как определить, использовал ли пользователь мою кнопку возврата на странице или кнопку браузера?
Сначала я посмотрел на window.onbeforeunload , но безрезультатно - это только вызывается, если пользователь собирается менять страницы. Это не происходит в одностраничном приложении с использованием хэш-навигации.
Итак, после некоторого дополнительного копания, я увидел рекомендации по попытке установить переменную флага. Проблема с этим в моем случае заключается в том, что я попытаюсь установить его, но поскольку все будет асинхронным, оно не всегда будет установлено во времени для оператора if в изменении хэша. .onMouseDown не всегда вызывался кликом, а добавление его в onclick не вызывало бы его достаточно быстро.
Это когда я начал смотреть на разницу между document и window . Моим окончательным решением было установить флаг с помощью document.onmouseover и отключить его с помощью document.onmouseleave .
Что происходит, когда пользовательская мышь находится внутри области документа (читайте: отображаемая страница, но исключая рамку браузера), мое логическое значение имеет значение true . Как только мышь покидает область документа, логическое значение переворачивается до false .
Таким образом, я могу изменить свой window.onhashchange на:
Итак, короче говоря, для людей, которые не обязательно используют кнопку возврата на странице или массив для хранения истории:
И у вас это есть. простой, трехкомпонентный способ обнаружения использования кнопки обратной связи и элементов на странице в отношении хеш-навигации.
Чтобы гарантировать, что пользователь не будет использовать backspace для запуска события back, вы также можете включить следующее (Спасибо @thetoolman на этот вопрос):
Ответ 2
Вы можете попробовать popstate обработчик событий, например:
Примечание. Для достижения наилучших результатов вы должны загрузить этот код только на определенных страницах, где вы хотите реализовать логику, чтобы избежать любых других непредвиденных проблем.
Событие popstate запускается каждый раз, когда изменяется текущая запись истории (пользователь переходит в новое состояние). Это происходит, когда пользователь нажимает кнопки браузера Back/Forward или когда методы history.back() , history.forward() , history.go() запрограммированы.
Свойство event.state является событием, равным объекту состояния истории.
Для синтаксиса jQuery оберните его (чтобы добавить даже слушателя после того, как документ готов):
Это должно быть совместимо с Chrome 5+, Firefox 4+, IE 10+, Safari 6+, Opera 11.5+ и т.д.
Ответ 3
Я довольно долго боролся с этим требованием и принял некоторые из решений выше, чтобы реализовать его. Тем не менее, я наткнулся на наблюдение и, похоже, работает в браузерах Chrome, Firefox и Safari + Android и iPhone.
Загрузка на страницу:
Сообщите мне, если это поможет. Если я что-то упустил, я буду рад понять.
Ответ 4
В javascript тип навигации 2 означает, что браузер нажимает кнопку "назад" или "вперед", и браузер фактически берет контент из кэша.
Ответ 5
Это определенно будет работать (для обнаружения нажатия кнопки назад)
Ответ 6
Ответ 7
Вот мой взгляд на это. Предполагается, что при изменении URL-адреса, но не обнаружено клика внутри обнаруженного document , это браузер назад (да или вперед). Пользовательский щелчок reset через 2 секунды, чтобы сделать эту работу на страницах, загружающих контент через Ajax:
Ответ 8
добавил этот код внизу страницы. см. эту кнопку обнаружения браузера baa
Ответ 9
Ответ 10
Правильный ответ уже есть, чтобы ответить на вопрос. Я хочу упомянуть новый JavaScript API PerformanceNavigationTiming, он заменил устаревший performance.navigation.
Следующий код будет входить в консоль "back_forward", если пользователь зашел на вашу страницу с помощью кнопки назад или вперед. Посмотрите на таблицу совместимости, прежде чем использовать ее в своем проекте.
Ответ 11
document.mouseover не работает для IE и FireFox. Однако я пробовал это:
Это работает для Chrome и IE, а не для FireFox. Все еще работаю над тем, чтобы получить FireFox. Любой простой способ обнаружения щелчка мыши назад/вперед браузера приветствуется, особенно не в JQuery, а также в AngularJS или в простом Javascript.
Ответ 12
Ответ 13
Я смог использовать некоторые ответы в этой теме и другие, чтобы заставить его работать в IE и Chrome/Edge. history.pushState для меня не поддерживается в IE11.
Ответ 14
Ответ 15
Это единственное решение, которое сработало для меня (это не одностраничный сайт). Работает с Chrome, Firefox и Safari.
Ответ 16
Я пробовал вышеуказанные параметры, но ни один из них не работает для меня. Вот решение
Мне было интересно, как я вижу это все чаще и чаще, это встроенная функция, которую вы можете каким-то образом получить в своей деятельности? Я посмотрел исходный код многих классов, но я не могу найти ничего об этом.
Конечно, я могу думать о нескольких способах достижения такой же функциональности довольно легко (проще всего, чтобы сохранить логическое значение в активности, которое указывает, был ли пользователь уже нажат один раз. ), но мне было интересно, если там что-то уже здесь.
EDIT. Как упоминалось в @LAS_VEGAS, я не имел в виду "выход" в традиционном значении. (т.е. прекращено) я имел в виду "возврат к тому, что было открыто до начала запуска приложения", если это имеет смысл:)
ОТВЕТЫ
Ответ 1
Думаю, этот обработчик помогает сбросить переменную через 2 секунды.
Ответ 2
Sudheesh B Nair имеет приятный (и принятый) ответ на вопрос, который, по моему мнению, должен иметь лучшую альтернативу, например:
Что случилось с временем измерения и проверкой, прошло ли TIME_INTERVAL miliseconds (скажем, 2000) со времени последнего последнего нажатия. Следующий пример кода использует System.currentTimeMillis(); для хранения времени onBackPressed() :
Чтобы удалить Runnable , он не должен быть объявлен анонимным и быть объявлен как член вместе с Handler . Тогда метод removeCallbacks() Handler можно назвать соответствующим образом.
Ниже показан демонстрационный пример:
Благодаря @NSouth за вклад; Чтобы предотвратить появление тоста, даже после закрытия приложения, Toast может быть объявлен как член - скажем mExitToast - и может быть отменен через mExitToast.cancel(); перед вызовом super.onBackPressed(); .
Ответ 3
Просто подумал, что я поделюсь своим делом, в конце концов, я только добавил в свою деятельность:
И он работает точно так, как я хочу. Включая reset состояния всякий раз, когда действие возобновляется.
Ответ 4
Технологическая схема процесса:
Код Java:
Ответ 5
Просто напишите следующий код внутри onBackPressed() .
Вам нужно определить объект back_pressed как long в активности.
Ответ 6
Основываясь на правильном ответе и предложениях в комментариях, я создал демоверсию, которая работает абсолютно нормально и удаляет обратные вызовы обработчика после использования.
MainActivity.java
Надеюсь, это будет полезно!
Ответ 7
Мое решение с использованием закусочной:
Просто и стильно.
Ответ 8
Объявить переменную private boolean doubleBackToExitPressedOnce = false; переменной private boolean doubleBackToExitPressedOnce = false;
Вставьте это в ваш основной вид деятельности, и это решит вашу проблему
Ответ 9
Не рекомендуется использовать Runnable при выходе из приложения, я недавно выяснил гораздо более простой способ записи и сравнения периода между двумя нажатиями кнопки BACK. Пример кода:
Это сделает трюк для выхода из приложения двойным нажатием кнопки BACK в течение определенного периода задержки, который составляет 2000 миллисекунд в образце.
Ответ 10
Это не встроенная функциональность. Я думаю, что это даже не рекомендуемое поведение. Приложения Android не предназначены для выхода:
Ответ 11
Ответ "Принято" - лучший, но если вы используете Android Design Support Library вы можете использовать SnackBar для SnackBar просмотра.
Ответ 12
- Объявить глобальную переменную Toast для класса MainActivity. Пример: Toast exitToast;
- Инициализировать его в методе onCreate view. пример: exitToast = Toast.makeText(getApplicationContext(), "Нажмите еще раз, чтобы выйти", Toast.LENGTH_SHORT);
Наконец, создайте onBackPressedMethod как следует:
Это работает правильно, я тестировал. и я думаю, что это намного проще.
Ответ 13
Ответ Zefnus с использованием System.currentTimeMillis() является лучшим (+1). То, как я это сделал, не лучше, чем это, но все же отправляю его, чтобы добавить к вышеупомянутым идеям.
Ответ 14
Недавно мне нужно было реализовать эту функцию кнопки назад в моем приложении. Ответы на первоначальный вопрос были полезны, но мне пришлось принять во внимание еще два момента:
Основываясь на ответах и комментариях, я создал следующий код:
Код выше предполагает, что используется библиотека поддержки. Если вы используете фрагменты, но не библиотеку поддержки, вы хотите заменить getSupportFragmentManager() на getFragmentManager() .
Снимите первый, if , если кнопка возврата никогда не отменяется. Удалите второе, if , если вы не используете фрагменты или фрагмент стека обратно
Также важно знать, что метод onBackPressed поддерживается начиная с Android 2.0. Проверьте эту страницу для подробного описания. Чтобы функция обратной печати работала и в более старых версиях, добавьте в свою деятельность следующий метод:
Ответ 15
Я знаю, что это очень старый вопрос, но это самый простой способ сделать то, что вы хотите.
Я знаю, что это не лучший метод, но он отлично работает!
Ответ 16
Это также помогает, когда в стеке хранится предыдущая активность стека.
Я изменил ответ Sudheesh
Ответ 17
Ответ 18
Для этой цели я реализовал следующую функцию:
Ответ 19
Вот полный рабочий код. Кроме того, не забудьте удалить обратные вызовы, чтобы они не вызывали утечку памяти в приложении.:)
Ответ 20
Здесь я обобщил код для подсчета N отводов. Код аналогично написан для опции "Включить разработчик" на телефоне устройства Android. Даже вы можете использовать это, чтобы включить функции, а разработчик тестировал приложение.
Вызовите askToExit() по опции "Выход" или "Выход".
Ответ 21
Когда HomeActivity содержит ящик для навигации и двойное backPressed() funtion для выхода из приложения. (Не забудьте инициализировать глобальную переменную boolean doubleBackToExitPressedOnce = false;) новый обработчик после 2 секунд установки переменной doubleBackPressedOnce на false
Ответ 22
Ответ 23
Ответ 24
Некоторые улучшения в решении Sudheesh B Nair, я заметил, что он будет ждать обработчика, даже при одновременном нажатии дважды, так что отмените обработчик, как показано ниже. У меня есть cancled toast также, чтобы предотвратить его отображение после выхода приложения.
Ответ 25
Немного лучший метод, чем Zefnus Я думаю. Вызовите System.currentTimeMillis() только один раз и опустите return; :
Ответ 26
Это то же самое, что и принятый и самый проголосовавший ответ, но этот отрезанный использовал Snackbar вместо Toast.
Ответ 27
Ответ 28
Для действия, имеющего Навигационный ящик, используйте следующий код для OnBackPressed()
Ответ 29
Я использую этот
использовать в событии onBackPressed
для секунд секунды требуется для закрытия, указанных милисекунд
Ответ 30
В этой ситуации Snackbar - лучший вариант, чем Toast, для отображения действия выхода. Вот метод с закусочной, который работает.
Михаил Манцуров запись закреплена
Arturka Bratka
Arturka, похоже глюк в телефоне, эти настройки появляются только при способе навигации жестами
Arturka Bratka ответил Михаилу
Михаил, ну да,то я не уточнил,жесты у вас или кнопки..обычно,при жестах требует повторить действия повторно..а для кнопок надо искать
Николай, спасибо, помогло
Ирина Корона
Максим Ефременко
Если я правильно понял,это почти в каждом приложении такое "подтверждение" о выходе из приложения
А вот как убрать не знаю,у меня нет его,на другом смарте было
Читайте также: