Làm thế nào để lưu trữ một giá trị toàn cục (không nhất thiết phải là một biến toàn cục) trong jQuery?


80

Hiện tại, tôi đang làm việc trên một trang web cũ sử dụng rất nhiều JavaScript, jQuery, Microsoft client JavaScript và các thư viện khác. Điểm mấu chốt - Tôi không thể viết lại toàn bộ trang từ đầu vì doanh nghiệp không thể biện minh cho điều đó. Vì vậy ... nó là những gì nó là. Dù sao, tôi cần phải gây ô nhiễm (tôi thực sự cũng không cố gắng) không gian tên toàn cục bằng một biến. Có ba lựa chọn mà tôi đã nghĩ đến -

  1. Chỉ cần lưu trữ / truy xuất nó bằng cách sử dụng một khai báo JavaScript bình thường - var x = 0;

  2. Sử dụng jQuery để lưu trữ / truy xuất giá trị trong thẻ DOM - $("body").data("x", 0);

  3. Sử dụng trường biểu mẫu ẩn và đặt / truy xuất giá trị bằng jQuery - $("whatever").data("x", 0);

Có cách nào tốt hơn? Tôi đã nhìn vào đống mã hiện có và tôi không tin rằng biến có thể được xác định phạm vi trong một hàm.

Câu trả lời:


100

Bạn có thể tạo một không gian tên bên trong đối tượng jQuery, như sau:

$.mynamespace = { 
    myVar : "something", 
    myVar2 : "somethingElse" 
}; 

hoặc là:

$.mynamespace = {};
$.mynamespace.myVar = "something";
$.mynamespace.myVar2 = "somethingElse";

Hãy nhớ rằng, bất kỳ phương thức plugin nào có tên 'mynamespace' sẽ bị ghi đè vì vậy hãy đảm bảo sử dụng một tên hợp lý.


1
tại sao biến không gian tên phải được khai báo là một thuộc tính của jQuery ?!
Pedro Rolo

5
@Pedro - Nó không cần phải như vậy. Tôi chỉ chỉ ra điều này như một khả năng.
karim79

Nếu tôi muốn sử dụng cái này thì tôi phải khai báo nó ở đâu? Tất cả mã javascript của tôi đều nằm trong tệp JS. Tôi không muốn trộn mã JavaScript với mã HTML.
VansFannel

đây là một giải pháp ngớ ngẩn vì nó dễ xảy ra xung đột tên giữa các không gian tên đã khai báo với các biến và phương thức của Đối tượng jQuery. Tôi không hiểu giá trị của giải pháp này. Đối với tôi, nó không tốt.
Pedro Rolo

tôi có thể sử dụng biến toàn cục này trên tất cả các iframe biểu mẫu mẹ không?
Thulasiram

39

Đối với tôi, cách tốt nhất để xử lý tình huống này là xác định một đối tượng trong đối tượng cửa sổ:

window.my_config =
{
    my_var1 : 1,
    my_var1 : 2,
    my_var1 : 3
};

Điều này sẽ giữ cho phạm vi của bạn gọn gàng và sạch sẽ. Và bất cứ khi nào bạn truy cập toàn cầu bằng cách sử dụng window.my_configbất kỳ ai nhìn vào mã sẽ biết rằng toàn cầu đang được truy cập.


4
điều này có ý nghĩa với tôi hơn là sử dụng không gian tên jquery. Có lý do gì mà cách này không hoạt động tốt hoặc tốt hơn không?
Damon

6

Bạn có thể tạo một hàm băm trong phạm vi toàn cục và sử dụng nó làm không gian tên:

MyNamepace={}
MyNamespace.newvar = 'value'
// MyNamespace.newvar => 'value'

Đây là một giải pháp ngớ ngẩn vì nó dễ xảy ra xung đột tên giữa các vùng tên đã khai báo và các biến và phương thức toàn cục khác. Tôi không hiểu giá trị của giải pháp này. Đối với tôi, nó tệ.
tad

1
Bạn có quyền kiểm soát những tên nào tồn tại trong phạm vi toàn cục, trong khi bạn không có quyền kiểm soát các phương thức và tên biến có thể được thêm vào jQuery khi cập nhật. Đây là một trong những lý do chính khiến không gian tên tồn tại rõ ràng trong nhiều ngôn ngữ. Khi họ không, tên bắt đầu là kỳ lạ (ví dụ: Smalltalk-hệ thống đẳng cấp tên)
Pedro Rolo

4
Không phải luôn luôn. Không có gì ngăn cản một số thư viện giả mạo ghi đè hàm băm của bạn. Về bản chất, bạn không thể tránh khỏi vấn đề nếu không có không gian tên rõ ràng. Đây là lý do tại sao tài liệu tạo mô-đun jQuery đề xuất một hàm băm duy nhất trong đối tượng jQuery cho các mục đích không gian tên, bởi vì không gian tên jQuery trên thực tế bị hạn chế đối với các plugin phổ biến.
chút

2

Chỉ chia sẻ thực hành của tôi với bạn, tôi sẽ tạo một đối tượng toàn cục / var trong tệp JavaScript được yêu cầu với một tiền tố hợp lý, như thể tôi đang làm việc trên một trang mà đối tượng này sẽ là một hộp văn bản thì tôi sẽ đặt tên cho nó:

g_TxtMyValue = 'value';    // g_ specifies it to be a global variable, it is one
                           // of the many conventions used

Nếu bạn có nhiều hơn một biến toàn cục, bạn cũng có thể có một không gian tên như:

my_txt = {};  // For a real site I would use a prefix relative to the project
              // name instead of "my".

my_txt.testValueOne = 'Value one';
my_txt.testValueOne = 'Value two';

Các biến này sẽ có sẵn cho bạn trên toàn bộ trang web, sau khi chúng được khởi tạo.

Tôi hi vọng cái này giúp được.



0

Chỉ cần một thông báo ngắn:

Có phải hộp thư thích hợp đang thực hiện AJAX (có nghĩa là: nếu nó tải trong một iFrame, bạn nên thêm "cha" vào phương thức đóng), như sau:

parent.$.fancybox.close();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.