2010-12-14 3 views
4

나는 (우리 회사를 포함하는) 웹 사이트 세계화 프로젝트를 진행중에있어 고객에게 가정/원산지 사이트에 스크립트 태그를 삽입하도록 요청하고 있습니다. 스크립트 태그는 고객의 글로벌 지원을 위해 필요하며 솔루션의 일부는 특정 최종 사용자 기준에 따라 트리거되는 UI를 구현합니다.번들로 묶인 jQuery로 제 3 자 자바 스크립트 라이브러리 관리하기

UI는 클라이언트가 페이지에 삽입 할 것으로 기대할 수없는 jQuery의 도움을 받아 만들어지며 버전 불일치는 해결하기가 어렵지 않습니다. 따라서 제 3 자 라이브러리는 자체 jQuery 버전을 다운로드합니다. 충돌을 피하기 위해 이름 공간이 다르기는하지만 말입니다.

그러나 이러한 메커니즘을 사용하면 jQuery의 모든 인스턴스 이름을 다른 jQuery 인스턴스 (있는 경우)와의 이름 충돌을 피하는 데 필요한 이름으로 바꾸고 우리의 mangled jQuery (아래 예에서는 MY_Query)를 매우 어렵게 만듭니다. 업그레이드는 물론 관리도 할 수 있습니다. 예를

jQuery = window.jQuery = window.$ = function(selector, context) { 
    // The jQuery object is actually just the init constructor 'enhanced' 
    return new jQuery.fn.init(selector, context); 
}, 
. 
. 
. 
jQuery.fn = jQuery.prototype = ... 

를 들어

우리와 클라이언트 모두가 사이트에 jQuery를 단일 버전이 것, 이상적으로

MY_JQuery = window.MY_JQuery = window.MY_Q = function(selector, context) { 
    // The MY_JQuery object is actually just the init constructor 'enhanced' 
    return new MY_JQuery.fn.init(selector, context); 
}, 
. 
. 
. 
MP_JQuery.fn = MP_JQuery.prototype = ... 

이되고, 우리 모두는 그것을 사용하는 것이 우리의 이점. 그러나 이는 jQuery를 업그레이드 할 때 양쪽에서 무거운 테스트가 필요하다는 것을 의미합니다 (맹 글링 된 jQuery 버전이 포함되어 있음). 그리고 원하는 모든 플러그인은 클라이언트가 사이트에 적절한 스크립트 태그를 추가하여 양 당사자간에 정치적 논쟁을 불러 일으킬 것을 요구합니다. 어떤 버전이 승리하는지.

그래서 클라이언트 사이트에서 jQuery의 모든 인스턴스 이름을 위에서 언급 한 제약 조건과 MY_Query로 바꾸지 않고 플러그인 (플러그인 포함)을 관리 할 수 ​​있습니까?

+1

는 왜 구글 코드 JQuery와 라이브러리에 연결하지, 당신이 모두 같은 버전이 것 결코 그들을 업그레이드 단지 생각을 필요가 없습니다. – brett

+0

클라이언트가 그렇게하도록 설득하기가 어렵습니다. 또한 클라이언트가이 제안을 거부하는 법적 이유가있을 수 있습니다. –

답변

4

jQuery가 이미 페이지에 포함되어 있는지 확인하고 동적으로로드하지 않는 이유는 무엇입니까?

if(!jQuery || !jQuery.fn.jquery === "1.4.4"){ 
    var url = "http://code.jquery.com/jquery-1.4.4.js"; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = url; 
    document.body.appendChild(script); 
} 

당신은 아마, 그것은 1.4.4 이후 버전을 가지고 있지 않다는 것을 확인하기 버전 감지 기능을 향상시키고 자하는 것입니다하지만 : 당신이 기본 수준을 알고있는 경우에 jQuery를 사용하면 이런 것을 확인할 수 있습니다 필요 나는 당신이에 대한 코드를 작성할 수 있습니다 확신 자신 ;-)

그래서 당신은 페이지의 JQuery와의 여러 버전을 유지할 필요가 피드백

에 따라

==== 편집. 다음과 같이 시도해 보셨습니까?

var original_jquery = $().noConflict(); 
original_jquery.getScript("http://code.jquery.com/jquery-1.4.4.js"); 
var new_jquery = $().noConflict(); 
window.$ = original_jquery; 

그런 다음 jquery의 버전으로 new_jquery를 사용 하시겠습니까? 나는 그것이 효과가 있는지보기 위해 이것을 테스트하지 않았지만, 당신은 그것에 행운을 가질지도 모른다. 당신이 언급 한 바와 같이

==== 최종 편집

은, 위의 내 자바 스크립트 정확히 정확하지, 그래서 콘솔에서 몇 가지를 시도했다. jQuery는 noConflict 메소드에서 이전 버전을 저장하기 때문에 jQuery의 이전 버전을 저장하지 않아도됩니다.그러니 그냥 getScript는 다음 noConflict하지만 새로운 변수에 저장 전화 :

>> $.fn.jquery 
"1.4.2" 
>> $.getScript("http://code.jquery.com/jquery-1.4.4.js"); 
undefined 
>> $.fn.jquery 
"1.4.4" 
>> var new_jquery = $.noConflict(); 
undefined 
>> new_jquery.fn.jquery 
"1.4.4" 
>> $.fn.jquery 
"1.4.2" 
+0

에 의해 영향을받습니다. 다른 버전의 jQuery는 동일한 네임 스페이스를 사용합니다. 따라서 jQuery 1.3.2가 사이트에 있고 우리는 1.4.4를 다운로드하고 자동으로 jQuery에 대한 모든 참조는 1.4.4를 가리키고 클라이언트는 1.3.2로 예상합니다. –

+0

당신이 프로그램 할 수있는 공통점이 있습니까? jQuery 1.4.4에서만 작동하도록 코드를 작성하고 있습니까? – sioked

+0

저의 사용중인 jQuery 라이브러리는 1.3.2이고 클라이언트의 버전은 다양합니다 –

1

JQuery.noConflict()을 사용해 보셨습니까? 이것은 당신을 도울 수있는 것처럼 들립니다.

+0

jQuery.noConflict()를 사용하여 확실히 시도했지만 이전에 설정된 $ 변수를 원래 소유자에게 반환합니다. 모든 jQuery 인스턴스는 새로운 jQuery 라이브러리 –

관련 문제