2009-05-25 73 views
35

Giả sử tôi vô tình viết điều này:Làm thế nào để bạn dừng một vòng lặp vô hạn trong Javascript?

do { } while (true); 

... và sau đó chạy nó. Ngoài việc giết chết trình duyệt của bạn, có cách nào để dừng thực thi javascript (tương đương với Ctrl + Break ở chế độ cơ bản hoặc Ctrl + C) không?

Thông thường, sau khoảng 30 giây trình duyệt của bạn hỏi bạn có muốn dừng tập lệnh chạy dài không, nhưng điều này không phải lúc nào cũng xảy ra (như tôi vừa phát hiện ra)!

FYI: Một vòng lặp đơn giản như thế này: for (i=1; i > 0; ++i); sẽ khiến trình duyệt của tôi gặp sự cố (Firefox 3.5b4). Tôi không cảm thấy giống như thử nghiệm để xem nếu nó là bất kỳ tiện ích của tôi. Liên tục khởi động lại trình duyệt của tôi không phải là ý tưởng của tôi về một đêm thứ hai vui vẻ.

+0

Ngoài sự tò mò, bạn có thể xác định nguyên nhân khiến trình duyệt của bạn không ném cảnh báo 'tập lệnh chậm' không? – alex

+2

không có đầu mối! (giới hạn 15 ký tự này gây phiền nhiễu) – nickf

+0

Điều này có thuộc về SuperUser không? – Chetan

Trả lời

15

Ít nhất với Chrome, bạn có thể xóa tab riêng lẻ chứ không phải toàn bộ ứng dụng.

Randolpho cũng thông báo với tôi rằng IE8 có chức năng tương tự.

+3

Bạn có thể giải thích cách giết một tab đơn lẻ không? Chúng ta có tìm kiếm đúng chrome.exe và giết nó trong trình quản lý tác vụ không? – mellamokb

+12

Nhấn Shift + Esc –

+1

phủ nhận, không hoạt động! ít nhất không phải trên phiên bản 36.0.1985.125 cho linux – Octopus

4

Phụ thuộc vào trình duyệt. Một số cho phép bạn nhấp vào nút "dừng" để ngừng thực thi javascript. Những người khác thì không.

Tôi đề xuất cách tốt nhất là chỉ cần hủy hoàn toàn trình duyệt hoặc tab.

4

Hầu hết các trình duyệt đều có cảnh báo "hiệu suất tập lệnh chậm" xuất hiện khi quá trình kiểm soát javascript mất nhiều thời gian để thực thi. Hộp thoại cảnh báo này thường cung cấp tùy chọn để tiêu diệt tập lệnh vi phạm.

+5

-1 dự phòng. OP: "Thông thường, sau khoảng 30 giây, trình duyệt của bạn hỏi xem bạn có muốn dừng tập lệnh chạy dài không, nhưng điều này không phải lúc nào cũng xảy ra (như tôi vừa phát hiện ra)!" Tôi cũng đã gặp vấn đề tương tự, với hộp thoại không phải lúc nào cũng hiển thị. – mellamokb

+0

Xem stackoverflow.com/questions/905322/… vì lý do có thể có tại sao "hộp thoại không phải lúc nào cũng hiển thị". – user66001

0

trình duyệt phù hợp nhất hiển thị cảnh báo "tập lệnh không phản hồi" ... Nếu không, tôi đoán hành động tốt nhất của bạn là tìm hiểu lý do cảnh báo không xuất hiện.

9

ref: https://superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox
Firefox là đặc biệt có vấn đề ...

Cảnh báo! Caveat! KHÔNG chạy cái này!

javascript: 
    while (true) alert("irritated and exhausted - yet?"); 

Điều này sẽ "vô hạn" và KHÔNG xả hết thời gian chờ vì tập lệnh sẽ không nhai hết thời gian CPU. Trong FF 11, điều này đảm bảo sẽ không có cơ hội phá thai "kịch bản không phản hồi".

Chỉ dừng lại một cách khéo léo kịch bản vi phạm là có thể và tầm thường trong các phiên bản trình duyệt sớm, sử dụng can thiệp thủ công mà không bị xáo trộn và hủy bỏ toàn bộ trình duyệt. Để không có kiểm soát như vậy là một lỗ hổng thiết kế phần mềm trình duyệt lớn. Sự khéo léo và phản xạ không hợp lý được yêu cầu để thực hiện các cơ chế động cơ bằng tay của "các giải pháp" được mô tả trong tài liệu tham khảo.

Lưu ý: Có thể cho các tập lệnh chạy "không giới hạn" thời gian chờ ra và w/o lời nhắc loại cảnh báo. Đây là những đặc biệt nguy hiểm và gây phiền nhiễu. Về cơ bản, các kịch bản chạy chậm đủ để thời gian CPU phân bổ chu kỳ nói 20 giây. được kéo dài trong vài phút hoặc vài giờ hoặc ..., trước khi hết thời gian, bằng cách tạm ngưng thực thi đang chờ được tiếp tục trên trình kích hoạt sự kiện. Thay vì thời gian chu kỳ CPU nó sẽ là tốt hơn cho các kịch bản để thời gian chờ trên đồng hồ thế giới thực. (Bao giờ bạn chú ý rằng bạn không thể hủy bỏ một tập lệnh đang cố truy xuất nội dung - nhưng không thành công - để xây dựng một trang? Trong FF, cả hai nút thanh địa chỉ reloadcancel/stop đều bị vô hiệu hóa dù tab ít nhất có thể được đóng lại.) Javascript bình thường Timeout()setInterval() cuộc gọi không bị này và được điều kiện để trong khi bị đình chỉ, thủ công can thiệp có thể hủy bỏ chúng "duyên dáng".

môi trường thử nghiệm cho các quan sát thực nghiệm:

window.navigator.userAgent= 
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0 

PS. tập lệnh

for (i=1; i > 0; ++i); 

cuối cùng sẽ bẫy lỗi tràn khi i vượt quá giá trị tối đa cho phép.

+0

+1 để biết thông tin đầy đủ và hữu ích! – user66001

0

Từ https://superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox#comment93927_92617, bởi anonymous:

Đây không phải là một giải pháp có mục đích chung đạt yêu cầu, nhưng với Greasmonkey (hoặc có thể có mặt khắp nơi hoặc Jetpack), bạn có thể ghi đè lên window.alert với một chức năng mà các cuộc gọi cửa sổ. xác nhận và tùy chọn ném (s) một lỗi, dừng tất cả các thực thi kịch bản, hoặc bật cờ để ngừng cảnh báo. Điều đó có thể hữu ích nếu trang web bạn tiếp tục quay lại trình bày hành vi này.

0

Tôi làm gì khi sử dụng Chrome và điều này xảy ra là nhấn shift + ctrl + esc để hiển thị trình quản lý cửa sổ. Sau đó chuyển sang tab xử lý và cuộn qua các quy trình chrome.exe (chrome có một quy trình cho từng tab đang mở) cho đến khi tôi tìm thấy một quy trình sử dụng cpu cao hơn đáng kể so với các con oters. Nó có xu hướng có khoảng 30% cho tôi trong khi tất cả những người khác có như 0-2% Sau đó, tôi sẽ chỉ kết thúc quá trình đó. Trên thực tế, có thể thực hiện tương tự bằng cách vào các công cụ> taskmanager hoặc shift + esc trong chrome để mở taskmanager tùy chỉnh của nó cho các quy trình của nó. Có thể dễ sử dụng hơn vì nó hiển thị thêm thông tin về các tab.

27

Tôi đang sử dụng Chome Version 45.0.2454.101

Ở góc trên bên phải, ở menu hamburger, bấm vào More Tools> Task Manager, và sau đó giết tab từ đó. Điều này là nếu cố gắng đóng tab thất bại. Nếu không, một 'X' đơn giản trên tab sẽ tiêu diệt nó.

+0

Công cụ này hoạt động tốt nhất –

+0

có vòng lặp vô tận trong cuộc gọi lại của Ajax khiến cho dấu X đơn giản bị lỗi khi bạn mở khóa devtools. – masterX244

0

Nếu bạn không muốn giết tab hoặc trình duyệt, đây là một kỹ thuật sẽ hoạt động nếu hai điều kiện được đáp ứng (Chrome cho phép cả hai và các trình duyệt khác cũng có thể làm).

  1. Trình duyệt cho phép bạn tạm dừng các mã thực thi
  2. Trình duyệt cho phép bạn thay đổi trạng thái của một biến

Đối tượng là để tạm dừng các mã và thay đổi một giá trị biến để nó sẽ gây một ngoại lệ.

+0

Bạn có thể giải thích cách một người có thể tạm dừng mã thực thi hoặc sửa đổi một biến không? – SafaOrhan

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