2009-03-09 2 views
5

다른 사이트에 삽입 된 JavaScript 위젯 (JS 및 HTML 코드 포함)이 있습니다. 변수 이름이 호스팅 페이지 변수와 충돌하지 않도록하려면 어떻게해야합니까? 나는이 위젯을 원하는 JavaScript 위젯에서 이름 충돌을 피하는 방법

는 iframe에 하지, 다른 위젯 호스팅 페이지 또는 충돌로 이름 충돌을 방지하는 가장 좋은 방법은 무엇입니까, 호스팅 페이지와 동일한 페이지에 의미 "인라인"한다?

이름 충돌은 여러 가지 방법으로 일어날 수 있습니다

  • 자바 스크립트 변수 이름
  • 자바 스크립트 함수 이름
  • DOM 요소 식별자
  • CSS 클래스 이름
  • 어쩌면 더
  • ...

나는 여러 가지 방법을 생각할 수 있습니다. oid 이름 충돌,하지만 최선의 연습이나 다른 일반적인 권장 사항이 있는지 궁금 해서요. 여기 내 2c가 있습니다.

  1. 오랫동안 고유 한 이름을 사용하십시오. 그것은 추악하고 완전한 증거는 아니지만 단순한 개념입니다.
  2. iframe을 사용하십시오. 하지만 언급 한 바와 같이, 나는 iframe을 여러 가지 이유로 사용하고 싶지 않습니다. 위젯이 페이지의 스타일 속성 (예 : 기본 글꼴 및 배경색)을 상속 받기를 원합니다. 가장 중요한 것은 위젯의 크기가 어느정도인지 알지 못합니다. 실시간 데이터에 따라 다르며 크기가 다를 수 있습니다.
  3. 더 나은 범위 지정을 위해 익명의 함수를 사용하십시오. (function() {여기 my code})(). 이 솔루션은 우아하면서도 나에게 아직 처음에는 작동하지 않지만 JS 이름은 충돌하지만 DOM ID 나 CSS 클래스 이름은 해결하지 못합니다. 둘째, jsonp를 사용하여 콜백 함수를 제공해야합니다. 이름은 결국 전역 범위에 있어야하므로 익명의 함수 범위에 중첩 될 수 없습니다.
  4. JavaScript에서 JS 변수 및 기능의 고유성을 제공하는 네임 스페이스 메커니즘을 만듭니다. 스타일 윈도우 [ 'my_app'] [variable_name] 또는 window [ 'my_app'] function_name의 어떤 것. 그것은 약간 못 생겼지 만 적어도 네임 스페이스를 제어 할 수 있고 고유 한 네임 스페이스가되도록 생성 할 수 있습니다.

답변

3

내 이전 프로젝트에서 나는 내장 된 위젯을했다 다른 사이트에서는 이름 충돌을 방지하기 위해 embedding 사이트에서 사용되는 모든 이름의 접두어 앞에 두 자리 접두어를 붙였습니다 (Objective C에서 아이디어를 얻었습니다. 모든 클래스는 NS와 같은 접두사로 시작합니다).

물론 위젯이 있더라도 관계없이 이름 공간 (예 : var Foo = {bar : function() {...}})과 "classes"(John Resig 클래스 구현 사용) 네임 스페이스, 클래스 및 전역 변수 또는 함수의 이름 앞에 접두어가 붙습니다 (예 : HMWidget, HMClass, hmDoSomething() 등

DOM ID 및 CSS 클래스 - 우선 동일한 사이트에서 내 서비스의 여러 위젯을 가질 가능성이 있으므로 대부분의 ID를 제거해야했습니다. 따라서 남은 유일한 ID는 위젯을 구분할 수있는 "widget_12345"와 같은 것입니다. 나머지 요소는 CSS 클래스로 식별되며 모든 CSS 선언은 기본 위젯 컨테이너와 관련하여 수행됩니다 (예 : ".left_column"대신 ".my_widget .left_column").

관련 문제