onclick 함수에서 'this'참조를 유지하면서 앵커 태그에서 onclick () 이벤트를 프로그래밍 방식으로 호출하려면 어떻게해야합니까?


83

다음은 작동하지 않습니다 ... (적어도 Firefox에서는 작동하지 않음 : document.getElementById('linkid').click()기능이 아님)

<script type="text/javascript">
    function doOnClick() {
        document.getElementById('linkid').click();
        //Should alert('/testlocation');
    }
</script>
<a id="linkid" href="/testlocation" onclick="alert(this.href);">Testlink</a>

답변:


110

apply해당 요소의 컨텍스트에서 이벤트 핸들러 가 필요합니다 .

var elem = document.getElementById("linkid");
if (typeof elem.onclick == "function") {
    elem.onclick.apply(elem);
}

그렇지 않으면 this위 코드가 실행되는 컨텍스트를 참조합니다.


3
나는 당신이 나를 바보로 보지 않는 유일한 사람이라고 생각합니다 (괄호 표기법 / onclick | click 브라우저 비 호환성에 대해서는 언급하지 않음). 에 딱 맞다!
Ropstah

3
이것을 고려하십시오 : howtocreate.co.uk/tutorials/javascript/domevents-onclick 함수를 호출 하면 등록 된 모든 이벤트 핸들러가 호출 됩니까? 또한 이벤트를 잘못 호출하면 해당 이벤트와 관련된 기본 작업 (예 : 양식 제출)이 생성되지 않습니다.
jrharshath

Gumbo,이 코드는-다른 결과를 생성하므로 여전히 Microsoft.Ajax 및 Microsoft.AjaxMvc 라이브러리에서 작동하지 않습니다 ....
Ropstah

1
apply()여기에서 사용 합니까? 당신은 할 수 elem.onclick();elem기능의 '이'참조가 될 것이다 - 간단!
하긴

19

이 문제를 해결하는 가장 좋은 방법은 Vanilla JS를 사용하는 것입니다.하지만 이미 jQuery를 사용하고 있다면 매우 쉬운 해결책이 있습니다.

<script type="text/javascript">
    function doOnClick() {
        $('#linkid').click();
    }
</script>
<a id="linkid" href="/testlocation" onclick="alert(this.href);">Testlink</a>

IE8-10, Chrome, Firefox에서 테스트되었습니다.


3
왜 반대표? 이유를 말씀해주세요. 문제가 있다고 생각되면 질문을 개선 할 수 있습니다.
luschn

1
당신이 영업 이익은 명시 적으로 질문에 언급하지 않은 경우, 나는 그것이 즉 downvote 동기를 부여한다는 생각 (jQuery와 같은 라이브러리와 같은) 외부 자원에 의존 답변을 제공하지해야한다는 유래에 적혀있다
vhoyer

2013 년에는 모두가 jquery를 사용하고 있었지만 요즘에는 동의 할 것입니다.
luschn

15

이벤트를 트리거하려면 기본적으로 해당 요소에 대한 이벤트 핸들러를 호출하면됩니다. 코드에서 약간 변경하십시오.

var a = document.getElementById("element");
var evnt = a["onclick"];

if (typeof(evnt) == "function") {
    evnt.call(a);
}

1
+1. 또한 인터넷 검색을 통해 foo.click ()이 IE 전용임을 알 수 있습니다. 물론 제가 틀릴 수 있습니다 ...
karim79

1
대괄호 표기법 ([ "onclick"])보다는 점 표기법 (.onclick)을 사용해야합니다.
Rudd Zwolinski

.onclick () 또는 .click () 둘 다 예상대로 작동하지 않습니다. Firefox .click (또는 bracked [ 'click'])에서는 "NOT A FUNCTION"입니다. 하지만 .onclick ()을 호출 할 때 "this"참조를 잃게됩니다 (실행 함수에 <a> 태그의 정보가 필요하기 때문에 ASP.NET MVC에서 필요합니다)
Ropstah

5
$("#linkid").trigger("click");

2
SO에 오신 것을 환영합니다. 이것이 작동하는 이유 (정확히하는 일 등)와 다른 솔루션과 다른 점에 대해 자세히 설명해 주시겠습니까?
m00am

2
왜이 답을 적어 두나요? jquery를 사용하는 경우이 페이지에서 가장 좋은 솔루션입니다 ... 하나의 라이너-이길 수 없습니다!
PodTech.io

1
대답은 jQuery를 필요가 없습니다
그렉 Perham

5

물론 OP는 이것이 작동하지 않는다고 매우 유사하게 언급했지만 나에게는 효과적이었습니다. 내 소스의 메모에 따르면 OP의 게시물 시간 또는 이후에 구현 된 것 같습니다. 아마도 이제 더 표준이 될 것입니다.

document.getElementsByName('MyElementsName')[0].click();

제 경우에는 버튼에 ID가 없었습니다. 요소에 ID가있는 경우 다음을 사용하는 것이 좋습니다.

document.getElementById('MyElementsId').click();

나는 원래이 방법을 시도했지만 작동하지 않았습니다. 인터넷 검색 후 다시 돌아와서 내 요소가 이름으로되어 있고 ID가 없다는 것을 깨달았습니다. 올바른 속성을 호출하고 있는지 다시 확인하십시오.

출처 : https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click


1

handleEvent 메소드 살펴보기
https://developer.mozilla.org/en-US/docs/Web/API/EventListener를

"원시"자바 스크립트 :

function MyObj() {
   this.abc = "ABC";
}
MyObj.prototype.handleEvent = function(e) {
   console.log("caught event: "+e.type);
   console.log(this.abc);
}

var myObj = new MyObj();

document.querySelector("#myElement").addEventListener('click', myObj);

이제 요소 (id "myElement"포함)를 클릭하면 콘솔에 다음이 인쇄됩니다.

잡힌 이벤트 : 클릭
ABC

이를 통해 개체 메서드를 이벤트 핸들러로 사용할 수 있으며 해당 메서드의 모든 개체 속성에 액세스 할 수 있습니다.

객체의 메서드를 addEventListener에 직접 전달할 수 는 없습니다 (예 :) . 일반적으로 객체에서 호출 된 것처럼 작동 element.addEventListener('click',myObj.myMethod);할 것으로 기대할 myMethod수 없습니다. addEventListener에 전달 된 모든 함수가 참조되는 대신 복사되었다고 생각합니다. 예를 들어 이벤트 리스너 함수 참조를 변수 형식으로 addEventListener에 전달한 다음이 참조를 설정 해제하면 이벤트가 포착 될 때 이벤트 리스너가 계속 실행됩니다.

메서드를 이벤트 리스너 및 stil로 전달하고 이벤트 리스너 this내에서 객체 속성에 계속 액세스 할 수있는 또 다른 (덜 우아한) 해결 방법은 다음과 같습니다.

// see above for definition of MyObj

var myObj = new MyObj();

document.querySelector("#myElement").addEventListener('click', myObj.handleEvent.bind(myObj));

1

오래된 스레드이지만 질문은 여전히 ​​관련이 있으므로 ...

(1) 귀하의 질문에있는 예제는 이제 Firefox에서 작동 합니다. 그러나 (경고를 표시합니다) 이벤트 핸들러를 호출뿐만 아니라, 그것은 ALSO (경고가 기각되면) 탐색을 일으키는 원인이되는 링크를 클릭.

(2)하기 JUST 단순히 대체 (탐색을 트리거하지 않고) 이벤트 핸들러를 호출

document.getElementById('linkid').click();

document.getElementById('linkid').onclick();

0

순전히 onclick 속성의 함수를 참조하기 위해 이것을 사용한다면 이것은 매우 나쁜 생각처럼 보입니다. 인라인 이벤트는 일반적으로 나쁜 생각입니다.

다음을 제안합니다.

function addEvent(elm, evType, fn, useCapture) {
    if (elm.addEventListener) {
        elm.addEventListener(evType, fn, useCapture);
        return true;
    }
    else if (elm.attachEvent) {
        var r = elm.attachEvent('on' + evType, fn);
        return r;
    }
    else {
        elm['on' + evType] = fn;
    }
}

handler = function(){
   showHref(el);
}

showHref = function(el) {
   alert(el.href);
}

var el = document.getElementById('linkid');

addEvent(el, 'click', handler);

다른 자바 스크립트 코드에서 동일한 함수를 호출하려면 클릭하여 함수를 호출하는 것이 최선의 방법이 아닙니다. 중히 여기다:

function doOnClick() {
   showHref(document.getElementById('linkid'));
}

'this'에 대한 참조를 유지하는 것입니다. 앵커 (.NET MVC)에서 onclick 부분 만 생성 할 수는 없습니다. 완전한 앵커 태그를 생성해야합니다. 이 태그는 onclick 함수에 완전히 필요합니다 (예 : href 속성 사용).
Ropstah

-1

일반적으로 이벤트 핸들러를 '수동'으로 호출하지 않는 것이 좋습니다.

  • 등록 된 여러 리스너로 인해 무엇이 실행되는지 불분명합니다.
  • 반복적이고 무한한 이벤트 루프에 들어갈 위험이 있습니다 (클릭 A는 클릭 B를 트리거하고 클릭 A는 트리거하는 등).
  • DOM에 대한 중복 업데이트
  • 사용자에 의한 뷰의 실제 변경 사항과 초기화 코드 (한 번만 실행되어야 함)로 변경된 사항을 구분하기가 어렵습니다.

더 나은 것은 정확히 당신이 원하는 것이 무엇인지 파악하고 그것을 함수에 넣고 수동으로 호출하고 이벤트 리스너로 등록하는 것입니다.


OP는 어떤 일을하는 가장 좋은 방법이 아니라 어떤 일을하는 방법을 물었습니다. 이것은 CodeReview가 아닙니다. 그의 질문에 답한 다음 면책 조항을 넣으면 다를 것입니다.
Tyler Montney
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.