2013-06-29 38 views
5

Tôi đã xem xét một chức năng mà Django sử dụng để lấy Mã thông báo CSRF, khi bạn cần xác thực phiên người dùng, sử dụng Jquery và JavaScript. Đây là mã:Vấn đề so sánh chuỗi trong JavaScript

function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie != '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) == (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
} 
var csrftoken = getCookie('csrftoken'); 

Bạn cũng có thể xem mã trực tuyến tại đây trên trang web djangoproject, here.

Được rồi, bây giờ khi tôi dán mã này, tôi nhận được một cảnh báo ánh sáng từ IDE của tôi nói điều này:

Binary operation argument type String is not assignable to type HTMLCollection

có nghĩa là gì bằng cách này? Lỗi này là trên dòng này:

document.cookie && document.cookie != '' 
+8

Trường hợp lỗi nào bị lỗi? Điều này giống như gọi 911 và sau đó không đưa ra địa chỉ của bạn. Số dòng, vui lòng! –

+0

Người đàn ông hài hước ... @ ŠimeVidas –

+1

Bạn đang nói về IDE nào? Thông báo lỗi không có ý nghĩa đối với mã JavaScript. – Pointy

Trả lời

0

Dòng 3:

if (document.cookie && document.cookie != '') { 

các IDE được cảnh báo rằng các chuỗi rỗng '' là một loại dây, và có một diễn viên tiềm ẩn do = của chuỗi rỗng vào loại document.cookie, là một loại HTMLCollection.

+0

Điều đó không thay đổi, tôi sợ. –

+0

Tôi không mong đợi cảnh báo sẽ biến mất; nếu bạn sử dụng! == sẽ không có một loại chuyển đổi tiềm ẩn và lỗi IDE của bạn sẽ biến mất, tuy nhiên kiểm tra của bạn sẽ không bao giờ trở lại đúng bởi vì! == sẽ kiểm tra các loại và trả về false. Có một [post] (http://stackoverflow.com/questions/11125825/converting-a-object-htmlcollection-into-string-in-javascript) về việc chuyển đổi các đối tượng kiểu HTMLCollection thành các chuỗi. –

+0

Nếu Jetbrains Pycharm hoạt động giống như Jetbrains IDEa, bạn có thể thay đổi cài đặt cấu hình kiểm tra? –

0

dòng Cố gắng sửa đổi từ 3 đến:

if (document.cookie && document.cookie != /**@type HTMLCollection*/'') { 

IDE của bạn có thể hiểu document.cookie như là kiểu HTMLCollection. Nhận xét nội tuyến hoạt động như một diễn viên cho trình thông dịch.

4

Vấn đề là Jetbrains PyCharm/Webstorm có "document.cookie" định nghĩa là @type {HTMLCollection}, như bạn có thể nhìn thấy khi Ctrl-click vào 'cookie' biến (mà sẽ mở file "DHTML .js "chứa định nghĩa). Định nghĩa đó là sai, tất cả các tài liệu kỹ thuật cho 'document.cookie' mô tả nó như là một chuỗi, xem ví dụ http://www.w3schools.com/jsref/prop_doc_cookie.asp Thực ra nó cũng được báo cáo là lỗi WEB-11410 trong các công cụ Jetbrains, và dường như đã được sửa trong các phiên bản mới hơn.

Nếu bạn muốn xóa cảnh báo, hãy thêm nhận xét nội tuyến như được đề xuất bởi gztomas hoặc nhấn Alt-Enter trên cảnh báo và chuyển đến tùy chọn "kiểm tra" loại không phù hợp "và sau đó" chặn tuyên bố ", sẽ chỉ tắt cảnh báo cho câu lệnh hiện tại.

Thay đổi so sánh thành! == theo đề xuất của Gannon không có tác dụng. Trên thực tế, so sánh hoạt động chính xác với! ==, có lẽ vì đây chỉ là vấn đề với IDE, 'document.cookie' là một chuỗi trong tất cả các trình duyệt.

(Tôi không có đủ danh tiếng để nhận xét về các câu trả lời trước đó, vì vậy hãy thêm câu trả lời này làm câu trả lời bổ sung ...)

+0

điều này trông giống như một câu trả lời khá tốt, tham khảo các lỗi liên quan và nhiều hơn nữa để tài liệu thực tế của những gì nó cần được. – dashesy