바인드 또는 이벤트 클릭으로 이벤트 핸들러를 바인딩하지 않은 경우 jquery click ()을 호출하여 <a> 링크를 따라갈 수 있습니까?


175

JavaScript에 타이머가 있는데 시간이 지나면 링크를 클릭하여 다른 페이지로 이동해야합니다. 이를 위해 jQuery의 click()기능을 사용하고 있습니다. 나는 또한 사용 $().trigger()했으며 window.location세 가지 모두에서 의도 한대로 작동하도록 만들 수 있습니다.

나는 이상한 행동을 관찰 click()했으며 어떤 일이 발생하고 왜 발생했는지 이해하려고 노력하고 있습니다.

이 질문에서 설명하는 모든 것에 Firefox를 사용하고 있지만 다른 브라우저에서이 작업을 수행하는 데 관심이 있습니다.

이벤트 핸들러를 사용하지 $('a').bind('click',fn)않거나 $('a').click(fn)설정 $('a').click()하지 않으면 호출 이 전혀 수행하지 않는 것 같습니다. 브라우저는 새 페이지를로드하지 않으므로이 이벤트에 대한 브라우저의 기본 핸들러를 호출하지 않습니다.

그러나 이벤트 핸들러를 먼저 설정하면 이벤트 핸들러가 아무것도하지 않더라도 예상대로 작동합니다.

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

마치 자신을 클릭 한 것처럼 새 페이지가로드됩니다.

그래서 내 질문은 두 가지입니다. 어딘가에서 잘못하고 있기 때문에이 이상한 행동입니까? click()내 자신의 처리기를 만들지 않은 경우 호출 이 기본 동작으로 아무 것도 수행하지 않는 이유는 무엇입니까?

편집하다:

호프만이 결과를 복제하려고 할 때 결정한 것처럼 위에서 설명한 결과는 실제로 발생하지 않습니다. 어제 관찰 한 사건의 원인이 무엇인지 확실하지 않지만, 오늘 질문에 설명 된 내용이 아니라고 확신합니다.

따라서 대답은 브라우저에서 클릭을 "가짜"클릭 할 수 없으며 모든 jQuery가 이벤트 처리기를 호출하는 것입니다. 여전히 window.location페이지를 변경 하는 데 사용할 수 있으며 저에게 잘 작동합니다.


답변:


90

흥미롭게도 이것은 jQuery에 대한 "기능 요청"(즉, 버그) 일 것입니다. jQuery 이벤트를 요소에 바인딩하는 경우 jQuery 클릭 이벤트는 요소에서 클릭 동작 (DOM에서 onClick 이벤트라고 함) 만 트리거합니다. jQuery 메일 링리스트 ( http://forum.jquery.com/ ) 로 이동하여 이를보고해야합니다. 이것은 원하는 행동 일 수도 있지만 그렇게 생각하지는 않습니다.

편집하다:

나는 몇 가지 테스트를했는데 당신이 말한 것이 잘못되었습니다. 함수를 '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이 'a'태그와 함께 작동한다고 가정하지 않는 것 같습니다. 자바 스크립트로 요소를 "클릭"할 수 없습니다. 'a'태그를 사용하면 onClick 이벤트를 트리거 할 수 있지만 링크의 색상은 변경되지 않습니다 (방문한 링크 색상의 경우 대부분의 브라우저에서 기본값은 자주색). href 속성으로 이동하는 행위는 onClick 이벤트의 일부가 아니라 브라우저에서 하드 코딩되기 때문에 $ (). click 이벤트가 'a'태그와 함께 작동하도록하는 것은 의미가 없습니다.


7
나는 당신의 코드를 시도했고, 당신이 말한대로 정확하게 수행하지만, 내 코드는 위에서 설명한대로 수행합니다. 좀 더 실험을 해보고 시도 할 수있는 간단한 결과를 모을 수 있는지 살펴 보겠습니다.
Mnebuerquo

1
확인. 내가 잘못한 일이었을 것입니다. 나는 그것이 작동한다는 내 질문을 게시 할 때 절대적으로 확신했지만, 당신의 모범을 시도한 이후 더 이상 작동하지 않습니다. window.location을 사용하여 페이지를 변경하고 클릭을 속이려고하지 않습니다.
Mnebuerquo

실제로 click ()은 가짜 클릭을 생성하기위한 것이 아니라 때로는 자바 스크립트 삽입으로 버튼이나 양식을 클릭하거나 기존 자바 스크립트 함수 위에 임시 핫키를 만드는 동안 편의를 위해 사용할 수 있습니다.
Aero Wang

241

다른 옵션은 물론 바닐라 자바 ​​스크립트를 사용하는 것입니다.

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

1
Safari에서는 작동하지 않으며 HTML 사양에 따라 입력 만 구현하면됩니다.
Jeremy Kauffman 2013

4
댕! 이 작동합니다! 그러나 jquery 요소를 사용하고 있기 때문에 "바닐라"자바 스크립트가 아니라고 말해야합니다. 따라서 일종의 바닐라 jquery 자바 스크립트입니다. Firefox 24 및 IE 10에서 작동합니다.
bgmCoder

@ BGM, 좋습니다.하지만 click ()은 jquery 요소에 없습니다. getElementById ( ".."). click ()
Peter

와우 상처 가득, 내가 예상대로 작동합니다. +1 : :). 다른 사용자의 경우 다음과 같이 사용할 수도 있습니다. var lnk = document.getElementById ( "a_link"); if (lnk == null) {// 일부 작업 ......} else {lnk.click (); }
Iqbal

다양한 브라우저에서 테스트 한 IE10 & Jquery 1.6.4는이를 처리 할 수 ​​없습니다.
Hannes Schneidermayer

65

$.click함수 의 코드를 보면 click이벤트가 진행되기 전에 요소에 이벤트에 리스너가 등록되어 있는지 확인하는 조건문이 있습니다. 왜 href링크 에서 속성을 가져 와서 수동으로 페이지 위치를 변경하지 않습니까?

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

편집 : 다음은 trigger버전 1.3.2의 jQuery 소스 함수 에서 클릭하지 않는 이유입니다 .

 // 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는 객체에서 이벤트를 트리거합니다. 그러나 요소가 링크가 아닌 경우 클릭 이벤트에 대한 기본 핸들러 만 호출합니다. 나는 이것이 어떤 이유로 의도적으로 이루어진 것 같아요. 이벤트 핸들러가 정의되어 있는지 여부에 관계없이 이것은 사실이므로 이벤트 핸들러를 연결하면 기본 onClick핸들러가 호출 된 이유를 모르겠습니다 . 내가 한 일을 수행하고 실행을 단계별로 수행하여 호출되는 위치를 확인해야합니다.


질문에서 언급 한대로 window.location 및 href를 사용할 수 있습니다. jquery click ()에서 발생하는 결과와 내가 관찰 한 결과의 원인을 이해하려고합니다.
Mnebuerquo

jQuery 소스에서 링크의 $ .click () 호출을 처리하는 위치를 표시하도록 답변을 편집했습니다.
Ryan Lynch

2
window.location은 작동하지만 HTTP Referrer를 게시하지는 않으며 뒤로 버튼을 끊습니다.
Chase Seibert

5

앵커 태그의 클릭 핸들러는 jQuery에서 특별한 경우입니다.

앵커의 onclick 이벤트 (브라우저가 알고 있음)와 앵커 태그의 DOM 개념을 래핑하는 jQuery 객체의 click 이벤트 사이에 혼란 스러울 수 있다고 생각합니다.

여기 에서 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

JS / jQuery는 프로그래밍 방식으로 "클릭 된"링크의 기본 동작을 지원하지 않습니다.

할 수있는 일은 양식을 만들어 제출하는 것입니다. 이 방법으로 당신은 window.location또는window.open 자주 브라우저에 의해 원치 않는 팝업으로 차단되는.

이 스크립트에는 두 가지 방법이 있습니다. 하나는 3 개의 새로운 탭 / 윈도우를 열려고 시도하는 것입니다 (IE와 Chrome에서는 1 개만 열고 아래 정보가 더 있음).

방법은 다음과 같습니다.

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;
    });

});

그것이하는 일은 각 링크 요소에 대한 것입니다.

  1. 양식 만들기
  2. 속성을 부여하십시오
  3. 제출할 수 있도록 DOM에 추가
  4. 제출
  5. DOM에서 양식을 제거하고 모든 흔적을 제거하십시오 * 악한 웃음 삽입 *

이제 새로운 탭 / 창 로딩 "https://google.nl"(또는 원하는 URL, 교체하십시오)이 있습니다. 불행히도이 방법으로 둘 이상의 창 Popup blocked을 열려고하면 두 번째 창 을 열려고 할 때 메시지 표시 줄이 나타납니다 (첫 번째 창이 여전히 열려 있음).


이 방법에 대한 자세한 정보는 여기에서 찾을 수 있습니다.

사용하지 않고 새 창 / 탭 열기 window.open또는window.location.href


3

jquery를 연결하려는 요소 안에있는 하이퍼 링크 요소를 트리거하십시오.

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

스크립트에서 클릭 이벤트를 원하는 기본 컨테이너에 연결합니다. 그런 다음 표준 jquery 방법을 사용하여 요소 (유형, 클래스, ID)를 찾아 클릭을 발생시킵니다. jquery는 재귀 함수를 입력하여 클릭을 발생시키고 이벤트 'e'및 stopPropagation () 함수를 사용하여 재귀 함수를 중단하고 jquery가 다른 작업을 수행하지 않고 링크를 발생시키기를 원하므로 false를 반환합니다.

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

다른 해결책은 용기를 요소에 싸고를 대신 용기 안에 넣는 것입니다. w3c 표준을 준수하도록 스팬을 표시 블록으로 설정하십시오.


3

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() });

2

이벤트에 바인딩 된 이벤트가 없으므로 아무 것도 수행하지 않습니다. 올바르게 기억하면 jQuery는 성능 및 기타 목적으로 NodeList에 바인딩 된 자체 이벤트 핸들러 목록을 유지 관리합니다.


2

한 경우 또는 매우 적은 수의 케이스에이 기능이 필요한 경우. (당신은 전체 응용 프로그램 에이 기능이 필요하지 않습니다) jQuery를 그대로두고 (새로운 버전, CDN 등으로 업데이트 할 수있는 것을 포함하여 여러 가지 이유로) 다음과 같은 해결 방법이 있습니다.

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

// Relaying on Paul Irish's 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);
  })()

1

동일한 탭에서 하이퍼 링크를 열려면 다음을 사용하십시오.

$(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;
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.