2014-02-12 2 views
6

기본 JavaScript ( prototype.js)와 함께 jQuery를 사용하는 데 문제가 있습니다. 다음 코드를 사용하면 jquery 1.9.1에 오류 메시지가 표시됩니다.jQuery가 기본 프로토 타입과 충돌합니다

Object.prototype.myVeryGreatFunction = function() { 
    // ... 
} 

[Error] TypeError: undefined is not a function (evaluating 'U[a].exec(s)') 
ft (jquery.min.js, line 4) 
wt (jquery.min.js, line 4) 
st (jquery.min.js, line 4) 
find (jquery.min.js, line 4) 
init (jquery.min.js, line 3) 
b (jquery.min.js, line 3) 
(anonymous function) (read.control.js, line 59) 
c (jquery.min.js, line 3) 
fireWith (jquery.min.js, line 3) 
ready (jquery.min.js, line 3) 
H (jquery.min.js, line 3) 

프로토 타입 정의를 제거하면 모든 것이 잘 작동합니다. 불행히도 jQuery는 CMS 용 플러그인에 있기 때문에 쉽게 업데이트 할 수 없으므로 이전 버전과의 호환성을 위해 작동해야합니다.

알려진 문제가 있습니까?

Google 검색은 실제로 jQuery.noConflict()과 개인 기능 포장을 사용하는 것과 같은 솔루션을 보여줍니다. 하지만 위에서 언급 한 것처럼 prototype.js를 사용하지 않고 네이티브 JS 객체 프로토 타이핑을 사용합니다.

이 아닌 열거 같은 네이티브 프로토 타입으로 확장함으로써 이러한 문제를 방지 할 수
+0

당신이 우리의 바이올린 –

+0

가능한 중복 제공 할 수있다 [자바 스크립트 jQuery를 나누기에 개체 프로토 타입을?] (http://stackoverflow.com/questions/1827458/prototyping-object-in-javascript-breaks-jquery) – Alnitak

답변

10

:

Object.defineProperty(Object.prototype, 'myVeryGreatFunction',{ 
    value : function() {}, 
    enumerable : false 
}); 

Object.defineProperty 문서 월 드보르작이 언급 한 바와 같이 MDN

에가,이 솔루션은 오래된 브라우저에서 작동하지 않습니다 (IE8-).

+0

아무튼 ' 그래도 이전 IE에서 작동하지 않습니다. –

+0

전설! 이것을 공유해 주셔서 감사합니다. –

2

더 오래된 브라우저에서는 이 없기 때문에 Object.prototype을 확장해도 jQuery가 깨지지 않습니다. jQuery 제작자는 구체적으로 말하면 (어딘가에 ...) 새로운 열거 가능 속성을 Object.prototype에 추가하면 jQuery가 중단된다는 것을 알 수 있습니다.

유일한 안전한 방법

는 ECMAScript를 5 및 비 열거 속성 객체에 추가 될 수 있도록 그 Object.defineProperty 기능을 필요로한다.

jQuery noconflict() 함수가 도움이되지 않습니다. 완전히 다른 문제에 대한 해결책입니다.

관련 문제