Как вызвать событие клика на элементе href

80

Я пытаюсь вызвать событие щелчка по гиперссылке с помощью jQuery, как показано ниже. У гиперссылки нет идентификатора, но есть класс css

 $(document).ready(function () {  $('.cssbuttongo').trigger('click'); }); 

Вышеуказанная функция не работает. Это гиперссылка

<a href="hyperlinkurl" class="cssbuttongo">hyperlink anchor</a>
МонстрMMORPG
источник
1
Поскольку класс может применяться к нескольким элементам в модели DOM, запускать щелчок по ним - не лучший вариант.
Игорь Парра
1
NomikOS, вы совершенно правы, но я проверил, использует ли какой-либо другой элемент этот класс css :)
MonsterMMORPG
1
stackoverflow.com/questions/7999806/…
Джош Крозье,

Ответы:

78

У меня нет фактических данных, подтверждающих это, но я уже сталкивался с этой проблемой. Кажется, что запуск события click () для <a>тега не ведет себя так, как вы ожидаете, скажем, с кнопкой ввода.

Обходной путь, который я использовал, заключался в установке свойства location.href в окне, которое заставляет браузер загружать ресурс запроса следующим образом:

$(document).ready(function()
{
      var href = $('.cssbuttongo').attr('href');
      window.location.href = href; //causes the browser to refresh and load the requested url
   });
});

Редактировать:

Я бы сделал скрипку js, но характер вопроса, смешанный с тем, как jsfiddle использует iframe для рендеринга кода, делает это непозволительным.

Мэттью Кокс
источник
Это правильный ответ. спасибо :) Еще заметил, что клик по href не работает.
MonsterMMORPG
@MonsterMMorpg Имейте в виду, что это не приводит к тому, что браузер считает, что это прямое действие пользователя. Так что используйте с умом = D
Мэтью Кокс
Разве это не должно быть var href = $ ('. Cssbuttongo'). Attr ('href');
Люси
7
Это игнорирует возможность того, что ссылка также имеет onclickсобытие. Просто сделайте так, $('.cssbuttongo')[0].click()чтобы правильно имитировать щелчок в целом.
Роман Старков
На самом деле он работает только с полным href. Поскольку я не смог разместить здесь код, прочтите, пожалуйста, мой ответ на этот пост.
Алан Донг
210

Собственный метод DOM поступает правильно:

$('.cssbuttongo')[0].click();
                  ^
              Important!

Это работает независимо от того, hrefявляется ли это URL-адресом, фрагментом (например #blah) или даже javascript:.

Обратите внимание, что это вызывает clickметод DOM вместо метода jQuery click(который является очень неполным и полностью игнорирует href).

Роман Старков
источник
2
@Timwi, я хотел сказать, что первый $('.cssbuttongo').click(); // ignores href!не гарантирует работы. Последний будет работать всегда, потому что использование index [0] превратит объект jQuery в обычный объект JS, который точно такой же, как в браузере. @Wei Liu
Alan Dong
1
Потрясающе! Очень прямой и наглядный ответ.
caiosm1005
11
Это должен быть выбранный ответ. Сработало отлично!
Amit G
3
@AdilMalik Это работает, потому что jquery - не единственное, что имеет метод click (). Этот код вызывает метод click (), не связанный с jquery, это нативная вещь DOM.
Роман Старков
1
@Timwi Я предоставляю jsfiddle здесь: jsfiddle.net/NabiKAZ/3gv90od5
Nabi KAZ
31

В дополнение к отличному ответу romkyns ... вот несколько соответствующих документов / примеров.


Элементы DOM имеют собственный .click()метод .

HTMLElement.click()Метод имитирует щелчок мыши на элементе.

Когда используется щелчок, он также запускает событие щелчка элемента, которое всплывает до элементов выше по дереву документа (или цепочке событий), а также запускает их события щелчка. Однако всплытие события щелчка не заставит <a>элемент инициировать навигацию, как если бы был получен настоящий щелчок мыши. (ссылка mdn)

Соответствующая документация W3 .


Несколько примеров ..

  • Вы можете получить доступ к определенному элементу DOM из объекта jQuery: (пример)

      $('a')[0].click();
    
  • Вы можете использовать этот .get()метод для извлечения элемента DOM из объекта jQuery: (пример)

      $('a').get(0).click();
    
  • Как и ожидалось, вы можете выбрать элемент DOM и вызвать .click()метод. (пример)

      document.querySelector('a').click();
    

Стоит отметить, что jQuery не требуется для запуска собственного .click()события.

Джош Крозье
источник
4

При инициировании клика через JavaScript гиперссылка не открывается. Это мера безопасности, встроенная в браузер.

Однако см. Этот вопрос для некоторых обходных путей.

Blazemonger
источник
1
Я так не думаю .. ПОТОМУ ЧТО: Я НАШЕЛ ЕГО РАБОТАЮТ ТАК
Коди
3
@CodyDmd, который все еще является событием клика, инициированным пользователем. Не то же самое, что исходный вопрос OP.
Blazemonger 05
@CodyDmd Кажется, [0]это важно в твоей скрипке
Вэй Лю
3
От какой именно уязвимости это защищает?
Роман Старков
3
Ну, я не понимаю, что вы имеете в виду, Blazemonger, потому что такой защиты от загрузок или мошенничества с SEO-кликами нет ни в Firefox, ни в Chrome, ни в IE11. Другими словами, и первое, и второе предложение вашего ответа неверны .
Роман Старков
3

Просто хочу сообщить вам, что принятый ответ не всегда работает.

Вот пример, он потерпит неудачу.

если <href='/list'>

href = $('css_selector').attr('href')
"/list"
href = document.querySelector('css_selector').href
"http://localhost/list"

или вы можете добавить href, полученный от jQuery, к этому

href = document.URL +$('css_selector').attr('href');

или способ jQuery

href = $('css_selector').prop('href')

Наконец, вызовите его, чтобы изменить URL-адрес текущей страницы браузера.

window.location.href = href

или вытащите его, используя window.open(url)

Вот пример на JSFiddle.

Алан Донг
источник
Так вы говорите, что это не работает, если вы измените его на $('css_selector')[0].click()? Это работает в этом JsFiddle ...
Роман Старков
Для справки, это не я проголосовал против; Я думаю, что здесь может быть что-то, но я еще не уверен.
Роман Старков
@romkyns, Конечно, он будет работать после того, как вы извлечете из элементов jQuery, используя [0] (он станет чистым JS), я хотел сказать $('.cssbuttongo').click();, не будет работать, потому что он дает только любое значение href вместо URL-адреса браузер использует. Извините за вводящие в заблуждение комментарии.
Алан Донг
2
@LinDong: Если вы знаете, что это [0].click()работает, почему в вашем ответе об этом не упоминается?
Timwi
location.hrefпринимает относительные пути, поэтому при использовании /listавтоматически добавляется текущий домен. Так что это работает.
Тим
-1

Я столкнулся с аналогичной проблемой, как нажать кнопку вместо ссылки. Это не помогло в методах .trigger ('click') или [0] .click (), и я не знал почему. Наконец-то у меня работало следующее:

$('#elementid').mousedown();
Генри
источник