태그의 onclick 속성에서 발생하는 사용자 정의 함수에서 preventdefault를 호출하는 액세스 이벤트


119

다음과 같은 링크가 있습니다.

<a href="#" onclick="myfunc({a:1, b:'hi'})" />click</a>
<a href="#" onclick="myfunc({a:3, b:'jo'})" />click</a>

그리고 나는 링크를 클릭 할 때 주소 표시 줄에 추가 되기 때문에 preventDefault()내부 작업을하고 싶습니다 ( 또는 하지 않음 )myfunc()#return false;href='javascript:void(0);'

이게 가능해? 이벤트를 내부로 가져올 수 있습니까?myfunc()


6
false 반환의 문제점은 무엇입니까?
알렉스

5
너무 전파를 중지
OMU

4
return falsejQuery 내에서 전파 만 중지합니다.
cruzanmo 2014

답변:


157

W3C 호환 브라우저에서 발생한 이벤트 eventevent개체 가 될 함수를 인라인으로 전달할 수 있다고 생각 합니다 (예 : IE의 이전 버전은 여전히 ​​이벤트 처리기 함수 내부에서 검색해야합니다 window.event).

간단한 예 .

function sayHi(e) {
   e.preventDefault();
   alert("hi");
}
<a href="http://google.co.uk" onclick="sayHi(event);">Click to say Hi</a>

  1. 있는 그대로 실행하고 경고 후 링크가 Google로 리디렉션되지 않는지 확인합니다.
  2. 그런 다음 핸들러에 event전달 된 onclick것을 다른 것으로 변경하고 e실행을 클릭 한 다음 경고 후 리디렉션이 발생하는지 확인합니다 (결과 창이 흰색 으로 바뀌고 리디렉션을 보여줍니다).

5
좋아, 내가해야 할 일은 내 매개 변수를 두 번째로 두는 것 myfunc(event, {a:123, b:"asdas"})
뿐이라는

1
@Omu 전달 된 인수 인 event는 어느 위치 에나있을 수 있으며, 함수에 대해 정의 된 매개 변수 목록의 올바른 위치에있는 한 첫 번째 인수 일 필요는 없습니다. 예를 들어, function myfunc(o, e) {...}으로 호출 할 수 있습니다 myfunc({a:1, b:'hi'}, event).
cateyes

2
이벤트 개체를 명시 적으로 전달하고 캡처 할 필요가 없다고 생각합니다. 함수에서 간단히 참조 할 수 있습니다. 누군가 확인해 주시겠습니까? 이벤트가없는이 코드도 작동해야합니다.function sayHi() { event.preventDefault(); alert("hi"); }
K Vij

111

가장 간단한 해결책은 다음과 같습니다.

<a href="#" onclick="event.preventDefault(); myfunc({a:1, b:'hi'});" />click</a>

실제로 JS 지원 브라우저가없는 경우 폴 백이있는 문서에 대해 캐시 무효화를 수행하는 좋은 방법입니다 (JS가없는 경우 캐시 무효화 없음).

<a onclick="
if(event.preventDefault) event.preventDefault(); else event.returnValue = false;
window.location = 'http://www.domain.com/docs/thingy.pdf?cachebuster=' + 
Math.round(new Date().getTime() / 1000);" 
href="http://www.domain.com/docs/thingy.pdf">

JavaScript가 활성화 된 경우 캐시 무효화 쿼리 문자열이있는 PDF를 엽니 다. 그렇지 않으면 PDF 만 엽니 다.


캐시 무효화가 필요한 경우 서버 측 기술을 사용하여 해당 링크를 다시 작성할 수 있습니다.
mpen 2014

더 좋겠지 만 서버 측 코드에 대한 액세스 권한이 없습니다. 내가 가진 것을 가지고 일하고 있습니다.
JuLo

11

이 시도:

<script>
    $("a").click(function(event) {
        event.preventDefault(); 
    });
</script>

이를 위해서는 모든 클릭 이벤트에 대해 <script> 태그가 필요하므로 코드가 더 복잡해집니다.
somid3

또한 존재하지만 전제 조건이 아니어야하는 jQuery가 필요합니다.
Irregular Shed

여기에서도 동의하지 않습니다. 인라인 함수에 대한 간단한 구문 분석이 더 효과적이고 적은 코드입니다.
Shannon Hochkins 2014

1
@ somid3, jQuery는 필요 하지 않지만 성능이 걱정되는 경우 단일 위임 이벤트 핸들러를 사용하여 다음과 같이 페이지의 모든 앵커에 대해 단일 리스너 만 연결할 수 $("body").on("click","a",function(e) { e.preventDefault() });있습니다. 두 경우 모두 성능에 의미있는 영향을 미치는 솔루션은 없습니다.
KyleMit 2016

7
<script type="text/javascript">
$('a').click(function(){
   return false;
});
<script>

2
이는 모든 앵커에 적용되며 모든 링크가 끊어지며 jQuery와 마찬가지로 페이지에 자바 스크립트를 삽입해야합니다.
Shannon Hochkins 2014

또한 jQuery를 사용하는 경우 return false해당 요소의 다른 모든 이벤트 처리기가 실행되는 것을 방지하고 이벤트가 더 높은 요소로 버블 링되는 것을 방지하므로 권장되지 않습니다.
Stijn de Witt

6

링크에 고유 한 클래스를 추가하고이 클래스가있는 링크의 기본값을 방지하는 자바 스크립트를 추가합니다.

<a href="#" class="prevent-default" 
   onclick="$('.comment .hidden').toggle();">Show comments</a>

<script>
  $(document).ready(function(){

    $("a.prevent-default").click(function(event) {
         event.preventDefault(); 
          });
  });
</script>

글로벌 솔루션에 대한 흥미로운 접근 방식.
AFract

5

a 태그에서 href 속성을 제거 할 수 없습니까?


1
예, 그것도 옵션입니다. 기본적으로 링크에는 밑줄이 없습니다. 자바 스크립트가 꺼져 있으면 이동할 href가 없습니다
Omu

4

우리가 onClick을 사용할 때 우리는 기본값과 다른 것을 원한다고 생각합니다. 따라서 onClick을 사용하는 모든 링크에 대해 :

$("a[onClick]").on("click", function(e) {
  return e.preventDefault();
});

2

단순한!

onclick="blabla(); return false"

2

다음과 같이 onclick에서 이벤트에 액세스 할 수 있습니다.

<button onclick="yourFunc(event);">go</button>

그리고 당신의 자바 스크립트 함수에서 내 조언은 첫 줄 문을 다음과 같이 추가하는 것입니다.

function yourFunc(e) {
    e = e ? e : event;
}

그런 다음 모든 곳에서 e를 이벤트 변수로 사용하십시오.



0

JS 라이브러리 또는 jQuery없이. 가능한 경우 멋진 팝업 창을 엽니 다. 정상적인 링크 열기에 안전하게 실패합니다.

<a href="https://acme.com/" onclick="onclick="openNewWindow(event, this.href);">...</a>

그리고 도우미 기능 :

function openNewWindow(event, location) {
  if (event.preventDefault && event.stopImmediatePropagation) { 
    event.preventDefault(); 
    event.stopImmediatePropagation(); 
  } else {
    event.returnValue = false; 
  }
  window.open(location, 'targetWindow', 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=800,height=450');
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.