В моем JavaScript есть таймер, который должен эмулировать нажатие на ссылку, чтобы перейти на другую страницу по истечении этого времени. Для этого я использую click()
функцию jQuery . Я использовал, $().trigger()
а window.location
также, и я могу заставить его работать как задумано со всеми тремя.
Я наблюдал странное поведение click()
и пытаюсь понять, что происходит и почему.
Я использую Firefox для всего, что я описываю в этом вопросе, но мне также интересно, что другие браузеры будут делать с этим.
Если я не использовал $('a').bind('click',fn)
или $('a').click(fn)
для установки обработчика событий, то, $('a').click()
кажется, вызов вообще ничего не делает. Он не вызывает обработчик браузера по умолчанию для этого события, так как браузер не загружает новую страницу.
Однако, если я сначала установлю обработчик событий, он будет работать, как и ожидалось, даже если обработчик событий ничего не делает.
$('a').click(function(){return true;}).click();
Это загружает новую страницу, как будто я нажал на себя.
Поэтому мой вопрос двоякий: это странное поведение, потому что я где-то делаю что-то не так? и почему вызов click()
ничего не делает с поведением по умолчанию, если я не создал собственный обработчик?
РЕДАКТИРОВАТЬ:
Как определил Хоффман, когда он пытался дублировать мои результаты, результат, который я описал выше, на самом деле не происходит. Я не уверен, что вызвало события, которые я наблюдал вчера, но сегодня я уверен, что это было не то, что я описал в вопросе.
Таким образом, ответ заключается в том, что вы не можете «фальсифицировать» клики в браузере и что все, что делает jQuery - это вызывает ваш обработчик событий. Вы все еще можете использовать, window.location
чтобы изменить страницу, и это прекрасно работает для меня.
Ответы:
Интересно, что это, вероятно, «запрос функции» (т.е. ошибка) для jQuery. Событие jQuery click запускает только действие click (называемое событием onClick в DOM) для элемента, если вы связываете событие jQuery с элементом. Вы должны перейти в списки рассылки jQuery ( http://forum.jquery.com/ ) и сообщить об этом. Это может быть желаемое поведение, но я так не думаю.
РЕДАКТИРОВАТЬ:
Я провел некоторое тестирование, и то, что вы сказали, неверно, даже если вы привязали функцию к тегу «a», она все равно не приведет вас на сайт, указанный атрибутом href. Попробуйте следующий код:
Он никогда не переходит на google.com, если вы не нажмете ссылку напрямую (с комментарием или без него). Также обратите внимание, что даже если вы связываете событие click со ссылкой, оно все равно не станет фиолетовым после нажатия кнопки. Он станет фиолетовым, если вы нажмете ссылку напрямую.
Я провел некоторое исследование, и кажется, что .click не должен работать с тегами «a», потому что браузер не поддерживает «поддельные клики» с javascript. Я имею в виду, вы не можете «щелкнуть» по элементу с помощью JavaScript. С помощью тегов «a» вы можете вызвать событие onClick, но ссылка не изменит цвета (на цвет посещенной ссылки по умолчанию фиолетовый цвет в большинстве браузеров). Поэтому не имеет смысла заставлять событие $ (). Click работать с тегами «a», поскольку переход к атрибуту href не является частью события onClick, а жестко запрограммирован в браузере.
источник
Другой вариант, конечно, просто использовать ванильный JavaScript:
источник
Если вы посмотрите на код
$.click
функции, то, держу пари, есть условный оператор, который проверяет, зарегистрированы ли у элемента прослушиватели, зарегистрированные дляclick
события, прежде чем оно продолжится. Почему бы просто не получитьhref
атрибут по ссылке и вручную изменить местоположение страницы?РЕДАКТИРОВАТЬ: Вот почему он не щелкает через
trigger
функцию, источник jQuery для версии 1.3.2:После вызова обработчиков (если они есть) jQuery вызывает событие на объекте. Однако он вызывает собственные обработчики для событий щелчка, только если элемент не является ссылкой. Я думаю, это было сделано целенаправленно по какой-то причине. Это должно быть верно, независимо от того, определен обработчик события или нет, поэтому я не уверен, почему в вашем случае присоединение обработчика события вызвало
onClick
вызов собственного обработчика. Вы должны будете сделать то, что я сделал, и пройти через выполнение, чтобы увидеть, где он вызывается.источник
Обработчики щелчков на тегах привязки - это особый случай в jQuery.
Я думаю, вы можете запутаться между событием onclick привязки (известным браузеру) и событием click объекта jQuery, который оборачивает понятие DOM тега привязки.
Вы можете скачать исходный код jQuery 1.3.2 здесь .
Соответствующими разделами источника являются строки 2643-2645 (я разделил это на несколько строк, чтобы было легче понять):
источник
JS / jQuery не поддерживает стандартное поведение ссылок, «щелкаемых» программно.
Что вы можете сделать, это создать форму и отправить ее. Таким образом, вам не нужно использовать
window.location
илиwindow.open
, которые часто блокируются как нежелательные всплывающие окна в браузерах.Этот сценарий имеет 2 различных метода: один, который пытается открыть 3 новые вкладки / окна (он открывает только 1 в IE и Chrome, дополнительную информацию см. Ниже), и другой, который запускает пользовательское событие при щелчке по ссылке.
Вот как:
HTML
jQuery (script.js)
Что он делает для каждого элемента ссылки:
Теперь у вас есть новая вкладка / окно загрузки
"https://google.nl"
(или любой URL, который вы хотите, просто замените его). К сожалению, когда вы пытаетесь открыть более одного окна таким образом, вы получаетеPopup blocked
панель сообщений при попытке открыть второе (первое все еще открыто).Более подробную информацию о том, как я получил этот метод можно найти здесь:
Открытие нового окна / вкладки без использования
window.open
илиwindow.location.href
источник
Запустите элемент гиперссылки, который находится внутри элемента, который вы хотите подключить jquery .click ()
В вашем скрипте вы подключаетесь к основному контейнеру, на котором вы хотите событие click. Затем вы используете стандартную методологию jquery, чтобы найти элемент (тип, класс, id) и выполнить щелчок. Происходит следующее: jquery вводит рекурсивную функцию для запуска клика, и вы прерываете рекурсивную функцию, беря событие 'e' и функцию stopPropagation (), и возвращаете false, потому что вы не хотите, чтобы jquery делал что-то еще, кроме запуска ссылки.
Альтернативное решение состоит в том, чтобы обернуть контейнеры в элемент и поместить внутри себя контейнеры вместо контейнеров. Установите промежутки для отображения блока в соответствии со стандартами W3C.
источник
Вы можете использовать jQuery для выбора объекта jQuery для этого элемента. Затем получите базовый элемент DOM и вызовите его
click()
метод.по идентификатору
или используйте jQuery, чтобы щелкнуть по группе ссылок по классу CSS
источник
Это ничего не делает, потому что никакие события не были связаны с событием. Если я правильно помню, jQuery поддерживает свой собственный список обработчиков событий, которые связаны с NodeLists для производительности и других целей.
источник
Если вам нужна эта функция для одного случая или очень мало случаев. (все ваше приложение не требует этой функции) Я бы предпочел оставить jQuery как есть (по многим причинам, включая возможность обновления до более новых версий, CDN и т. д.) и иметь следующий обходной путь:
источник
Чтобы открыть гиперссылку в той же вкладке, используйте:
источник