2009-12-04 2 views
0

웹 페이지에이 스 니펫 <tr onclick="this.toggleClassName('selected')">을 사용하고 있습니다. (Prototype.js 함수) 훌륭하게 작동합니다. 내가하는 일은 테이블 행을 클릭하는 것뿐입니다. IE와 Opera를 제외한 모든 곳에서 작동합니다. 이것은 단지 편리하기 때문에 실제로 작동하는지 상관하지 않지만 IE에서는 오류가 발생하고 사용자에게 디버그 할 것인지 묻습니다.IE의 "this"키워드

"개체가이 속성 또는 메서드를 지원하지 않습니다."라는 오류 메시지가 나타납니다. 어떤 대상 또는 어떤 방법으로 참조 할 수 있습니까? Internet Explorer에서이 기능을 구현하는 쉬운 방법에 대한 의견이 있으십니까? 오류 메시지를 사용자에게 던지지 않는 것이 어떨까요?

감사합니다, 데이브

(http://math.davehampson.net)

답변

4

네, 이것은 기본적으로 Prototype의 주요 문제점입니다.

프로토 타입은 다른 브라우저에서 다르게 작동합니다. HTMLTableRowElement와 같은 호스트 객체의 프로토 타입을 가지고 플레이 할 수있는 브라우저에서는 과 같은 자체 함수를 프로토 타입에 추가하므로 <tr>을 보유 할 때마다 해당 메소드를 직접 호출 할 수 있습니다. 우우, 얼마나 편리합니까!

DOM 노드의 프로토 타입을 변경할 수 있다는 것은 ECMAScript 또는 DOM 표준이 실제로 보증하지 않는 것입니다. 모질라는 이런 식으로 멋지 기 때문에 파이어 폭스에서 작동하지만 모든 브라우저에서 작동 할 것이라고 기대할 수는 없습니다. 그것은 IE에서 확실히 작동하지 않을 것입니다. 모든 브라우저에서 안전하게 this.toggleClassName를 호출 할 수 있습니다 지금

Element.extend(this); 

:

그래서 다른 브라우저에 대한 당신과 함께 ('오그')를 추가하면 처리 할 모든 단일 개체 위에 자신의 방법을 프로토 타입 말할 필요 .

특정 <tr>을 추가하면 나중에 액세스 할 때마다 여전히 기능이 향상되므로 toggleClassName을 계속 호출 할 수 있습니다. 또한 Prototype 메소드 (예 : $('mytrid'))를 통해 요소에 액세스하면 자동으로 기능이 향상됩니다.

이것은 편리한 기능이 아닙니다. 이것은 함정입니다. 브라우저에서 작동하는 코드 (프로토 타입 해킹을 지원함)를 작성할 것을 권장하지만 다른 곳에서는 실패 할 수 있습니다. 특정 순서로 페이지 요소와 상호 작용할 경우 작동하는 코드를 작성하여 증분 된 메소드가 호출되기 전에 모든 요소가 증가하도록 보장하지만 다른 순서로 요소와 상호 작용하면 넘어지게됩니다.

이것은 디버깅 재앙이며 Prototype을 사용하지 않는 이유입니다.

(다음 주에는 불꽃 놀이를 즐기기 위해 왜 jQuery를 사용하지 않습니까?)

+0

그래서 Prototype을 사용하는 것을 중단 한 이유는 무엇입니까?하지만 항상 $ (this) .whatever()를 사용하면 Prototype은 이미 펼친. 이렇게하면 특정 순서대로 발생하는 것에 대한 의존도를 줄일 수 있습니다. –

+0

좋아, 내가 물어볼 테니 (이 주제는 아니지만) jQuery를 사용하지 않으시겠습니까? 나는 너를 화나게하지 않을 것을 약속한다 .-) –

+0

고마워! 나는 아직 100 % 이해하지 못한다. 그러나 그것은 트릭을했다! –

0

'은행'키워드가 자바 스크립트 기본이고 왜 여기

$(this).toggleClassName('selected') 

자세한 이유 당신의 예제에서는 tr dom 노드를 반환합니다. prototypejs가 DOM 노드에 메소드를 연결하는 것으로 의심됩니다. IE와 Opera에서 작동하지 않는 이유가 있습니다.