2012-05-01 30 views
19

Tôi biết nó đã được thảo luận ở đây trước đây, nhưng tôi không tìm thấy giải pháp/giải pháp thực tế cho điều này, tôi hy vọng nếu ai đó có ý tưởng làm thế nào để giải quyết vấn đề này!In JavaScript bị Chrome chặn, Giải pháp?

Dưới đây là nó là:

Nếu bạn cố gắng gọi window.print() phương pháp thường xuyên trong vòng một trang duy nhất (như nếu người dùng nhấp vào một nút in) trong google Chrome, trình duyệt ném một thông điệp cảnh báo trong giao diện điều khiển, trong đó nêu :

Bỏ qua cuộc gọi quá thường xuyên để in()

Và không có gì xảy ra! Sau vài giây, mọi thứ trở lại bình thường và hộp thoại in xuất hiện ngay khi bạn gọi lại số window.print()! Để làm cho vấn đề tồi tệ hơn, những người dùng Chrome tốt sử dụng thời gian chờ đợi theo thời gian cho một trang gọi lệnh in, nghĩa là người dùng càng nhấp vào nút để in, càng phải chờ hộp thoại in xuất hiện!

Vấn đề này đã được trong chrome trong một thời gian khá (14 phiên bản tiếp theo) và nó được xác nhận như là một lỗi Area-UI, tôi posted it again for google team hôm qua hy vọng nếu một người trong nhóm Chrome có thể xác minh khi tính năng gây phiền nhiễu đáng kinh ngạc này sẽ đã sửa!

Tuy nhiên, những gì tôi đang tìm kiếm ở đây là giải pháp cho vấn đề này, có mọi thứ Tôi có thể thực hiện việc này không? Công ty của tôi đang phát triển một hệ thống tài chính giao dịch cao với nhiều báo cáo cần in ấn, và chỉ một chút trục trặc này, toàn bộ dự án có nguy cơ chạy trong trình duyệt Google Chrome yêu thích của tôi!

Cập nhật:

Here's the code in Chrome browser gây tính năng này và có vẻ như rằng ít nhất 2 giây là cần thiết trước khi có ai đó gọi lệnh in một lần nữa, do đó, một bộ đếm thời gian của khoảng 2 giây trong giao diện người dùng có thể có thể ngăn chặn đi vào một chờ đợi vô hạn gọi lại! bất kỳ suy nghĩ nào khác?

+2

Công việc duy nhất xung quanh tôi có thể nghĩ là có một bộ đếm thời gian bên trong (để theo dõi khi nào nó ok để gọi in) và khi nút in được nhấn có một hình ảnh động tương tự như một AJAX cho đến khi in thực sự được gọi. Điều này là không lớn vì nó vẫn trì hoãn thủ tục in nhưng nó sẽ trông đẹp hơn và lỗi xuất hiện. – GillesC

+2

@gillesc: Vâng, điều đó tốt hơn là không có "gì" khi nhấp vào một nút và bạn nhấp một lần nữa và một lần nữa làm cho nó tồi tệ hơn! Tôi đã tìm thấy dòng mã trong trình duyệt Chrome gây ra tính năng này: http: //git.chromium.org/gitweb/? P = chromium.git; a = commitdiff_plain; h = 8a86b38e5c593998369f4c3a789489e3fd9e8354 và có vẻ như ít nhất 2 giây là cần thiết trước khi ai đó gọi lệnh in một lần nữa, do đó, một bộ đếm thời gian của khoảng thời gian 2 giây có thể có thể ngăn chặn nhận được vào một cuộc gọi chờ đợi vô hạn! –

+1

Có phải các cuộc gọi đến 'window.print' trên cùng một trang hoặc các trang khác nhau không? Nếu khác nhau, chúng có nằm trong cửa sổ/tab hoặc iframe mới không?Hoặc cùng một tab, thông qua chuyển hướng? – apsillers

Trả lời

19

Bạn có điều kiện có thể thay thế chức năng window.print():

// detect if browser is Chrome 
if(navigator.userAgent.toLowerCase().indexOf("chrome") > -1) { 
    // wrap private vars in a closure 
    (function() { 
     var realPrintFunc = window.print; 
     var interval = 2500; // 2.5 secs 
     var nextAvailableTime = +new Date(); // when we can safely print again 

     // overwrite window.print function 
     window.print = function() { 
      var now = +new Date(); 
      // if the next available time is in the past, print now 
      if(now > nextAvailableTime) { 
       realPrintFunc(); 
       nextAvailableTime = now + interval; 
      } else { 
       // print when next available 
       setTimeout(realPrintFunc, nextAvailableTime - now); 
       nextAvailableTime += interval; 
      } 
     } 
    })(); 
} 

Thay vì sử dụng một bộ đếm thời gian an toàn bên ngoài/wrapper, bạn có thể sử dụng là một nội bộ. Chỉ cần thêm điều này và window.print hoạt động an toàn trong Chrome và bình thường ở mọi nơi khác. (Thêm vào đó, việc đóng cửa nghĩa realPrintFunc, intervalnextAvailableTime là tin đến mới window.print

Nếu bạn cần phải phối hợp các cuộc gọi đến window.print giữa nhiều trang đóng khung, bạn có thể thiết nextAvailableTime trong trang phụ huynh, chứ không phải ở việc đóng cửa, vì vậy tất cả các khung có thể truy cập giá trị được chia sẻ bằng cách sử dụng window.parent.nextAvailableTime.

+0

Đoạn mã này thực sự hoạt động, tuy nhiên bạn cần lưu ý rằng các cuộc gọi thường xuyên để in chỉ bị chặn khi ai đó hủy hộp thoại in, vì vậy bộ hẹn giờ chỉ được bắt đầu khi hộp thoại biến mất, tôi đoán điều này được thực hiện tốt bằng cách lưu trữ tham chiếu 'setTimeout' và xóa nó bất cứ khi nào bạn tạo mới, HOẶC bạn có thể đặt cờ bận bất cứ khi nào' setTimeout' bắt đầu và KHÔNG bắt đầu một cờ mới khi cờ được đặt. Cảm ơn bạn đã dành thời gian suy nghĩ –

+0

Đoạn mã này vẫn hoạt động với một số người? Tôi thấy rằng tôi vẫn thấy lỗi 'bỏ qua quá thường xuyên lệnh in' khi sử dụng cả mã như nguyên văn đã cho, và một số biến thể xem cờ/thời gian chờ để không đặt thêm chức năng hết giờ. Sử dụng Chrome 22.0.1229.94. –

1

Giải pháp của tôi là gọi số window.print() ít thường xuyên hơn. Bạn có thể thử gói window.print() vào một phương pháp của riêng bạn và đặt khoảng thời gian tối thiểu phải vượt qua trước khi window.print() được thực hiện lại. Bạn có thể có một số loại thay đổi/hoạt hình trong giao diện người dùng để cho biết rằng công việc đang được thực hiện.

"Đang hoạt động"

Trừ khi bạn nghĩ rằng thực sự nghĩ rằng nhấn nút in nhiều lần một giây/mỗi vài giây sẽ giúp? Tôi có nghĩa là nếu hoạt động window.print() mất nhiều thời gian, nó không phải là lỗi mã của bạn và phải có một "chờ đợi và kiên nhẫn" -indicator trong giao diện người dùng anyway.

+1

Vâng, đó là những gì tôi đã làm cho đến nay, khoảng thời gian 2 giây là thời gian chờ đợi tối thiểu trước khi gửi lệnh in khác –

1

Nếu tất cả máy in của bạn tương thích với mạng, bạn có thể thay đổi điều gì xảy ra khi nhấp vào nút in. Thay vì in trang, ứng dụng của bạn có thể gửi yêu cầu tới máy chủ có URL của trang cần in và thông tin về máy in cần in.

Máy chủ sau đó khởi chạy quy trình in theo cách thủ công và sẽ không có trình duyệt ở giữa, điều này có thể ngăn bạn làm như vậy.

+1

Giải pháp gọn gàng, tôi sẽ làm điều đó khi chương trình được cài đặt trong mạng cục bộ, nhưng tiếc là phần mềm được nhắm mục tiêu trên cả mạng cục bộ và mạng diện rộng! –

3

Tôi đã gặp phải vấn đề tương tự và giải pháp trực tiếp nhất đối với tôi là tạo một cửa sổ mới, viết những gì tôi cần. Tôi đã không phải đối phó với giới hạn của Chrome kể từ khi tôi thay đổi nó để làm việc theo cách này, và tôi không cần phải thực hiện bất kỳ theo dõi nào.

print_window= window.open(); 
print_window.document.write(print_css + divToPrint[0].outerHTML+"</html>"); 
print_window.document.close(); 
print_window.focus(); 
print_window.print(); 
print_window.close(); 
1

Mọi nơi tôi thấy đề cập đến vấn đề này đều đề xuất sử dụng bộ hẹn giờ. Tuy nhiên họ không giải quyết được vấn đề và tôi cảm thấy Kamyar là người duy nhất thực sự đọc nguồn gốc và hiểu được vấn đề, vì vậy tôi tự hỏi tại sao anh ta lại chấp nhận câu trả lời.

Vấn đề chính là độ dài của độ trễ trong Chrome là theo cấp số nhân, vì vậy những giờ làm việc chậm trễ này cũng được tăng lên cho mỗi lần sử dụng, tất nhiên sẽ rất khó chịu. Chrome thực sự chỉ áp dụng sự chậm trễ sau khi yêu cầu in bị hủy nhưng chúng tôi không thể phát hiện xem bản in có thành công hay không.

Giải pháp của Abathur thực sự hoạt động tốt hơn nhiều so với bạn có thể mong đợi. Tôi không chắc chắn nếu tôi sẽ sử dụng nó nhưng nó hoạt động.

Tin vui:

1) Độ trễ thực sự bị giảm trong các phiên bản Chrome mới hơn. Nó bây giờ đi: [2, 2, 2, 4, 8, 16, 32, 32, ...].

2) Ai đó đã phát hành sự cố vào ngày 28 tháng 8: http://code.google.com/p/chromium/issues/detail?id=50186 Nếu bạn muốn giải quyết vấn đề này, vui lòng chuyển sang sao.

1

Không còn hoạt động! Lỗi fixed như một phần của v.23 nếu tôi không sai.

Vì vậy, nếu chu kỳ phát hành là mỗi 6 tuần và Chrome 22 đã được phát hành ngày 25 tháng 9, sau đó bởi 6 tháng 11 (aprox.) Việc sửa chữa sẽ được trong phiên bản ổn định của Chrome

+3

Tôi có 23 và vẫn còn là một vấn đề. –

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