2013-05-03 28 views
5

Điều này trừu tượng hơn một chút so với những câu hỏi thông thường mà tôi biết đi ngược lại tinh thần của mọi thứ, nhưng tôi hy vọng rằng tôi vẫn có thể nhận được phản hồi tốt.Làm thế nào để ngăn chặn một phương thức được rút ra nhiều lần?

Đây là vấn đề. Chúng tôi có một ứng dụng web khá phức tạp được viết bằng PHP. Mục đích là không quan trọng, nhưng chỉ cần đặt: Chúng tôi đang sử dụng Comet/AJAX/JSON/JavaScript/PHP/MySQL (KHÔNG jQuery, tuy nhiên, chỉ có JavaScript gốc) để hiển thị các điều khiển hiển thị dữ liệu trong thời gian thực. Trong suốt ứng dụng này, chúng tôi đang hiển thị các chế độ bật lên bằng cách sử dụng JavaScript gốc. Đó là logic khá phức tạp để kiểm tra sự tồn tại của một phương thức có cùng tên trên trang và ngăn chặn việc tạo phiên bản mới giống nhau, và dĩ nhiên khi tạo một lớp được tạo để ngăn tương tác với các liên kết bên dưới.

Vấn đề là chúng tôi có ít nhất một phương thức có thể được gọi nhiều lần trước khi được hiển thị trên trang do thời gian cần cuộc gọi AJAX để thu thập dữ liệu từ cơ sở dữ liệu và lắp ráp nó để trình bày. Nếu người dùng nhấp 'nhấp đúp' vào liên kết đã nói, họ sẽ được trình bày với hai phương thức, một phương thức khác. Tôi đã có thể thực sự render 8-10 trong số này. Tương tác với các phương thức trên cùng dường như bị hỏng bởi vì người dùng thực sự đang thực hiện các tiêu đề có thể thu gọn theo phương thức thấp nhất. Khi bạn bắt đầu đóng các hộp thoại và xuống phía dưới, bạn có thể thấy nơi bạn đã nhấp vào.

Vì vậy, vấn đề của tôi là: Cách tốt nhất để ngăn chặn hành vi này là gì?

Tôi đã xem xét việc thêm một hàm vào sự kiện onClick để loại bỏ thuộc tính onClick khỏi liên kết sau lần nhấp đầu tiên với thời gian chờ nhỏ (500ms). Tôi cũng đã xem xét cố gắng thực hiện logic thử nghiệm bit sẽ đếm số nhấp chuột và chỉ thực sự là sự kiện đầu tiên sau lần nhấp đầu tiên và đặt lại khi phương thức bị đóng. Những gì tôi đang tự hỏi là nếu ai đó có bất kỳ suy nghĩ hoặc đề xuất hoặc thậm chí đã giải quyết một vấn đề tương tự và có một số cái nhìn sâu sắc về thực hành tốt nhất để hoàn thành mục tiêu của tôi trong trường hợp này.

Cảm ơn bạn rất nhiều.

+3

Nếu bạn đang sử dụng jQuery bạn luôn có thể thử [ '.Một()'] (http://api.jquery.com/one /) – Bojangles

+0

Tôi có thể làm được không. Nhiều như tôi rất thích sử dụng jQuery trên dự án này, người quản lý dự án là hoàn toàn và hoàn toàn chống lại JavaScript không phải là bản địa. Cảm ơn bạn đã gợi ý, mặc dù. Tôi nên đưa thông tin đó vào bài đăng để rõ ràng hơn. – fskirschbaum

+0

Ah, xấu hổ. Nó có thể đã được đề cập đến mà bạn không sử dụng jQuery như nhiều độc giả (bản thân mình) thường giả định 'sự hiện diện của nó – Bojangles

Trả lời

0

Trong trường hợp này, tôi thấy giải pháp đơn giản nhất là giải pháp tốt nhất nhưng tôi vẫn muốn nghe phản hồi khác nếu nó ở ngoài đó.

Trong trường hợp này, tôi thấy rằng thứ tự các hoạt động là vấn đề. Tôi đã chờ phản ứng AJAX để tạo ra html cơ thể cho phương thức này. Tôi đã thay đổi thứ tự để tạo phương thức ngay lập tức bằng cách sử dụng <p>Loading...</p> trong phần thân của phương thức. Sau đó, khi AJAX được hoàn thành và tôi có văn bản nội dung mới của tôi, tôi chỉ cần tiêm nó vào khu vực nội dung của phương thức với một chút mã và Bob của Bác của bạn, chúng tôi đã có jackpot.

4

Bạn có thể unregister handler nhấp chuột một lần nó bị sa thải:

var element = ..., 
myClickHandler = function(event) { 
    // ... 
    element.removeEventListener('click', myClickHandler, false); 
    // ... 
} 

element.addEventListener('click', myClickHandler, false); 
+0

Tôi thích giải pháp này khá một chút. Cảm ơn bạn! – fskirschbaum

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