href 및 onclick의 JavaScript 함수


474

리디렉션없이 클릭으로 간단한 JavaScript 함수를 실행하고 싶습니다.

JavaScript 호출을 href속성 에 넣는 것과 다른 점이 있습니까?

<a href="javascript:my_function();window.print();">....</a>

) 대 onclick속성에 넣는 것 ( onclick이벤트에 바인딩 )?


5
이 질문은 전에 논의되었습니다 : stackoverflow.com/questions/245868/…
SolutionYogi

답변:


276

href 내에 onclick을 넣으면 콘텐츠를 행동 / 행동과 분리시키는 것을 강력하게 믿는 사람들이 기분을 상하게 할 수 있습니다. 논란은 귀하의 HTML 컨텐츠가 프리젠 테이션이나 행동이 아닌 컨텐츠에만 집중해야한다는 것입니다.

요즘 일반적인 경로는 자바 스크립트 라이브러리 (예 : jquery)를 사용하고 해당 라이브러리를 사용하여 이벤트 핸들러를 만드는 것입니다. 다음과 같이 보일 것입니다 :

$('a').click( function(e) {e.preventDefault(); /*your_code_here;*/ return false; } );

1
또는 mootools, prototype, dojo ... 또는 javascript에 대한 평범하지만 훨씬 더 많은 코드이지만 운동 가치는 있습니다.
라이언 플로렌스

15
이벤트 객체와 관련이없는 경우 일반 자바 스크립트는 매우 간단합니다. obj = document.getElementById ()로 DOM 노드를 가져온 다음 obj.onclick = foo를 설정하십시오.
Matt Bridges

1
<a href>가 팝업 창에서 즉석에서 생성되고 여전히 특별한 클릭 동작이 필요할 때 컨텐츠를 분리하는 것은 어떻습니까?
서지

6
그러나 JS 호출을 인라인으로 넣는 href것과 인라인으로 넣는 것의 차이점에 대해 묻는 질문은 없었 onclick습니까? 어떤 이유로 인라인으로 넣을 것이라고 가정하면 어떤 것을 사용해야합니까? (실제로 나는 당신이 제시 한 것을 할 것입니다,하지만 당신은 두 속성의 차이를 통해 건너 뛸 것 같다.)
NNNNNN

1
함수 호출을 인라인으로 넣는 것과 링크에 대한 onclick 이벤트를 두는 것을 옹호하는 한 번은 페이지에서 모두 동일한 함수를 호출하지만 고유 ID가 없을 수있는 링크를 동적으로 작성하는 경우입니다. 사용자가 항목을 추가하고 제거 할 수있는 웹 양식이 있으며 동적으로 생성 된 div 내에서 링크의 href에 onclick을 넣으므로 상대적 ID 나 덜 구체적인 것을 사용하는 대신 스크립트 처리를 더 빨리 시작할 수 있습니다 수업 이름.
MistyDawn

976

나쁜:

<a id="myLink" href="javascript:MyFunction();">link text</a>

좋은:

<a id="myLink" href="#" onclick="MyFunction();">link text</a>

보다 나은:

<a id="myLink" href="#" onclick="MyFunction();return false;">link text</a>

더 나은 1 :

<a id="myLink" title="Click to do something"
 href="#" onclick="MyFunction();return false;">link text</a>

더 나은 2 :

<a id="myLink" title="Click to do something"
 href="PleaseEnableJavascript.html" onclick="MyFunction();return false;">link text</a>

왜 더 좋아? return false브라우저가 링크를 따라 가지 못하게 하기 때문에

베스트:

jQuery 또는 기타 유사한 프레임 워크를 사용하여 요소의 ID별로 클릭 핸들러를 첨부하십시오.

$('#myLink').click(function(){ MyFunction(); return false; });

21
noJS 브라우저에 대한 실제 링크로 href설정되지 않은 최상의 솔루션이있을 것 #입니다.
helly0d

6
ony가 첫 번째 (나쁜) 브라우저가 middleclick으로 모든 브라우저에서 동일한 (올바른) 방식으로 작동한다고 말하면 어떻게 될까요?
Vloxxity

14
<a id="myLink" href="javascript:MyFunction();">에 대해 나쁜 점은 무엇입니까?
Vaddadi Kartick

6
내 가장 겸손한 5 센트 : "최상의"옵션은 클릭 (온 클릭 이벤트?) 버튼을 사용하고 원래 디자인 의도가 처음에 있던 href를 다른 페이지에 링크하는 앵커로 남겨 두는 것입니다.
nidalpres

4
자바 스크립트를 사용한 클릭 바인딩에는 단점이 있습니다. 나중에 다른 폼을 디버깅 할 때 해당 요소에 어떤 종류의 자바 스크립트가 바인딩되어 있는지 찾기가 어렵습니다.
마틴 키 프트

69

의 관점에서 자바 스크립트 한 차이가 있다는 것이다 this에서 키워드 onclick핸들러가 그 DOM 요소를 참조한다 onclick속성이 (이 경우 인 <a>반면, 요소) this에서 href받는 참조 할 속성 window오브젝트.

표현 측면에서 , href속성이 링크 (예 :)에없는 경우 <a onclick="[...]">기본적으로 브라우저는 링크가 아닌 앵커로 취급하기 때문에 커서 text가 자주 표시되는 커서가 아닌 커서 를 표시합니다 .pointer<a>

동작 측면 에서을 통해 탐색을 통해 작업을 지정할 때 href브라우저는 일반적으로 href바로 가기 또는 상황에 맞는 메뉴를 사용하여 별도의 창에서 열 수 있도록 지원 합니다. 를 통해서만 동작을 지정할 때는 불가능합니다 onclick.


그러나 DOM 객체를 클릭하여 동적 작업을 수행하는 가장 좋은 방법이 무엇인지 묻는다면 문서의 내용과 별도로 Javascript를 사용하여 이벤트를 첨부하는 것이 가장 좋습니다. 여러 가지 방법으로이 작업을 수행 할 수 있습니다. 일반적인 방법은 jQuery와 같은 자바 스크립트 라이브러리를 사용하여 이벤트를 바인딩하는 것입니다.

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<a id="link" href="http://example.com/action">link text</a>
<script type="text/javascript">
    $('a#link').click(function(){ /* ... action ... */ })
</script>

9
"href"와 "onclick"에서 "this"가 다르다는 의심을 확인해 주셔서 감사합니다.
joonas.fi

17

나는 사용한다

Click <a nohref style="cursor:pointer;color:blue;text-decoration:underline"
onClick="alert('Hello World')">HERE</a>

먼 길이지만 작업이 완료됩니다. A 스타일을 사용하여 단순화하면 다음과 같습니다.

<style> A {cursor:pointer;color:blue;text-decoration:underline; } </style> 
<a nohref onClick="alert('Hello World')">HERE</a>

10
+1 정말 좋습니다! :-) 나는 nohref속성 에 대해 들어 본 적이 없다 . 이것은 이러한 자바 스크립트 작업을 처리하는 가장 논리적 / 우아한 방법입니다. FF12 및 IE8과 호환됩니다. 그러므로 나는 내 모든 대체됩니다 href="JavaScript:void(0);"에 의해 nohref. 고마워 건배.
olibre

7
주요 브라우저에서 지원하지 않는 이유는 무엇입니까? w3schools.com/tags/att_area_nohref.asp
hetaoblog

11
nohrefarea태그 의 일부가 아니라 a! 귀하의 예는 다음과 같습니다<a onClick="alert('Hello World')">HERE</a>
nZeus

6
또 다른 "이 경고를 수행하지 마십시오". 이것은 완전히 비표준적이고 나쁜 조언입니다. 태그 nohref에 없습니다 a.
Colin 't Hart

11

여기의 모든 것 외에도 href는 브라우저의 상태 표시 줄에 표시되고 클릭하지 않습니다. 자바 스크립트 코드를 보여주는 것은 사용자 친화적이지 않다고 생각합니다.


10

이를 수행하는 가장 좋은 방법은 다음과 같습니다.

<a href="#" onclick="someFunction(e)"></a>

문제는 브라우저의 페이지 URL 끝에 해시 (#)를 추가하므로 사용자가 뒤로 버튼을 두 번 클릭하여 페이지로 이동해야한다는 것입니다. 이를 고려하여 이벤트 전파를 중지하는 코드를 추가해야합니다. 대부분의 자바 스크립트 툴킷에는 이미이 기능이 있습니다. 예를 들어, dojo 툴킷은

dojo.stopEvent(event);

그렇게하기 위해.


9
href="#"브라우저 를 사용 하면 명명 된 앵커 태그를 찾고 그것을 찾지 못하면 창을 페이지 상단으로 스크롤하여 페이지가 보이지 않을 수 있음을 경고하고 싶습니다. 당신은 이미 정상에 있습니다. 이 동작을 피하려면 href="javascript:;"대신 다음을 사용하십시오.
alonso.torres

1
@ alonso.torres 좋은 지적이지만, 이것이 dojo.stopEvent ()의 사용을 언급 한 이유입니다. 이벤트 전파 / 버블 링과 앵커 클릭의 기본 동작이 중지됩니다.
linusthe3rd

7
stopEvent 대신 false 만 반환하는 이유 (onclick = "someFunction (e); return false;")
stracktracer

10

가장 좋은 대답은 매우 나쁜 습관입니다. 빈 해시에 연결하면 절대로 문제가 발생하지 않습니다.

그러나 다른 많은 사람들이 언급했듯이 이벤트 핸들러를 요소에 바인딩하는 것이 가장 좋습니다. <a href="javascript:doStuff();">do stuff</a> 모든 최신 브라우저에서 완벽하게 작동하며 템플릿을 렌더링 할 때 광범위하게 사용하여 각 인스턴스에 대해 리 바인드하지 않아도됩니다. 경우에 따라이 접근 방식은 더 나은 성능을 제공합니다. YMMV

또 다른 흥미로운 tid-bit ....

onclick & href 자바 스크립트를 직접 호출 할 때 다른 동작이 있습니다.

onclickthis컨텍스트를 올바르게 전달 하는 반면 href, <a href="javascript:doStuff(this)">no context</a>작동하지 않거나 다른 방식으로 는 작동하지 않습니다.<a onclick="javascript:doStuff(this)">no context</a> 것입니다.

그렇습니다 href. 그것이 사양을 따르지는 않지만 모든 브라우저에서 작동하지만 이상적으로 href="javascript:void(0);"는 좋은 측정을 위해 포함해야합니다.


8

javascript: 스크립팅 구체적 아닌 임의의 속성은 HTML의 오래된 방법이다. 기술적으로는 작동하지만 여전히 자바 스크립트 속성을 비 스크립트 속성에 할당하는 것은 좋지 않습니다. 오래된 브라우저 또는 일부 최신 브라우저에서도 실패 할 수 있습니다 (Google 포럼 게시물은 Opera가 'javascript :'urls를 좋아하지 않음을 나타냅니다).

자바 스크립트를 onclick속성 에 넣는 두 번째 방법 은 스크립트 기능이없는 경우 무시하는 것이 좋습니다. 자바 스크립트가없는 사용자를 위해 href 필드에 유효한 URL (일반적으로 '#')을 입력하십시오.


1
'javascript :'href와 onclick 속성을 가진 '#'href 사이에 어떤 차이가 있는지 알 수 없습니다. JS를 사용하지 않는 브라우저에는 둘 다 똑같이 쓸모가 없습니다.
harto

2
하토, 그건 사실이 아니에요 '#'은 명명 된 링크의 표시기이며 자바 스크립트 식별자가 아닙니다. 유효한 URL이며 Javascript를 인식하지 않아도됩니다.
zombat

8

이 코드 줄을 사용하여 나를 위해 일했습니다.

<a id="LinkTest" title="Any Title"  href="#" onclick="Function(); return false; ">text</a>

7

이 작동합니다

<a href="#" id="sampleApp" onclick="myFunction(); return false;">Click Here</a>

3
스택 오버플로에 오신 것을 환영합니다! 이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자에게 질문에 대한 답변을 제공하고 있으며 해당 사람들이 귀하의 코드 제안 이유를 모를 수도 있습니다. 또한 코드와 설명의 가독성을 떨어 뜨리므로 설명 주석으로 코드를 혼동하지 마십시오!
Goodbye StackExchange

2
이 코드는 작동하지 않습니다. return : false가 유효하지 않습니다. false를 반환해야합니다.
8

5

개인적으로 HREF 태그에 자바 스크립트 호출을하는 것이 성가신 것으로 나타났습니다. 나는 보통 무언가가 자바 스크립트 링크인지 아닌지에주의를 기울이지 않으며 종종 새 창에서 물건을 열고 싶어합니다. 이러한 유형의 링크 중 하나를 사용 하여이 작업을 시도하면 위치 표시 줄에 아무것도없는 빈 페이지가 표시됩니다. 그러나 이것은 onlick을 사용하여 조금 나아졌습니다.


3

Javascript와 함께 "href"를 사용할 때주의해야 할 사항이 하나 더 있습니다.

두 번의 클릭 사이의 시간 차이가 매우 짧은 경우 "href"속성의 스크립트가 실행되지 않습니다.

예를 들어, 다음 예제를 실행하고 각 링크에서 두 번 클릭 (빠른!)하십시오. 첫 번째 링크는 한 번만 실행됩니다. 두 번째 링크는 두 번 실행됩니다.

<script>
function myFunc() {
    var s = 0;
    for (var i=0; i<100000; i++) {
        s+=i;
    }
    console.log(s);
}
</script>
<a href="javascript:myFunc()">href</a>
<a href="#" onclick="javascript:myFunc()">onclick</a>

Chrome (더블 클릭) 및 IE11 (트리플 클릭)에서 재생되었습니다. Chrome에서 충분히 빠르게 클릭하면 10 번의 클릭만으로 1 회의 기능 만 실행할 수 있습니다.

Firefox는 정상적으로 작동합니다.


3

첫째, href사용자가 링크를 복사하거나 다른 탭에서 열 수 있도록하기 때문에 URL을 입력하는 것이 가장 좋습니다.

경우에 따라 (예 : HTML이 자주 변경되는 사이트) 업데이트가있을 때마다 링크를 바인딩하는 것은 실용적이지 않습니다.

일반적인 바인드 방법

일반 링크 :

<a href="https://www.google.com/">Google<a/>

그리고 JS의 경우 이와 같은 것 :

$("a").click(function (e) {
    e.preventDefault();
    var href = $(this).attr("href");
    window.open(href);
    return false;
});

이 방법의 장점은 마크 업과 동작을 명확하게 분리하여 모든 링크에서 함수 호출을 반복 할 필요가 없다는 것입니다.

바인드 방법 없음

그러나 매번 바인드하지 않으려면 onclick을 사용하여 요소와 이벤트를 전달하십시오.

<a href="https://www.google.com/" onclick="return Handler(this, event);">Google</a>

그리고 이것은 JS의 경우 :

function Handler(self, e) {
    e.preventDefault();
    var href = $(self).attr("href");
    window.open(href);
    return false;
}

이 방법의 장점은 매번 바인딩에 대해 걱정할 필요없이 원하는 때마다 AJAX를 통해 새 링크를로드 할 수 있다는 것입니다.


1
 <hr>
            <h3 class="form-signin-heading"><i class="icon-edit"></i> Register</h3>
            <button data-placement="top" id="signin_student" onclick="window.location='signup_student.php'" id="btn_student" name="login" class="btn btn-info" type="submit">Student</button>
            <div class="pull-right">
                <button data-placement="top" id="signin_teacher" onclick="window.location='guru/signup_teacher.php'" name="login" class="btn btn-info" type="submit">Teacher</button>
            </div>
        </div>
            <script type="text/javascript">
                $(document).ready(function(){
                $('#signin_student').tooltip('show'); $('#signin_student').tooltip('hide');
                });
            </script>   
            <script type="text/javascript">
                $(document).ready(function(){
                $('#signin_teacher').tooltip('show'); $('#signin_teacher').tooltip('hide');
                });
            </script>   

0

메일 폴더가 대신 URL을 표시하도록 설정된 Outlook의 웹 페이지 기능에 페이지가 포함되면 javascript : hrefs가 작동하지 않는다는 것을 경험했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.