2009-03-12 30 views
5

Giả sử tôi có một phương thức javascript mất một chút thời gian để hoàn thành để không có bất kỳ phản hồi nào của người dùng. Trong trường hợp của tôi, nó sắp xếp các hàng trong một phần tử bảng (tất cả trong DOM; chỉ mất quá nhiều thời gian nếu có hàng), nhưng nó có thể làm bất cứ điều gì. Tôi muốn hiển thị con trỏ "tiến trình" trong khi nó chạy. Dưới đây là những gì tôi hiện có, nhưng tôi cũng đã thử một vài điều khác:Thay đổi loại con trỏ cho tài liệu html từ javascript

// SORT 
document.body.style.cursor = "progress"; 
MyLongRunningMethod(); //blocks for 10-15 seconds before returning 
document.body.style.cursor = "auto";  

Thật không may, không có gì xảy ra. MyLongRunningMethod() làm điều đó một cách chính xác, nhưng con trỏ không bao giờ thay đổi. Suy nghĩ của tôi là trình duyệt cần đợi phương thức quay lại để có thể xử lý thông báo thay đổi con trỏ được tạo bởi môi trường cửa sổ, nhưng điều đó có thể là cách tắt và ngay cả khi điều đó là đúng, tôi không biết cách sửa nó.

Bất kỳ ý tưởng nào khác?


[sửa]: Tôi quyết định tất cả các câu chuyện tôi đã thực sự không cần thiết. Nếu bạn thực sự muốn đọc nó, hãy kiểm tra lịch sử sửa đổi.


Kết quả cuối cùng

tôi đã kết thúc sử dụng giải pháp RoBorg của. Nó không làm hỏng mã nhiều như tôi đã suy nghĩ ban đầu, bởi vì tôi có thể giữ cho hàm được khai báo ngay tại đó - nó giống như thêm một khối phạm vi nội tuyến.

Điều thú vị là trên Firefox, tôi phát hiện ra điều này có nghĩa là tôi không cần thay đổi con trỏ. Tôi thấy rằng sau khi tôi đã thêm cuộc gọi setTimeout, đôi khi tôi nhìn thấy con trỏ chờ hiển thị trước khi con trỏ tiến trình được đặt, vì vậy tôi đã nhận xét mã con trỏ của mình. Nó chỉ ra rằng một cái gì đó trong việc sử dụng setTimeout để đẩy điều này ra khỏi trình xử lý sự kiện nhấn cho phép FireFox tự tìm ra con trỏ của nó sẽ thay đổi. Thật không may, IE không phải là thông minh vì vậy tôi đã đặt mã con trỏ trở lại.

Tín dụng cho vay này với niềm tin của tôi rằng thay đổi con trỏ là hành động thích hợp ở đây — với cơ hội đó là điều mà trình duyệt sẽ làm. Tôi thực sự không muốn phải thêm và xóa các mục mới (như một hình ảnh bận rộn của một số loại) vào DOM cho một trang mà tôi biết rất ít về. Tập lệnh phải khớp với bất kể thiết kế trực quan nào mà trang sử dụng.

Cuối cùng, Chrome làm cho toàn bộ điều đó không liên quan. Sử dụng cùng một dữ liệu, Chrome sẽ thực hiện trong vòng chưa đến 5 giây và IE và Firefox mất từ ​​10 đến 15 giây để hoàn thành. Vì vậy, công cụ javascript của họ thực sự nhanh hơn. Tôi không thể chờ đợi cho động cơ Firefox 3.1. Thật không may mọi người ở đây vẫn chủ yếu sử dụng IE6.

+0

SortTable có gọi máy chủ không đồng bộ không? – kristina

+0

Không, nó thực hiện tất cả trên máy khách với DOM. –

+0

Nói cách khác: nó chặn cho đến khi hoàn thành. Tôi có thể thấy điều này trong firebug. –

Trả lời

9

Có sử dụng hẹn giờ không?

document.body.style.cursor = "progress"; 

setTimeout(function() 
{ 
    SortTable(cell.cellIndex, dir, sortType); 
    document.body.style.cursor = "auto"; 
}, 10); 
+0

Đó là ít hơn lý tưởng, chắc chắn, nhưng tôi có thể không có sự lựa chọn khác: ( –

+0

Tôi đã kết thúc đi tuyến đường này, và đây là những gì tôi tìm thấy.Tôi không cần phải thiết lập con trỏ bằng cách thêm setTimeout(). trình duyệt con số ra nó cần phải cập nhật con trỏ trên đó là của riêng nó - nó có thể phát hiện các chức năng đang sử dụng rất nhiều CPU .. –

+0

Nevermind: đó là firefox chỉ IE không phải là thông minh và Chrome kết thúc đủ nhanh nó không –

0

Hãy thử xóa document.body.style.cursor = "auto" và đặt nó vào hàm được gọi là hoàn thành hàm SortTable của bạn. Bằng cách đó bạn sẽ giữ con trỏ bận cho đến khi chức năng hoàn thành. Hãy chắc chắn rằng nếu bạn đạt đến một điều kiện lỗi trong SortTable() mà bạn vẫn nhấn cuộc gọi hàm "Không còn bận".

+0

Tôi nghĩ rằng bạn đã đọc sai những gì đang xảy ra, chức năng SortTable sẽ bị chặn –

+0

Vâng, mặc dù có vẻ như câu trả lời là "Đừng làm điều này", tôi thực sự tự hỏi điều gì đang xảy ra ở đây. Có vẻ như trang không bận tâm hiển thị bất kỳ thay đổi nào đối với kiểu trong khi tập lệnh đang chờ xử lý (tôi đã thử thay đổi thành nền màu xanh lam) – user64640

2

Trong web, việc thay đổi con trỏ chuột không phải là thông thường và không đẹp.

Tốt hơn (và dễ dàng hơn) để sử dụng một số hoạt ảnh nhỏ trên trang, hãy kiểm tra http://www.ajaxload.info/ cho các hình ảnh như vậy (đó là trình tạo trực tuyến).

+0

Liên kết tốt đẹp: bạn sẽ nhận được một bản cập nhật ote cho nó sau này nhưng tôi đang giữ lại tại thời điểm này vì vậy câu hỏi vẫn còn trên quan điểm chưa được trả lời lâu hơn một chút. –

+0

Tôi đồng ý rằng việc thay đổi con trỏ là xấu đối với yêu cầu ajax. Tuy nhiên, đây là tất cả trong DOM và có khả năng sử dụng nhiều thời gian cpu. Thay đổi con trỏ là cách truyền thống để chỉ ra rằng với bất kỳ ứng dụng nào. Ngoài ra: con trỏ tiến trình! = Chờ con trỏ. –

+0

Nó phụ thuộc. Thay đổi nó thành một con trỏ là tốt đẹp và thông thường. –

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