2009-07-30 27 views
5

Tôi wiring một kịch bản khởi động hàm JavaScript trên Page_Load để bắn như vậy:document.readyState == "complete" luôn là false. Nhà nước luôn luôn là "tương tác"

ScriptManager.RegisterStartupScript(Me, GetType(Page), "page_init", "page_init();", True) 

Chức năng này gọi một vài chức năng khác nhau để thiết lập trang. Một trong các chức năng đó kiểm tra số document.readyState và đảm bảo rằng nó là "complete". Điều này đề cập đến hình ảnh và tôi muốn đảm bảo mọi thứ đã được hiển thị đầy đủ.

if (document.readyState == "complete") { 

Tất cả mọi thứ hoạt động tốt, cho đến khi tôi cần phải viết một mảng byte vào luồng OutputStream (sử dụng một trong hai Response.BinaryWrite hoặc Response.OutputStream.Write() để cho một tập tin cho người dùng. Sau đó, document.readyState luôn luôn là "tương tác", cho đến khi tôi di chuyển Tôi đã từng sử dụng cuộc gọi setTimeout(myFunction, 1000); nếu document.readyState không hoàn thành để gọi đệ quy chức năng cho đến khi hoàn tất. Chức năng này không bao giờ đạt đến "hoàn thành". và không thể tìm ra hành vi này. Bất kỳ ý tưởng nào về cách thức điều này đang xảy ra?

+0

Bạn đang chạy tập lệnh ở phía máy chủ hoặc phía máy khách. Nếu bạn đang chạy kịch bản trên phía máy chủ thì nó là bình thường vì nó tiếp tục chờ đợi cho kịch bản của bạn để kết thúc. – BYK

Trả lời

5

Tôi vừa phát hiện ra vấn đề là với IFrame, điều mà tôi xin lỗi là một chi tiết còn sót lại trong câu hỏi.

thông tin có thể tìm thêm here:

IE (đáng ngạc nhiên nhận được phiếu bầu của tôi của chính ở đây) Có một sự kiện onreadystatechange rằng đám cháy bất cứ khi nào của iFrame readyState thay đổi tài sản. ReadyState phản ánh vị trí tải xuống trong quy trình .

Nội tuyến: Khi ban đầu bạn đặt giá trị src của phần tử iFrame, các thay đổi của readyFate readyState.Khi tệp đã được tải xuống hoàn toàn, thay đổi readyState thành tương tác. Sự khác biệt lớn giữa IE và các trình duyệt khác là IE sau đó thay đổi thuộc tính readyState để hoàn tất khi trang (hoặc ứng dụng) là được tải đầy đủ và sẵn sàng cho người dùng.

đính kèm: này hoạt động hệt với trường hợp Inline của IE, nhưng tài sản readyState bao giờ thay đổi để hoàn tất. Điều đó sẽ không tạo ra nhiều ý nghĩa vì người dùng phải tự mở mở tệp bằng cách nhấp đúp vào nó hoặc mở tệp từ một số ứng dụng.

5

Để ReadyState lật sang Hoàn thành, phía máy chủ phải chấm dứt kết nối.

Nếu bạn xem mã của mình, có thể bạn không gọi Response.End SAU phương thức BinaryWrite hoặc WriteToStream. Điều này là cần thiết để tuôn ra phản ứng và thông báo cho khách hàng rằng tất cả mọi thứ đã được chuyển giao.

Lưu ý rằng bạn vẫn có thể xử lý phía máy chủ dữ liệu sau khi thực hiện cuộc gọi Response.End, bạn chỉ không thể gửi thêm dữ liệu cho khách hàng.

Một ví dụ điển hình về cách thực hiện điều này đúng là trang 171 của Mastering ASP.Net với C# của A. Russell Jones (google preview here).

Các hạt của nó là bạn nên tạo dòng của bạn, đọc nó vào Byte Array, đóng dòng, sau đó làm một BinaryWrite, và cuối cùng gọi Response.End.

+0

Tôi đang gọi Response.End sau khi tôi viết ra tệp. Sẽ cố gắng gửi thêm dữ liệu cho khách hàng sau khi Response.End gây ra điều này? –

+0

Có thể .. Tuy nhiên, tôi tin rằng Response.End sẽ đóng kết nối với trình duyệt. Vì vậy, bất kỳ nỗ lực để gửi thêm dữ liệu * nên * thất bại. Điều đó nói rằng, không làm điều đó. ;) – NotMe

0

Bạn đã thử gọi Response.Close() thay vì hoặc trước Response.End()? Sau khi so sánh chúng trong Reflector, nó sẽ xuất hiện hai là khác nhau.

+0

Thú vị. Bạn đã từng theo dõi để xem sự khác biệt là gì? – NotMe

0

khi viết trực tiếp vào luồng, bạn nên đặt tiêu đề http có độ dài nội dung thành kích thước chính xác của dữ liệu nhị phân bạn đang gửi. Nó cũng có thể là một vấn đề với loại nội dung (multipart/...) có thể gây nhầm lẫn cho trình duyệt.

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