2013-04-12 32 views
12

Cả hai cảnh báo vấn đề JSLint và JSHint khi họ gặp phải một tuyên bố nhãn có dạng phù hợp với biểu thức chính quy sau:Nhãn có thể "javascript:" gây ra bất kỳ sự cố nào không?

/^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i 

Ví dụ, đoạn mã sau tạo ra một cảnh báo "JavaScript URL" từ JSLint và một "Label 'javascript 'trông giống như một url javascript" cảnh báo từ JSHint (chức năng wrapper là không cần thiết, nhưng JSLint không thích báo cáo dán nhãn mà không phải là chức năng đặt phạm vi và đặt ra một cảnh báo khác nhau):

function example(x, y) { 
javascript: 
    while (x) { 
     while (y) { 
      break javascript; 
     } 
    } 
} 

theo như tôi có thể cho biết, không có trình duyệt nào quan tâm đến nó, ngay cả khi nó xuất hiện imme ngay sau giao thức "javascript:" trong bookmarklet. Ví dụ, sau đây luôn luôn có vẻ làm việc (chỉ cần dán vào thanh địa chỉ giống như bất kỳ bookmarklet):

javascript:(function() { javascript:for(var i = 0; i < 2; i++) { alert(i); break javascript; } }()); 

javascript:javascript:for(var i = 0; i < 2; i++) { alert(i); break javascript; } 

thể nhận diện nhãn "javascript:" (hoặc bất kỳ chuỗi khác mà có thể phù hợp với regex đó) bao giờ đã gây ra bất kỳ vấn đề (một số trình duyệt cổ đại có lẽ?) mà sẽ đảm bảo các cảnh báo được tạo ra? Tại sao các cảnh báo này được tạo ra?

+9

Oh, sự trớ trêu, 'phá vỡ javascript' ... 1 – user123444555621

+0

@ Pumbaa80 - Haha, tôi hadn' Tôi đọc nó như thế! Cảm ơn. –

Trả lời

4

tôi là chủ yếu đoán ở đây, nhưng xem xét rằng:

  • javascript: không phải là một giao thức thực tế;
  • không cần bất cứ nơi nào ngoại trừ bookmarklets (nếu không nó được giả định là nhãn);
  • cảnh báo cho biết "trông giống như url javascript".

Tôi nghĩ JSLint gợi ý rằng giao thức giả javascript: là xấu, và bất kỳ thứ gì tương tự như vậy, hoặc có thể bị nhầm lẫn với nó. Nó có thể gây ra bất kỳ vấn đề gì không? Nói đúng, perhaps on IE (chỉ có thể là oldIE). Nhưng, như tôi đã nói, nhãn javascript: có thể là nhầm lẫn với giao thức giả và JSLint không thích bất kỳ điều gì có thể gây nhầm lẫn. Vì vậy, đây có thể là một lời giải thích.

+0

Tôi nghĩ điều này có lẽ đúng. Tôi đã thực hiện tất cả các loại thí nghiệm và không gây ra bất kỳ vấn đề nào, vì vậy tôi sẽ đặt nó xuống như một trong những thứ JSLint kỳ lạ không thực sự quan trọng. Cảm ơn. –

+1

Điều này dường như không được mã hóa thành JSLint, nhưng 'javascript:' cũng được chấp nhận khi ngay lập tức theo sau chuỗi "phần tốt". :) – bfavaretto

1

Điều bfavaretto nói có lẽ là đúng, đặc biệt là dấu đầu dòng cuối cùng, nhưng cũng lưu ý rằng giao thức giả javascript: giả mạo được khuyến khích.

Các MDN đề cập đến điều này: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void#JavaScript_URIs

"Lưu ý, tuy nhiên, giao thức javascript: giả không được khuyến khích qua lựa chọn thay thế khác, chẳng hạn như xử lý sự kiện không phô trương"

Một bài viết về lý do tại sao: http://into-the-zen.blogspot.com/2010/04/dont-use-javascript-pseudo-protocol.html

"IE6 sản xuất một số tác dụng phụ ..."

+0

Tôi hoàn toàn đồng ý. Câu trả lời của tôi có âm thanh như tôi đang khuyến khích sử dụng giao thức giả không? – bfavaretto

+0

@bfavaretto: Không, đó là một câu trả lời hay, tôi chỉ nghĩ rằng điều này cũng cần được đề cập đến. –

+0

Tôi hiểu, cảm ơn vì đã làm rõ! – bfavaretto

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