2009-03-09 29 views
5

Tôi có một tiện ích JavaScript (một đoạn mã JS và HTML nhúng) được nhúng trên các trang web khác. Tôi nên làm gì để đảm bảo rằng tên biến của nó không đụng độ với các biến trang lưu trữ?Cách tránh các xung đột tên trong các tiện ích JavaScript

Tôi muốn tiện ích này được "inlined" có nghĩa là trên cùng một trang với trang lưu trữ, không trong iframe, cách tốt nhất để tránh xung đột tên với trang lưu trữ hoặc xung đột với các tiện ích con khác là gì?

Tên cuộc đụng độ có thể xảy ra bằng nhiều cách:

  • Javascript tên biến
  • Javascript tên hàm
  • phần tử DOM định danh
  • tên lớp
  • CSS
  • có thể nhiều hơn ...

Tôi có thể nghĩ ra một số cách để oid tên cuộc đụng độ, nhưng tôi đã tự hỏi nếu có một thực hành tốt nhất hoặc khuyến nghị chung khác. Vì vậy, đây là số 2c của tôi:

  1. Chỉ cần sử dụng tên dài và cố gắng độc nhất. Đó là xấu xí và không đầy đủ, nhưng là đơn giản trong khái niệm.
  2. Sử dụng iframe. Nhưng như đã đề cập, tôi không muốn sử dụng iframe vì nhiều lý do. Tôi muốn các widget để kế thừa các thuộc tính phong cách từ trang (chẳng hạn như phông chữ mặc định và màu nền) và quan trọng nhất, tôi không biết làm thế nào lớn các widget là có được. Nó phụ thuộc vào dữ liệu thời gian thực và có thể có kích thước bất kỳ.
  3. Sử dụng các chức năng ẩn danh để có phạm vi tốt hơn, ví dụ: (function() {my code here})(). Giải pháp này, trong khi thanh lịch, vẫn không hoạt động cho tôi b/c đầu tiên, nó chỉ giải quyết tên JS bị đụng độ nhưng không phải tên DOM hoặc tên lớp CSS và thứ hai, tôi cũng sử dụng jsonp mà tôi cần cung cấp chức năng gọi lại tên, mà cuối cùng cần phải được trong phạm vi toàn cầu, do đó, nó không thể được lồng trong phạm vi chức năng ẩn danh.
  4. Tạo cơ chế vùng tên trong JavaScript sẽ cung cấp tính duy nhất của các biến và hàm JS. Một cái gì đó của cửa sổ kiểu ['my_app'] [variable_name] hoặc window ['my_app'] function_name. Đó là một chút xấu xí là tốt, nhưng ít nhất tôi có quyền kiểm soát không gian tên và có thể tạo ra đảm bảo là không gian tên duy nhất.

Trả lời

3

Trong dự án trước đây của tôi Tôi đã có một widget mà đã nhúng trên các trang web khác, và để ngăn chặn xung đột tên, tôi đặt trước tất cả các tên sẽ được sử dụng trong các trang nhúng với tiền tố hai chữ cái (tôi có ý tưởng từ Objective C, nơi tất cả các lớp bắt đầu bằng tiền tố như NS ...). Tất nhiên tôi cũng sử dụng không gian tên (ví dụ var Foo = {bar: function() {...}}) và "classes" (sử dụng triển khai lớp của John Resig), bởi vì tôi sử dụng chúng bất kể tôi có một widget hay không. hay không, nhưng tên của các không gian tên, các lớp và các biến hoặc hàm toàn cầu được đặt trước - ví dụ HMWidget, HMClass, hmDoSomething(), v.v.

Về ID DOM và lớp CSS - trước tiên, tôi phải loại bỏ hầu hết các ID vì khả năng có nhiều tiện ích từ dịch vụ của tôi trên cùng một trang web. Vì vậy, các ID duy nhất còn lại là một cái gì đó như "widget_12345" để nói cho các vật dụng ngoài. Phần còn lại của các yếu tố được xác định bởi các lớp CSS và tất cả các khai báo CSS được thực hiện liên quan đến vùng chứa tiện ích chính (ví dụ: ".my_widget .left_column" thay vì chỉ ".left_column").

Các vấn đề liên quan