2013-02-18 36 views
6

Chúng tôi có tình huống 'lạ' này ở một số mã sản phẩm, ví dụ 11E6, được lưu trữ trong thuộc tính dữ liệu (ex data-prodcode) đang được chuyển đổi thành 11000000, khi được truy xuất bên trong jquery nhấp vào chức năng. Một cái gì đó như thế này:Ngăn chặn chuỗi chuyển đổi chứa số E và số thành số

<a data-prodcode="11E6">click</a> 
    var code = $(this).data('prodcode'); 
    console.log(code); --> 11000000 

Bất kỳ lời khuyên nào về cách tránh hành vi này hoặc điều gì có thể gây ra?

+3

Đó là vì '.data' cố gắng tự động chuyển đổi giá trị thành số hoặc Booleans khi có thể và chuỗi '11E6' trông giống như [một số trong ký pháp khoa học] (http://en.wikipedia.org/wiki/ Scientific_notation # E_notation) đến một máy tính. – Blazemonger

Trả lời

7

Từ documentation:

Mọi nỗ lực được thực hiện để chuyển đổi chuỗi thành một giá trị JavaScript (điều này bao gồm các phép toán luận, số, đối tượng, mảng, và null) nếu không nó là trái như một chuỗi. Để lấy thuộc tính của giá trị dưới dạng một chuỗi mà không có bất kỳ nỗ lực nào để chuyển đổi nó, hãy sử dụng phương thức attr().

Bạn có thể sử dụng attr để tránh phân tích tự động:

var code = $(this).attr('data-prodcode'); 

Để được chính xác hơn: điều này không nên xảy ra. Và trên thực tế nó không xảy ra trong các phiên bản trước. Dưới đây là đoạn code của jQuery hiện tại (phần thú vị nhất là những nhận xét):

if (typeof data === "string") { 
     try { 
      data = data === "true" ? true : 
       data === "false" ? false : 
       data === "null" ? null : 
       // Only convert to a number if it doesn't change the string 
       +data + "" === data ? +data : 
       rbrace.test(data) ? jQuery.parseJSON(data) : 
        data; 
     } catch(e) {} 

Và nó hoạt động trong jQuery 1.8 và 1.9: nó không chuyển đổi chuỗi thành một số nếu chuyển đổi trở lại không sản xuất cùng một chuỗi. Nhưng nó không hoạt động trong jQuery 1.7.

+0

Đảm bảo thêm nhận xét trong mã của bạn giải thích lý do bạn thực hiện việc này, vì vậy một số trình tối ưu hóa có ý nghĩa tốt sẽ không thay đổi lại sau này. – Blazemonger

+1

Thực tế, chức năng 'dữ liệu' của jQuery rất nguy hiểm đối với các chuỗi trong quan điểm của tôi. Nó thực sự trông giống như họ đã cố gắng để được quá thông minh ở đây ... –

+1

Vâng, đây có lẽ là một trường hợp cạnh. Bất kỳ ai CẦN chuỗi trong mọi trường hợp đều có thể và nên sử dụng giải pháp của bạn, điều này có thể hiệu quả hơn '.data'. – Blazemonger

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