IE에서 event.preventDefault () 함수가 작동하지 않습니다


202

다음은 내 JavaScript (mootools) 코드입니다.

$('orderNowForm').addEvent('submit', function (event) {
    event.preventDefault();
    allFilled = false;
    $$(".required").each(function (inp) {
        if (inp.getValue() != '') {
            allFilled = true;
        }
    });

    if (!allFilled) {
        $$(".errormsg").setStyle('display', '');
        return;
    } else {
        $$('.defaultText').each(function (input) {
            if (input.getValue() == input.getAttribute('title')) {
                input.setAttribute('value', '');
            }
        });
    }

    this.send({
        onSuccess: function () {
            $('page_1_table').setStyle('display', 'none');
            $('page_2_table').setStyle('display', 'none');
            $('page_3_table').setStyle('display', '');
        }
    });
});

IE를 제외한 모든 브라우저에서 이것은 잘 작동합니다. 그러나 IE에서는 오류가 발생합니다. JavaScript 디버거를 사용하는 동안 IE8이 있으므로 event객체 preventDefault에 오류를 일으키는 메소드가 없으므로 양식이 제출 된다는 것을 알았습니다 . 이 방법은 Firefox의 경우 지원됩니다 (Firebug를 사용하여 알았습니다).

도움이 필요하십니까?


그렇습니다; 문서 ( mootools.net/docs/core/Native/Event#Event:preventDefault ) 에 따라 작동해야하는 내용 : "이벤트 방법 : preventDefault-이벤트의 기본 동작을 막기위한 크로스 브라우저 방법"
Paolo Bergantino 2016 년

내 나쁜, 나는 내 의견을 삭제했습니다. "mootools에는 이벤트를 중지하는 방법이 없습니까?" 그래서 ie8에 mootools에 문제가 있습니다 ...
Alsciende

2
이 문제를 재현 할 수 없습니다. 이 바이올린은 "즉, 8에서 작동합니다"오류를 표시하도록 축소 된 바이올린을 설정할 수 있습니까? jsfiddle.net
eerne

답변:


472

IE에서 사용할 수 있습니다

event.returnValue = false;

같은 결과를 얻을 수 있습니다.

그리고 오류가 발생하지 않도록 preventDefault가 있는지 테스트 할 수 있습니다.

if(event.preventDefault) event.preventDefault();

둘을 다음과 결합 할 수 있습니다.

event.preventDefault ? event.preventDefault() : (event.returnValue = false);

48
다음 코드가 나를 위해 일했습니다 : if (event.preventDefault) {event.preventDefault (); } else {event.returnValue = 거짓; }
sv_in 2016 년

229
event.preventDefault ? event.preventDefault() : event.returnValue = false;
mortiy

31
"event"는 IE8에서 전역 이벤트 객체 여야합니다. 당신은 e.preventDefault처럼,이 이벤트 핸들러에 전달 된 이벤트를 사용할 수 있어야합니다 IE8에서 작업이 순서대로에서는 event.preventDefault합니다.
jmort253

event.preventDefault();어떤 이유로 든 FireFox에서 나를 위해 일을 중단했습니다. mority의 코드를 사용했고 훌륭하게 작동했습니다. 감사합니다 ~
James

8
@ jmort253의 의견에 명확성을 추가하기 위해 :$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
Luke

23

mootools의 addEvent 함수를 통해 이벤트를 바인드하면 이벤트 핸들러는 고정 된 (증강 된) 이벤트를 매개 변수로 전달합니다. 항상 preventDefault () 메소드를 포함합니다.

이 바이올린을 사용하여 이벤트 바인딩의 차이점을 확인하십시오. http://jsfiddle.net/pFqrY/8/

// preventDefault always works
$("mootoolsbutton").addEvent('click', function(event) {
 alert(typeof(event.preventDefault));
});

// preventDefault missing in IE
<button
  id="htmlbutton"
  onclick="alert(typeof(event.preventDefault));">
  button</button>

모든 jQuery 사용자의 경우 필요할 때 이벤트를 수정할 수 있습니다. HTML onclick = ".."을 사용하고 preventDefault ()가없는 IE 특정 이벤트를 받으면이 코드를 사용하십시오.

e = $.event.fix(e);

그 후 e.preventDefault (); 잘 작동합니다.


2
불행히도이 트릭은 나를 위해 작동하지 않습니다. IE 10을 사용 중이며 e.preventDefault ()를 호출하기 전에; 나는 $ .event.fix (e); 성공하지 못했습니다 :(
Beatles1692

jquery 2에서 제거되었을 수 있습니까? 그러나 IE10에는 수정이 필요하지 않습니다.
oldwizard

고정 이벤트를 e 변수에 다시 지정 했습니까?
oldwizard

11

나는 이것이 꽤 오래된 게시물이라는 것을 알고 있지만 IE8 에서이 작업을 시도하는 데 약간의 시간을 보냈습니다.

여기에 게시 된 솔루션과 다른 스레드에서 작동하지 않아 IE8 버전에 약간의 차이가있는 것으로 보입니다.

이 코드가 있다고 가정 해 봅시다.

$('a').on('click', function(event) {
    event.preventDefault ? event.preventDefault() : event.returnValue = false;
});

내 IE8 preventDefault()방법에는 jQuery로 인해 존재하지만 작동하지 않습니다 (아마도 아래 점 때문에). 그래서 실패합니다.

returnValue속성을 직접 false로 설정하더라도 :

$('a').on('click', function(event) {
    event.returnValue = false;
    event.preventDefault();
});

jQuery 사용자 정의 이벤트 객체의 일부 속성을 설정했기 때문에 작동하지 않습니다.

나를 위해 작품 설정 속성입니다 만 솔루션 returnValue글로벌 변수 event 같은 :

$('a').on('click', function(event) {
    if (window.event) {
        window.event.returnValue = false;
    }
    event.preventDefault();
});

IE8을 설득하려고하는 사람이 일하기 쉽도록하기 위해. IE8이 곧 고통스러운 죽음으로 죽을 수 있기를 바랍니다.

최신 정보:

으로 sv_in 밖으로 포인트, 당신은 사용할 수 있습니다 event.originalEvent원래 이벤트 객체와 세트 얻기 위해 returnValue원래의 속성을. 그러나 아직 IE8에서 테스트하지 않았습니다.


1
에서 원본 브라우저 이벤트 객체를 가져올 수도 있습니다 event.originalEvent. 추가 정보 : stackoverflow.com/a/16675056/22550
sv_in

6

Mootools는 Event 객체에서 preventDefault를 재정의합니다. 따라서 모든 브라우저에서 코드가 제대로 작동해야합니다. 그렇지 않은 경우 mootools의 ie8 지원에 문제가 있습니다.

ie6 및 / 또는 ie7에서 코드를 테스트 했습니까?

의사는 말합니다

addEvent로 추가 된 모든 이벤트는 수동으로 인스턴스화 할 필요없이 mootools 메소드를 자동으로 가져옵니다.

그러나 그렇지 않은 경우 시도해 볼 수 있습니다.

new Event(event).preventDefault();

1
IE에서도 이와 같이 줄 바꿈하는 데 문제가있었습니다. 세상에! 왜 IE인가?
sv_in

하지만 이벤트를 중지하고 싶지는 않지만 기본 동작을 막을뿐입니다.
Alsciende 2016 년

5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

IE 9 및 Chrome에서 테스트되었습니다.


2
IE 11에서 작동하지 않습니다 (아무것도하지 않는 것 비록 e.preventDefault는 기능입니다)
GreySage

4

IE9 이후에 키보드 키를 비활성화하려면 다음을 사용하십시오. e.preventDefault();

IE7 / 8에서 일반 키보드 키 를 비활성화하려면 : e.returnValue = false;또는return false;

키보드 단축키 를 비활성화 하려면 (예 : Ctrl 키 를 사용하여 Ctrl+F) 해당 행을 추가해야합니다.

try {
    e.keyCode = 0;
}catch (e) {}

다음은 IE7 / 8에 대한 전체 예입니다.

document.attachEvent("onkeydown", function () {
    var e = window.event;

    //Ctrl+F or F3
    if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
        //Prevent for Ctrl+...
        try {
            e.keyCode = 0;
        }catch (e) {}

        //prevent default (could also use e.returnValue = false;)
        return false;
    }
});

참조 : IE7 / IE8에서 키보드 단축키를 비활성화하는 방법


당신은 머리에 못을 치는 유일한 응답자입니다. 초기 IE에 대해 말하는 사람은 크로스 플랫폼 기능이 필요하기 때문입니다. "e.keyCode = 0;" 초기 IE의 모든 기본 동작을 종료합니다.
www-0av-Com

3

다음은 jquery 1.3.2 및 09-18-2009의 야간 빌드로 테스트 한 기능입니다. 결과를 알려주세요. OSX의 Safari, FF, Opera 에서이 모든 것이 잘 끝납니다. 문제가있는 IE8 버그를 수정하기위한 것이며 의도하지 않은 결과가 발생할 수 있습니다.

function ie8SafePreventEvent(e) {
    if (e.preventDefault) {
        e.preventDefault()
    } else {
        e.stop()
    };

    e.returnValue = false;
    e.stopPropagation();
}

용법:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})

1
나는이 stop방법을 전에 본 적이 없으며 msdn에서 찾을 수 없었습니다. 무엇을합니까?
Oriol

1
.stop()존재하지 않기 때문에 예외를 던집니다. 모든 예외는 원하는 효과가 있습니다.
Jay Bazuzi 2016 년

왜 예외를 던지겠습니까? 난 당신이 예외를 throw 할 경우, 당신은 단순히 부를 수있는, 의미 e.preventDefault()는 ... 어쨌든 예외를 던질 것입니다 원인
마티아스 버거

2

preventDefault광범위한 표준입니다. 이전 IE 버전과 호환되기를 원할 때마다 애드혹을 사용하는 것은 번거롭고 polyfill을 사용하는 것이 좋습니다.

if (typeof Event.prototype.preventDefault === 'undefined') {
    Event.prototype.preventDefault = function (e, callback) {
        this.returnValue = false;
    };
}

이벤트의 프로토 타입을 수정하고 일반적으로 javascript / DOM의 뛰어난 기능인이 기능을 추가합니다. 이제 e.preventDefault아무 문제없이 사용할 수 있습니다 .


0

return false 리스너의 모든 브라우저에서 작동해야합니다.

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}

0

FWIW, 누군가 가이 질문을 나중에 다시 방문하는 경우 onKeyPress 처리기 함수로 전달하는 내용을 확인할 수도 있습니다.

실수로 onKeyPress (event) 대신 onKeyPress (this)를 전달했을 때이 오류가 발생했습니다.

확인해야 할 것이 있습니다.


0

기능 검사가있는 방법으로 도움을 받았습니다. 이 방법은 IE8에서 작동합니다

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.