2012-03-17 49 views
8

Sau một cuộc đấu tranh lâu dài, cuối cùng tôi đã phát hiện ra cách duy nhất để xóa phong cách tự động điền ở mọi trình duyệt:Phát hiện khi tự động điền đã được lấp đầy

$('input').each(function() { 
    var $this = $(this); 

    $this.after($this.clone()).remove(); 
}); 

Vấn đề là, nó không thể được chạy trong load, vì việc tự động điền các trường xảy ra đôi khi sau khi thực tế. Ngay bây giờ tôi đang chạy nó trên một thời gian chờ là 100 mili giây sau khi load:

// Kill autofill styles 
$(window).on({ 
    load: function() { 
     setTimeout(function() { 
      $('.text').each(function() { 
       var $this = $(this); 

       $this.after($this.clone()).remove(); 
      }); 
     }, 100); 
    } 
}); 

và điều đó dường như an toàn trên thậm chí chậm nhất của hệ thống, nhưng nó thực sự không thanh lịch. Có một số loại sự kiện đáng tin cậy hoặc kiểm tra tôi có thể thực hiện để xem liệu tự động điền có hoàn tất không?

EDIT: Đây là tự động điền.

autofill http://dl.dropbox.com/u/2463964/autofill.png

+0

Chỉ cần tò mò, tại sao bạn muốn xóa các trường biểu mẫu tự động điền? – j08691

+0

@ j08691: Tôi không muốn xóa các trường tự động điền (đó không phải là điều này), tôi muốn xóa nền màu vàng xấu xí cũng không thể thay đổi trong CSS. – Ryan

+1

"Tự động điền" là gì? –

Trả lời

2

Có một lỗi mở qua tại http://code.google.com/p/chromium/issues/detail?id=46543#c22 về vấn đề này, có vẻ như nó có thể (nên) cuối cùng là có thể chỉ cần viết trên phong cách mặc định với một !important chọn, mà sẽ là giải pháp thanh lịch nhất. Mã này sẽ là một cái gì đó như:

input { 
    background-color: #FFF !important; 
} 

Còn bây giờ mặc dù lỗi này là vẫn còn mở và nó có vẻ như giải pháp hackish của bạn là giải pháp duy nhất cho Chrome, tuy nhiên a) là giải pháp dành cho Chrome không cần setTimeout và b) có vẻ như Firefox có thể tôn trọng cờ !important hoặc một số loại công cụ chọn CSS có mức độ ưu tiên cao như được mô tả trong Override browser form-filling and input highlighting with HTML/CSS. Không giúp đỡ à?

+0

Thật không may, nó thực sự cần 'setTimeout', và Firefox có cùng một vấn đề. Tôi tin rằng tôi đang tiếp tục thử các biến thể của cả hai khi chúng ta nói :) – Ryan

+0

Chủ đề tôi đã giải quyết ở cuối cũng có một giải pháp đã được ghi nhận là đang hoạt động, đó là sử dụng đầu vào: bộ chọn tiêu điểm và sử dụng onload javascript để tập trung từng phần tử biểu mẫu. – conartist6

+0

Tôi đã thấy điều đó, nhưng kỳ quặc, nó dường như không hiệu quả với tôi. Tôi đang sử dụng Chrome Canary, vì vậy có thể * rằng * "lỗi" đã được khắc phục :) – Ryan

12

Nếu bạn đang sử dụng Chrome hoặc Safari, bạn có thể sử dụng bộ chọn input:-webkit-autofill CSS để có được các lĩnh vực tự động điền.

đang phát hiện

Ví dụ:

setInterval(function() { 
    var autofilled = document.querySelectorAll('input:-webkit-autofill'); 
    // do something with the elements... 
}, 500); 
+0

Tôi biết bộ chọn đó. Tuy nhiên, tôi không muốn bất kỳ 'setInterval' hay' setTimeout' nào trong mã của tôi. – Ryan

+1

Đây là BY FAR giải pháp tốt nhất mà tôi đã thấy đối với vấn đề của Chrome và tự động điền vào. đầu vào: -webkit-autofill là cách tốt hơn so với bỏ phiếu và setTimeout(), vv THANK YOU rất nhiều cho thực sự cung cấp một câu trả lời cho vấn đề này lâu dài! – ChrisN

+3

@ChrisN, câu trả lời này sử dụng 'setInterval'. – Ryan

1

Tôi đề nghị bạn tránh tự động điền ở vị trí đầu tiên, thay vì cố gắng để đánh lừa trình duyệt

<form autocomplete="off"> 

Thông tin thêm: http://www.whatwg.org/specs/web-forms/current-work/#the-autocomplete

Nếu bạn muốn giữ hành vi tự động điền nhưng sự thay đổi phong cách, có thể bạn có thể làm một cái gì đó như thế này (jQuery):

$(document).ready(function() { 
    $("input[type='text']").css('background-color', 'white'); 
}); 
+1

Vui lòng đọc nhận xét. Chúng tôi đã thiết lập rằng tôi * không muốn tắt tự động hoàn tất *. Đối với việc thiết lập 'background-color' thành' white', nó không hoạt động. Đây chính là lý do tại sao tôi cần giải pháp thay thế. – Ryan

+0

Chỉ cần đọc, xin lỗi @minitech Tôi xin lỗi tôi thực sự nghĩ rằng bạn sẽ cần thời gian chờ, vì các biểu mẫu được lấp đầy bởi chính trình duyệt sau một chút, chứ không phải DOM –

-1
$(window).load(function() 
{ 
    if ($('input:-webkit-autofill')) 
    { 
     $('input:-webkit-autofill').each(function() 
     { 
      $(this).replaceWith($(this).clone(true,true)); 
     }); 
     // RE-INITIALIZE VARIABLES HERE IF YOU SET JQUERY OBJECT'S TO VAR FOR FASTER PROCESSING 
    } 
}); 

Tôi nhận thấy rằng giải pháp jQuery bạn đã đăng không sao chép các sự kiện được đính kèm. Phương pháp tôi đã đăng hoạt động cho jQuery 1.5+ và nên là giải pháp ưu tiên vì nó giữ lại các sự kiện được đính kèm cho từng đối tượng. Nếu bạn có một giải pháp để lặp qua tất cả các biến được khởi tạo và khởi tạo lại chúng thì một giải pháp jQuery 100% hoạt động đầy đủ sẽ có sẵn, nếu không bạn phải khởi tạo lại các biến được đặt khi cần thiết.

ví dụ: var foo = $ ('# foo');

thì bạn sẽ phải gọi: foo = $ ('# foo');

vì phần tử gốc đã bị xóa và bản sao hiện tồn tại ở vị trí của nó.

+0

Đó chắc chắn không phải là giải pháp ưa thích của tôi, bởi vì a) sử dụng trình duyệt sniffing, đó là sai vì Firefox có lỗi tương tự và b) nó vẫn không hoạt động, bởi vì không có thời gian chờ. – Ryan

+0

Phiên bản Firefox nào có lỗi? Vì vậy, tôi có thể chỉnh sửa bình luận của tôi cho phù hợp, bởi vì phiên bản hiện tại của tôi không thể hiện hành vi đó. Nếu bạn không thích duyệt tìm kiếm, hãy chạy câu lệnh if để xem liệu phần tử đó có tồn tại hay không. Lý do chính bạn cần kiểm tra một số loại là vì một số biến có thể cần phải được khởi tạo lại vì bản gốc không còn tồn tại nữa. Ngoài ra, nếu bạn cần một thời gian chờ nó dễ dàng để cắm vào, nhưng tôi đã làm việc hoàn hảo mà không có một hiện tại đó là lý do tại sao tôi rời nó ra khỏi phản ứng của tôi. –

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