2009-09-09 16 views
7

Trong CSS của tôi, tôi có một quy tắc đó phải được áp dụng cho tất cả các lĩnh vực văn bản (bằng cách sử dụng selector CSS3 input[type=text].Sử dụng jQuery, cách tìm hiểu xem bộ chọn CSS "đầu vào [loại = văn bản]" có được hỗ trợ bởi trình duyệt không?

tôi cũng sử dụng jQuery. Một số trình duyệt như Internet Explorer 6 không hỗ trợ mà hình thức cho selector CSS. Vì vậy, tôi Cách giải quyết là thêm một classname thêm trong CSS:

input[type=text], .workaround_classname{ 
    /* css styling goes here */ 
} 

Và qua jQuery sau đó thêm các lớp CSS:

$('input[type=text]').addClass('workaround_classname'); 

các Câu hỏi là: làm thế nào để đảm bảo quy tắc này chỉ là inv được chấp nhận khi bộ chọn CSS3 không được hỗ trợ nguyên bản?

+2

chỉ nghĩ rằng tôi muốn cho bạn biết rằng '[attr = val]' không phải là bộ chọn CSS3, nó là 2.1 và được hỗ trợ bởi tất cả các trình duyệt hiện đại. Có gì mới trong CSS3 là '[attr^= val]' và các bộ chọn tương tự như RegEx. – peirix

+1

tất cả trừ ie6! yes – vvo

+0

@Vincent: Tôi nói hiện đại, không phải tôi: p – peirix

Trả lời

0

Tôi đã kết thúc bằng cách sử dụng nhận xét có điều kiện trong tệp javascript của mình. Bằng cách này, tôi có thể giải quyết IE6 và áp dụng các lớp CSS

$(function(){ 
    //add css class to input[type=text] fields if the selector is not natively supported 
    // IE6 hack: Since some CSS selectors are not working, we simulate with class names. 
    /*@[email protected] (@_jscript_version <= 5.6) 
    $('input[type=text],input[type=password],input[type=radio],input[type=checkbox]'). 
     each(function() { $(this).addClass('type_' + this.type); }); 
    @[email protected]*/ 

}); 

Bằng cách này, tôi kết thúc với tên lớp bổ sung cho tất cả các lĩnh vực hình thức:

.type_text{} 
.type_radio{} 
.type_checkbox{} 
.type_password{} 
+0

thực sự, làm điều này thực sự tồi tệ hơn việc thêm các lớp vào các phần tử cho tất cả các trình duyệt khi bạn không thể sử dụng một số bộ chọn css. Ngoài ra, nhiều javascript hơn trong ie6 có nghĩa là ít hiệu suất hơn ... :) – vvo

+0

Vincent, bạn bỏ lỡ một điểm quan trọng: Tôi không muốn thêm công việc và không có thêm các bước không cần thiết được thực hiện bởi các nhà phát triển thực hiện phong cách của tôi. Các nhà phát triển chỉ nên tập trung vào suy nghĩ: "tôi muốn một trường văn bản ở đây ..." và KHÔNG phải nhớ thêm một 'class =" type_text "' hoặc tương tự. Tôi đã thấy điều đó xảy ra rất nhiều lần. –

+0

Một điều khác khiến tôi ủng hộ ý tưởng này là hoàn toàn không có sửa đổi đối với các trường hiện có. Và hoàn toàn không có cách nào để quên đặt tên lớp. –

3

Tại sao không đặt một số kiểu css vô dụng và kiểm tra xem kiểu đã được áp dụng hay chưa. Chỉ thêm lớp workaround vào các phần tử không áp dụng kiểu này.

Chỉ có vấn đề là tôi không thể tìm ra một phong cách "vô dụng", bạn có thể sử dụng :-)

+0

Tôi nghĩ rằng các nhận xét @conditional cho IE6 có thể thực hiện thủ thuật. (xem câu trả lời của riêng tôi dưới đây). Bằng cách này, các kiểu chỉ có thể được áp dụng cho tất cả các trường văn bản - và chỉ khi trình duyệt không hỗ trợ kiểu gốc. Trong 8-10 năm khi IE6 thực sự bị loại bỏ, thì nhận xét @conditional có thể bị loại bỏ. –

0

Không có cách nào dễ dàng để biết "trình duyệt này có hỗ trợ bộ chọn CSS3" không. Tất cả những gì bạn có thể làm là phát hiện phiên bản trình duyệt và trình duyệt.

Modernizr sẽ không giúp bạn vì bạn không thể phát hiện xem bộ chọn CSS cụ thể có hoạt động trong tệp .css hay không. (Hoặc bạn phải kiểm tra xem một thuộc tính CSS cụ thể từ bộ chọn CSS của bạn có được áp dụng không và đây thực sự là xấu!)

NHƯNG! Ở đây, cách dễ nhất là quên các bộ chọn CSS 2.1 như [attr =] trong các tệp .css vì nó không được hỗ trợ rộng rãi. Và nếu bạn phải viết cho các trình duyệt không hỗ trợ chúng (như Internet Explorer 6), bạn không thể sử dụng chúng.

Vì vậy, hãy thêm lớp học cho mọi người. Mã của bạn sẽ dễ hiểu hơn, nếu không bạn sẽ luôn thêm mã JavaScript không cần thiết.

Tôi hiểu tôi không trả lời bạn, nhưng đây là b-a-d!

1

Tại sao không chỉ có

input.workaround_classname{ 
    /* css styling goes here */ 
} 

sau đó thêm workaround_classname vào tất cả các đầu vào văn bản trong đánh dấu của bạn.

Các selectors bạn có thể sử dụng được (Tôi nghĩ thứ hai có lẽ là một trong đó sẽ là dễ nhất để hiểu những gì nó đã được lựa chọn cho người khác đọc mã)

$('input:text') 
// or 
$('input:text.workaround_classname') 
// or 
$('input.workaround_classname') 

Sau đó, không phát hiện là cần thiết và bạn sẽ không dựa vào JavaScript để thêm tên lớp.

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