Могу ли я вызвать jquery click(), чтобы перейти к ссылке <a>если я не привязал обработчик события к нему со связью или кликом уже?

У меня есть таймер в моем JavaScript, который должен эмулировать щелчок по ссылке, чтобы перейти на другую страницу по истечении времени. Для этого я использую функцию jQuery click(). Я также использовал $().trigger() и window.location, и я могу заставить его работать по назначению со всеми тремя.

Я наблюдал какое-то странное поведение с click(), и я пытаюсь понять, что происходит и почему.

Я использую Firefox для всего, что я описываю в этом вопросе, но меня также интересует, что другие браузеры будут делать с этим.

Если я не использовал $('a').bind('click',fn) или $('a').click(fn) для установки обработчика событий, то вызов $('a').click() кажется вообще недействительным. Он не вызывает обработчик по умолчанию для браузера для этого события, так как браузер не загружает новую страницу.

Однако, если я сначала устанавливаю обработчик событий, он работает так, как ожидалось, даже если обработчик событий ничего не делает.

$('a').click(function(){return true;}).click();

Это загружает новую страницу, как если бы я щелкнул сам.

Итак, мой вопрос двоякий: это странное поведение, потому что я что-то делаю неправильно? и почему вызов click() ничего не делает с поведением по умолчанию, если я не создал обработчик моего собственного?

EDIT:

Как выяснил Хоффман, когда он пытался дублировать мои результаты, результат, описанный выше, на самом деле не происходит. Я не уверен, что вызвало события, которые я наблюдал вчера, но сегодня я уверен, что это не то, что я описал в вопросе.

Итак, ответ заключается в том, что вы не можете "подделывать" клики в браузере и что все jQuery - это вызов обработчика событий. Вы можете использовать window.location для изменения страницы, и это отлично работает для меня.

Ответ 1

Интересно, что это, вероятно, "запрос функции" (т.е. ошибка) для jQuery. Событие кликов jQuery запускает действие элемента click (событие onClick на DOM) элемента, если вы привязываете событие jQuery к элементу. Вы должны перейти в списки рассылки jQuery (http://forum.jquery.com/) и сообщить об этом. Это может быть желаемое поведение, но я так не думаю.

EDIT:

Я провел некоторое тестирование, и то, что вы сказали, неверно, даже если вы привязываете функцию к тегу 'a', он все равно не доставляет вас на сайт, указанный атрибутом href. Попробуйте следующий код:

<html>
<head>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
 <script>
  $(document).ready(function() {
   /* Try to dis-comment this:
   $('#a').click(function () {
    alert('jQuery.click()');
    return true;
   });
   */
  });
  function button_onClick() {
   $('#a').click();
  }
  function a_onClick() {
   alert('a_onClick');
  }
 </script>

</head>
<body>
 <input type="button" onclick="button_onClick()">
 <br>
 <a id='a' href='http://www.google.com' onClick="a_onClick()"> aaa </a>

</body>
</html> 

Он никогда не отправляется на google.com, если вы не нажмете на ссылку (с или без комментария кода). Также обратите внимание, что даже если вы привязываете событие click к ссылке, оно все равно не будет пурпурно, как только вы нажмете кнопку. Он просто фиолетовый, если вы нажмете ссылку напрямую.

Я провел некоторое исследование, и кажется, что .click не должен работать с тегами 'a', потому что браузер не поддерживает "поддельный щелчок" с помощью javascript. Я имею в виду, вы не можете "click" элемент с javascript. С помощью тегов "a" вы можете инициировать событие onClick, но ссылка не изменит цвета (к цвету посещенных ссылок, по умолчанию в большинстве браузеров фиолетовый). Таким образом, было бы нецелесообразно сделать операцию $(). Click event работать с тегами 'a', поскольку действие перехода к атрибуту href не является частью события onClick, а жестко закодировано в браузере.

Ответ 2

Другим вариантом является, конечно, просто использовать vanilla javascript:

document.getElementById("a_link").click()

Ответ 3

Если вы посмотрите на код для функции $.click, я готов поспорить, что существует условная инструкция, которая проверяет, имеет ли элемент прослушивание зарегистрированных для события click, прежде чем оно будет продолжено. Почему бы просто не получить атрибут href из ссылки и вручную изменить местоположение страницы?

 window.location.href = $('a').attr('href');

EDIT: вот почему он не щелкает через функцию trigger, источник jQuery для версии 1.3.2:

 // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
    if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
        event.result = false;

    // Trigger the native events (except for clicks on links)
    if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
        this.triggered = true;
        try {
            elem[ type ]();
        // prevent IE from throwing an error for some hidden elements
        } catch (e) {}
    }

После вызова обработчиков (если они есть) jQuery запускает событие на объекте. Однако он вызывает вызовы только для обработчиков щелчков, если элемент не является ссылкой. Я думаю, это было сделано целенаправленно по какой-то причине. Это должно быть правдой, если определен какой-либо обработчик события или нет, поэтому я не уверен, почему в вашем случае привязка обработчика события вызвала вызов обработчика native onClick. Вам нужно будет сделать то, что я сделал, и выполнить выполнение, чтобы увидеть, где он вызывается.

Ответ 4

Обработчики кликов на якорных тегах являются особым случаем в jQuery.

Я думаю, что вы можете запутаться между якорем onclick-событием (известным браузером) и событием click объекта jQuery, который обертывает представление DOM привязанного тега.

Вы можете скачать источник jQuery 1.3.2 здесь.

Соответствующими разделами являются строки 2643-2645 (я разделил это на несколько строк, чтобы было легче понять):

// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
if (
     (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && 
       elem["on"+type] && 
       elem["on"+type].apply( elem, data ) === false
   )
     event.result = false;

Ответ 5

Запустите элемент гиперссылки, который находится внутри элемента, который вы хотите подключить jquery.click()

<div class="TopicControl">
    <div class="articleImage">
       <a href=""><img src="" alt=""></a>
    </div>
</div>

В script вы подключаетесь к основному контейнеру, в который вы хотите включить событие click. Затем вы используете стандартную методологию jquery, чтобы найти элемент (тип, класс, идентификатор) и запустить клик. Случается, что jquery вводит рекурсивную функцию для запуска щелчка, и вы прерываете рекурсивную функцию, перебирая функцию "e" и stopPropagation() и возвращаете false, потому что вы не хотите, чтобы jquery выполнял что-либо еще, кроме как запустить ссылку.

$('.TopicControl').click(function (event) {
         $(this).find('a').click();
        event.stopPropagation();
        return false;
     });

Альтернативное решение состоит в том, чтобы обернуть контейнеры в элемент и разместить в качестве контейнеров внутри вместо 's. Установите промежутки для отображения блока в соответствии со стандартами w3c.

Ответ 6

JS/jQuery не поддерживает поведение по умолчанию ссылок "щелкнуло" программно.

Что вы можете сделать, это создать форму и отправить ее. Таким образом, вам не нужно использовать window.location или window.open, которые часто блокируются как нежелательные всплывающие окна браузерами.

Этот script имеет 2 разных метода: один, который пытается открыть 3 новых вкладки/окна (он открывается только 1 в IE и Chrome, подробнее см. ниже) и тот, который запускает настраиваемое событие при нажатии ссылки.

Вот как:

HTML

<html>
<head>
    <script src="jquery-1.9.1.min.js" type="text/javascript"></script>
    <script src="script.js" type="text/javascript"></script>
</head>
<body>
    <button id="testbtn">Test</button><br><br>

    <a href="https://google.nl">GOOGLE</a><br>
    <a href="http://en.wikipedia.org/wiki/Main_Page">WIKI</a><br>
    <a href="https://stackoverflow.com/">SO</a>
</body>
</html>

jQuery (script.js)

$(function()
{ 
    // Try to open all 3 links by pressing the button
    // - Firefox opens all 3 links
    // - Chrome only opens 1 of them without popup warning
    // - IE only opens 1 of them WITH popup warning
    $("#testbtn").on("click", function()
    {
        $("a").each(function()
        {
            var form = $("<form></form>");
            form.attr(
            {
                id     : "formform",
                action : $(this).attr("href"),
                method : "GET",
                // Open in new window/tab
                target : "_blank"
            });

            $("body").append(form);
            $("#formform").submit();
            $("#formform").remove();
        });
    });

    // Or click the link and fire a custom event 
    // (open your own window without following the link itself)
    $("a").on("click", function()
    {
        var form = $("<form></form>");
        form.attr(
        {
            id     : "formform",
            // The location given in the link itself
            action : $(this).attr("href"), 
            method : "GET",
            // Open in new window/tab
            target : "_blank"              
        });

        $("body").append(form);
        $("#formform").submit();
        $("#formform").remove();

        // Prevent the link from opening normally
        return false;
    });

});

Что он делает для каждого элемента ссылки:

  • Создать форму
  • Дайте ему атрибуты
  • Добавьте его в DOM, чтобы он мог быть отправлен
  • Отправить
  • Удалите форму из DOM, удалив все следы * Вставьте злой смех *

Теперь у вас есть новая вкладка/окно загрузки "https://google.nl" (или любой URL-адрес, который вы хотите, просто замените его). К сожалению, когда вы пытаетесь открыть несколько окон таким образом, вы получаете сообщение Popup blocked при попытке открыть второй (первый из них все еще открыт).


Подробнее о том, как я получил этот метод, можно найти здесь:

Открытие нового окна/вкладки без использования window.open или window.location.href

Ответ 7

Он ничего не делает, потому что никаких событий не было связано с событием. Если я правильно помню, jQuery поддерживает собственный список обработчиков событий, привязанных к NodeLists для производительности и других целей.

Ответ 8

Если вам нужна эта функция для одного случая или очень мало кассет. (ваше приложение не требует этой функции) Я бы предпочел оставить jQuery как есть (по многим причинам, включая возможность обновления до более новых версий, CDN и т.д.) и иметь следующее обходное решение:

// For modren Browsers
$(ele).trigger("click");

// Relaying on Paul Irish conditional class names http://bit.ly/HWIpAp (via HTML5 Boilerplate http://bit.ly/HUzi3I) where each IE version gets a class of its Version
$("html.ie7").length && (function(){
    var eleOnClickattr = $(ele).attr("onclick") 
    eval(eleOnClickattr);
  })()

Ответ 9

Чтобы открыть гиперссылку на той же вкладке, используйте:

$(document).on('click', "a.classname", function() {
    var form = $("<form></form>");
    form.attr(
    {
        id     : "formid",
        action : $(this).attr("href"),
        method : "GET",
    });

    $("body").append(form);
    $("#formid").submit();
    $("#formid").remove();
    return false;
});

Ответ 10

Вы можете использовать jQuery для выбора объекта jQuery для этого элемента. Затем получите базовый элемент DOM и вызовите его метод click().

по id

$("#my-link").each(function (index) { $(this).get(0).click() });

или используйте jQuery, чтобы щелкнуть кучу ссылок по классу CSS

$(".my-link-class").each(function (index) { $(this).get(0).click() });