2013-01-23 35 views
7

Tôi chỉ muốn JavaScript chạy một lần, nhưng Tôi không thể kiểm soát số lần tệp javascript được thực thi. Về cơ bản tôi đang viết một đoạn mã JS nhỏ vào một CMS, và CMS thực sự gọi nó là 5-10 lần. Vì vậy, các giải pháp như sau:Mã chạy Javascript một lần

function never_called_again(args) { 
    // do some stuff 
    never_called_again = function (new_args) { 
    // do nothing 
    } 
} 
never_called_again(); 

Dường như không hoạt động vì đoạn mã của tôi được chạy lại từ đầu hàm được khai báo lại và 'làm một số nội dung' được đánh giá lại. Có lẽ tôi không làm đúng, tôi không giỏi với JS. Tôi đang xem xét việc sử dụng một cái gì đó như try-catch trên một biến toàn cầu, một cái gì đó như

if (code_happened == undefined) { 
    \\ run code 
    code_happened = true; 
} 

EDIT: Có một trạng thái nhất quán, ví dụ: nếu tôi đặt một biến tôi có thể thấy khi đoạn mã của tôi chạy lại. Nhưng phải tuyên bố nó trước khi tôi truy cập vào nó, tôi không biết làm thế nào để nói 'hiện biến này tồn tại chưa'

+1

"Tôi không biết làm thế nào để nói 'không biến này tồn tại chưa?'" - thường điều này được thực hiện với 'var foo = window.foo || {} ' – zzzzBov

Trả lời

17

Hãy thử điều này:

var doneTheStuff; 
function whatever() { 
    if (!doneTheStuff) { 
    doneTheStuff = true; 
    // do the stuff 
    } 
} 

Redundant khai báo biến không ảnh hưởng đến giá trị của biến. Khi một trong các hàm đã đặt biến thành true, các hàm khác sẽ không làm bất kỳ điều gì.

+0

Hoạt động! Câu hỏi tiếp theo - dường như chạy hàm được khai báo cuối cùng, ví dụ: làm cho 'làm việc' làm' alert (1) 'và' alert (2) 'và bạn sẽ chỉ thấy 2. Không quan trọng đối với tôi (chúng đều giống nhau), nhưng hấp dẫn anyways – Hamy

+0

@Hamy - Giải pháp của tôi sẽ làm việc ngược lại. Chỉ có hàm khai báo đầu tiên sẽ chạy. –

+0

@Hamy nếu mã được tạo thành cùng một '

2

Sử dụng đóng cửa và đặt cờ. Nếu cờ là true, chỉ cần trở lại:

if (! window.never_called_again ) { 
    window.never_called_again = (function() { 
     var ran = false; 
     return function (args) { 
      if (ran) return; 
      ran = true; 
      // Do stuff 
     }; 
    }()); 
} 

Đây là fiddle: http://jsfiddle.net/U2NCs/

+1

Nhưng nếu điều đó xuất hiện trong hai bit riêng biệt của JavaScript, nó sẽ có cùng một vấn đề. – Pointy

+2

Toàn bộ tệp đang được thực thi nhiều lần, bao gồm việc xác định hàm, nếu tôi hiểu mô tả của OP. Đây là một biểu diễn tốt hơn, và nó được gọi nhiều lần: http://jsfiddle.net/Qn52E/. – mellamokb

+0

Như những người khác đã chỉ ra, tôi giống như bình luận của mellamokb, vì vậy điều này dường như không hoạt động ;-) – Hamy

3
if (typeof code_happened === 'undefined') { 
    window.code_happened = true; 
    // Your code here. 
} 

Kiểm tra typeof giúp bạn thực tế là toàn cầu chưa được khai báo. Bạn cũng có thể chỉ cần if (!window.code_happened) vì quyền truy cập thuộc tính không bị cấm đối với các thuộc tính không xác định.

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