11

Tôi cần kiểm tra hỗ trợ trình giữ chỗ. Các công trình sau đây to lớn trong tất cả các trình duyệt hiện đại, cũng như IE7, IE8, IE9:Tính năng phát hiện đối tượng địa điểm của HTML5

$.support.placeholder = (function() { 
    var i = document.createElement("input"); 
    return "placeholder" in i; 
}()); 

Nó hoạt động, nhưng JSLint phàn nàn về việc sử dụng in:

bất ngờ 'trong'. So sánh với không xác định hoặc thay vào đó hãy sử dụng phương thức hasOwnProperty .

Fine, vì vậy tôi sẽ cấu trúc lại nó như thế này:

$.support.placeholder = (function() { 
    var i = document.createElement("input"); 
    return i.hasOwnProperty("placeholder"); 
}()); 

Bây giờ này qua JSLint mà không cần bất kỳ lỗi hoặc cảnh báo, nhưng nó phá vỡ trong IE7 và IE8 với hạt dẻ cũ này:

Đối tượng không hỗ trợ tài sản hoặc phương pháp 'hasOwnProperty'

Bất kỳ ý tưởng nào làm cho JSLint vui vẻ, như chúng tôi sẽ như IE7 và IE8?

+2

Tạo một công cụ như jslint hạnh phúc không nhất thiết có nghĩa là làm cho mã của bạn tốt hơn miễn là bạn biết bạn đang làm gì. Nếu ông chủ của bạn muốn nó, hãy cho họ một số ví dụ tốt chứng tỏ họ ngu ngốc. – ThiefMaster

+0

Tôi không có lý do tại sao jslint đề xuất chống lại 'in'. Nó đã được khoảng một thời gian vì vậy cần phải có hỗ trợ đầy đủ và nó khá trực quan. Để được hỗ trợ trình giữ chỗ, phần này rất chắc chắn: https://github.com/mathiasbynens/jquery-placeholder – ryanve

Trả lời

15

Bạn cũng có thể sử dụng giải pháp khác JSLint gợi ý:

return typeof i.placeholder !== 'undefined'; 

này nên hoạt động duyệt qua mà không có vấn đề.

+0

Điều này cũng hoạt động tốt, và khá ngắn gọn, và nếu tôi đã bận tâm đọc vào thông báo lỗi tôi nên đã tìm ra điều này :) – karim79

+2

Thực ra JSLint muốn bạn sử dụng 'return i.placeholder! == undefined;' và it ' sẽ nói như vậy nếu bạn thử và sử dụng 'typeof i.placeholder! == 'undefined';'. – MHollis

3

Bạn có thể tìm nạp chức năng qua Object.prototype, sau đó call trên phần tử. Điều này làm cho hàm là sẵn bạn có thể gọi nó là một cách i.hasOwnProperty -fashion (tức là giá trị this đằng sau hậu trường khi gọi nó là i):

Object.prototype.hasOwnProperty.call(i, "placeholder"); 
+0

Tính năng này hoạt động tốt. Cảm ơn bạn đã trả lời :) – karim79

+0

Hmm, bạn sẽ đi đến đâu. – karim79

+0

@ karim79: Cái này cho phép thuộc tính được đặt thành 'undefined', nhưng mặt khác lại giới thiệu một hàm gọi trên cao. – pimvdb

5

câu trả lời của tôi sẽ là don' t. Đừng làm cho JSLint hạnh phúc. JSLint là cách mà Crockford xem JavaScript nên được thực hiện. Đó là tiêu chuẩn cá nhân của anh ấy. Nếu bạn muốn một loại lint cho JavaScript, hãy sử dụng JSHint. Đó là một phiên bản chia nhỏ của JSLint hoàn toàn có thể cấu hình được và không có yêu cầu điên rồ. Từ trang chủ của nó:

JSHint là một nhánh của JSLint, công cụ được viết và duy trì bởi Douglas Crockford.

Dự án ban đầu được bắt đầu như là một nỗ lực để thực hiện một nhiều phiên bản cấu hình của JSLint-một trong đó không thi hành một phong cách mã hóa đặc biệt vào nó người-nhưng sau đó biến thành một công cụ phân tích tĩnh riêng biệt với riêng của mình mục tiêu và lý tưởng.

+0

Đồng ý, nhưng không phải là quyết định của tôi. Tôi phải sống với nó, ít nhất là trong thời gian này. +1 anyway. – karim79