2008-10-22 21 views
44

Tôi đang cố gắng gỡ lỗi một tập lệnh JavaScript được đọc trong phần mở rộng của Firefox và được thực hiện. Tôi chỉ có thể nhìn thấy lỗi thông qua giao diện điều khiển Firebug (mã của tôi là vô hình đối với Firebug), và nó báo cáo một "chuỗi chưa hoàn thành chữ".Các nguồn phổ biến của chuỗi ký tự chưa được phân tích

Tôi đã kiểm tra đường và các đường xung quanh nó và mọi thứ có vẻ như dấu ngoặc đơn, dấu ngoặc và dấu ngoặc kép đều được cân bằng, v.v. Các nguyên nhân có thể khác mà tôi nên tìm kiếm là gì?

+2

Tại sao đánh dấu mục này là trùng lặp? Câu hỏi đó có -2 phiếu bầu và không thực sự là cùng một câu hỏi. Có vẻ như ai đó chẳng còn gì để làm cả. – szx

Trả lời

54

Hầu hết các trình duyệt dường như có vấn đề với mã như thế này:

var foo = "</script>"; 

Trong Firefox, Opera và IE8 kết quả này trong một chuỗi lỗi đen chưa hoàn tất. Có thể khá khó chịu khi tuần tự hóa mã html bao gồm các tập lệnh.

+12

Đây là nguyên nhân gây ra lỗi của tôi, mặc dù tập lệnh đã thông qua JSLint. Tôi đã thay đổi "" thành "" và đã sửa nó. – richardkmiller

+3

Ugh. Có lý do nào đằng sau chuyện này không? – Jere

+8

Tôi không thể tin điều này, nó đã khắc phục được sự cố. Tôi không bao giờ đoán được rằng trong một triệu năm. :( –

4

Tìm chuỗi có chứa một qoute đơn không thoát mà có thể được chèn bởi một số mã phía máy chủ.

8

Bạn có thể thử chạy tập lệnh qua JSLint.

+0

Tôi đã thử điều đó. Đầu ra quá ồn ào. Quá nhiều chi tiết định dạng và tôi không thấy bất kỳ điều gì có thể khiến tập lệnh không chạy. – sutee

0

Hãy thử "tìm kiếm nhị phân". Xóa một nửa mã và thử lại. Nếu vẫn còn lỗi, hãy xóa một nửa mã còn lại. Nếu không có lỗi, hãy đặt những gì bạn đã xóa trở lại và xóa một nửa số đó. Nói lại.

Bạn sẽ có thể thu hẹp xuống một vài dòng khá nhanh chóng. Kinh nghiệm của tôi đã được rằng vào thời điểm này, bạn sẽ nhận thấy một số chuỗi dị dạng ngu ngốc.

Nó có thể được thích hợp để thực hiện điều này trên một phiên bản đã lưu của đầu ra HTML cho trình duyệt, nếu bạn không chắc chắn mà tài nguyên server-side lỗi là ở. Nhà phát triển trang

0

Web đoán sai về mã hóa nào được trình duyệt của người xem sử dụng. Điều này thường có thể được giải quyết bằng cách chỉ định một mã hóa trong tiêu đề của trang.

4

Nếu bạn đã thực hiện bất kỳ việc cắt/dán nào: một số tô sáng cú pháp trực tuyến sẽ mang dấu ngoặc đơn và kép, chuyển chúng thành các cặp ngoặc kép được định dạng (cặp mở và đóng phù hợp). (tho tôi không thể tìm thấy bất kỳ ví dụ nào ngay bây giờ) ... Vì vậy, điều đó đòi hỏi phải nhấn Command- + một vài lần và nhìn chằm chằm vào các ký tự báo giá của bạn

cũng vậy, các trình chỉnh sửa và IDE khác nhau sử dụng các mã thông báo khác nhau và JS là một trong nhiều ngôn ngữ động hơn để phân tích cú pháp, vì vậy hãy thử mở tệp bằng emacs, vim, gedit (với các plugin JS) ... Nếu bạn gặp may, một trong số chúng sẽ hiển thị chuỗi màu tím dài chạy đến cuối tập tin.

0

Quét mã đi kèm trước dòng # được đề cập bởi thông báo lỗi. Bất cứ điều gì là unterminated đã dẫn đến một cái gì đó hạ lưu, (dòng đổ lỗi #), để được gắn cờ.

54

Tìm kiếm các dấu ngắt dòng! Đó thường là nguyên nhân.

+0

Tôi sẽ thứ hai - Tôi tình cờ gặp phải vấn đề này, và tất cả những gì tôi cần làm là loại bỏ văn bản của mình. –

+2

Bạn có biết lý do cho việc này không? –

+0

Điều này cố định nó cho tôi, bắt tuyệt vời. – CodeVirtuoso

2

Bạn đã thoát khỏi dấu gạch chéo tiến lên (/) chưa? Tôi đã có rắc rối với những người trước

0

Khoảng trắng là một vấn đề khác mà tôi tìm thấy, gây ra lỗi này. Sử dụng một hàm để cắt khoảng trắng có thể hữu ích.

1

Bạn đã thử Chromebug chưa? Đó là Firebug cho phần mở rộng.

1

Tôi đã gặp sự cố với dấu ngoặc kép trong quá khứ (‘) thường từ sao chép và dán từ Word. Thay thế chúng bằng dấu nháy đơn thông thường (') thực hiện thủ thuật.

1

Có thể vì bạn có ngắt dòng trong mã PHP của mình. Nếu bạn cần ngắt dòng trong thông điệp cửa sổ cảnh báo của bạn, hãy bao gồm nó dưới dạng cú pháp thoát ở cuối mỗi dòng trong mã PHP của bạn. Tôi thường làm điều đó theo cách sau:

$message = 'line 1.\\n'; 
$message .= 'line 2.'; 
22

tôi sẽ bỏ phiếu cho câu trả lời jamtoday nếu tôi đã có "uy tín"

Nếu dữ liệu của bạn đang đến bằng cách PHP, điều này có thể giúp

$str = str_replace(array("\r", "\n"), '', $str); 
+0

FYI, bạn không bỏ phiếu "cho" bất kỳ câu trả lời duy nhất nào trên SO. Upvote/downvote bất kỳ/tất cả các câu trả lời như bạn thấy phù hợp. –

+0

Đã khắc phục sự cố của tôi - được thăng hạng! Cảm ơn! –

+0

Điều này cũng khắc phục được sự cố của tôi, quá tệ Tôi không hiểu * tại sao *. –

1

Ngoài ra, hãy nhớ rằng% 0A là URL ký tự dòng cấp được mã hóa. Phải mất một thời gian để tìm nơi có một linefeed trong mã vi phạm của tôi.

17

Tôi vừa phát hiện ra rằng "<\/script>" dường như hoạt động cũng như "</scr"+"ipt>".

7

Chỉ cần thoát khỏi đóng cửa thẻ của bạn hoặc sử dụng mã ascii

tức

<\/script> 

tức

<&#47;script> 
1

Nếu không có gì giúp, hãy tìm một số nhân vật uni-code như

\u2028 

điều này có thể b rò rỉ chuỗi của bạn trên nhiều dòng và ném lỗi này

-3

$ str = str_replace (mảng ("\ r \ n", "\ n \ r", "\ r", "\ n"), '
', stripslashes ($ str));

Điều này sẽ hiệu quả.

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