ব্রাউজার স্বতঃপূরণ সনাক্ত করা হচ্ছে


165

কোনও ব্রাউজারে কোনও পাঠ্য-বাক্স স্বয়ংক্রিয়ভাবে ভরেছে তা আপনি কীভাবে বলবেন? বিশেষত ব্যবহারকারীর নাম এবং পাসওয়ার্ড বাক্স যা পৃষ্ঠা লোডের চারপাশে স্বতঃপূর্ণ হয়।

আমার প্রথম প্রশ্নটি এটি পৃষ্ঠা লোড সিকোয়েন্সে কখন ঘটে? এটি ডকুমেন্টের আগে বা পরে? প্রস্তুত?

দ্বিতীয়ত আমি কীভাবে যুক্তি ব্যবহার করতে পারি এটি আবিষ্কার হয়েছে কিনা তা জানার জন্য? এমনটি নয় যে আমি এটিকে ঘটতে বাধা দিতে চাই, কেবল ইভেন্টটিতে আছি। সাধারণতঃ এরকম কিছু:

if (autoFilled == true) {

} else {

}

যদি সম্ভব হয় তবে আমি আপনার উত্তরটি দেখানোর জন্য একটি জিএসফিল দেখতে পছন্দ করব।

সম্ভাব্য সদৃশ

ব্রাউজারের পাসওয়ার্ড অটোফিলের জন্য ডিওএম ইভেন্ট?

ব্রাউজার অটোফিল এবং জাভাস্ক্রিপ্ট ইভেন্টগুলি ট্রিগার করেছে

- তবে এই প্রশ্নগুলিতে ঘটনাবলী কী ঘটেছে তা সত্যই ব্যাখ্যা করে না, তারা কেবল ধারাবাহিকভাবে পাঠ্য-বাক্সটি পরীক্ষা করে দেখায় (পারফরম্যান্সের পক্ষে ভাল নয়!)।


1
চেকিংটিতে কিছু মাইক্রোসেকেন্ড লাগে যখন অন্তর অন্তর প্রতি 100 মিলিসেকেন্ড বা ততক্ষণে চেকটি চালিত হবে ... কীভাবে এটি কার্য সম্পাদনকে প্রভাবিত করবে? যদি ব্রাউজার দ্বারা চালিত কোনও ইভেন্ট উপস্থিত থাকে তবে আমি নিশ্চিত যে তারা এটি ব্যবহার করবে।
ইসাইলিজা

আমি দেখতে আপনি কি বলতে চাইছেন, কিন্তু এটা আমার প্রশ্ন প্রথম অংশ উপর নির্ভর করে JavaScript এর জায়গা (যেমন document.ready আগে) এমনকি সচেতন পরিবর্তন শুধু নিয়েছে
অবর্ণিত

1
ক্রোম / ওয়েবকিটের সেরা সমাধানটি হ'ল ডিওএম নির্বাচনকারী: ডকুমেন্ট.কোয়ারীসিলিটরআল ('ইনপুট:-ওয়েবেকিট-অটোফিল'); সংক্ষিপ্ত বিলম্বের পরে সেটটাইমআউট (... কোড এখানে ... 250);
ক্রিসএন

মূলত আমি স্বতঃপূর্ণ হয়ে থাকলে ব্যবহারকারী স্বয়ংক্রিয়ভাবে লগইন করতে চাই, ক্ষিপ্ত বিরক্তিকর ওটি লগ ইন করে যখন স্বয়ংক্রিয়ভাবে লগ আউট করে।
মুহাম্মদ উমর

@ ক্রিসনএন আপনার মন্তব্যটি আসলে আমাকে একটি (সহজ) সমাধান পেয়েছে। যদিও আমি উত্তর হিসাবে এটি দেখতে পাচ্ছি না! এটিকে এক হিসাবে পোস্ট করুন এবং আমাকে পিং করুন, তাই আমি ধন্যবাদ হিসাবে এটি upvote করতে পারেন।
ইথান কামিনস্কি

উত্তর:


123

সমস্যাটি স্বতঃপূরণটি বিভিন্ন ব্রাউজার দ্বারা আলাদাভাবে পরিচালনা করা হয়। কিছু পরিবর্তন ইভেন্ট প্রেরণ, কিছু না। সুতরাং ব্রাউজার যখন কোনও ইনপুট ক্ষেত্রটি স্বয়ংক্রিয়ভাবে পূর্ণ হয় তখন কোনও ইভেন্টে আটকানো প্রায় অসম্ভব।

  • বিভিন্ন ব্রাউজারের জন্য ইভেন্ট ট্রিগার পরিবর্তন করুন:

    • ব্যবহারকারীর নাম / পাসওয়ার্ড ক্ষেত্রের জন্য:

      1. ফায়ারফক্স 4, আই 7 এবং আই 8 পরিবর্তন ইভেন্ট প্রেরণ করবে না।
      2. সাফারি 5 এবং ক্রোম 9 পরিবর্তন ইভেন্টটি প্রেরণ করে।
    • অন্যান্য ফর্ম ক্ষেত্রগুলির জন্য:

      1. IE 7 এবং IE 8 পরিবর্তন ইভেন্টটি প্রেরণ করবেন না।
      2. ফায়ারফক্স 4 পরিবর্তন পরিবর্তনের ইভেন্ট প্রেরণ করবে যখন ব্যবহারকারীরা পরামর্শের তালিকা থেকে কোনও মান নির্বাচন করেন এবং ক্ষেত্রের বাইরে চলে যান।
      3. ক্রোম 9 পরিবর্তন ইভেন্ট প্রেরণ করে না।
      4. সাফারি 5 পরিবর্তন ইভেন্ট প্রেরণ করে।

আপনার সেরা বিকল্পগুলি হ'ল হয় autocomplete="off"আপনার ফর্মটি ব্যবহার করে কোনও ফর্মের জন্য স্বতঃপূরণ অক্ষম করা বা নিয়মিত বিরতিতে পোল পূরণ হয়েছে কিনা তা দেখার জন্য।

এটি দস্তাবেজটিতে বা তার আগে ভরাট হয়েছে কিনা সে বিষয়ে আপনার প্রশ্নের জন্য ready আবার এটি ব্রাউজার থেকে ব্রাউজার এবং সংস্করণ সংস্করণে পরিবর্তিত হয়। ব্যবহারকারীর নাম / পাসওয়ার্ড ক্ষেত্রগুলির জন্য যখন আপনি নির্বাচন করেন তখন একটি ব্যবহারকারীর পাসওয়ার্ড ক্ষেত্র পূরণ হয়। সুতরাং আপনি যদি কোনও ইভেন্টের সাথে সংযুক্ত করার চেষ্টা করেন তবে সামগ্রিকভাবে আপনার খুব অগোছালো কোড থাকবে।

আপনি এই এখানে ভাল পড়তে পারেন


26
স্বতঃপূরণ এবং স্বতঃপূরণের মধ্যে পার্থক্য আছে দয়া করে নোট করুন। ওপি বিশেষত পৃষ্ঠা লোডে সংরক্ষিত লগইন বিশদে ব্রাউজারগুলি উল্লেখ করছে।
রবার্ট

2
একটি সাধারণ হ্যাক পৃষ্ঠার কিছু গুরুত্বপূর্ণ অংশে একটি মাউসনার ter বোতাম বা অন্য কিছু এর জন্য ব্যবহারকারীর মাউস হেড হওয়ায় ইভেন্টটি ট্রিগার হয়ে যায়।
ব্রাইস

1
@ ব্রাইস ব্যক্তিগতভাবে অটোফিল এমন কিছু ঘটে যা আপনি ইনপুট এরিয়াতে প্রবেশের পরে ঘটে যাওয়ায় ব্যক্তিগতভাবে আমি একটি 'অস্পষ্ট' ইভেন্ট নিয়ে যাব। অবশ্যই এটি আদর্শ নয় তবে উপরের তালিকাভুক্ত ব্রাউজারগুলির ফলব্যাক হিসাবে এটি খুব সহায়ক হতে পারে
জ্যাকজে

inputঘটনাটি ভুলে যাবেন না । ক্রোম স্বয়ং-সম্পূর্ণরূপে এটি জ্বালিয়ে দেয় (এবং সম্ভবত স্বতঃপূর্ণতাও যদি ক্রোমের কাছে থাকে; আমি সবসময় এই জিনিসটি বন্ধ করে দেই)।
টিজে ক্রাউডার

আমার এক লাইনের উত্তরটি দেখুন যদি আপনি কেবল জানতে চান যে টেক্সটবক্সের মানটি গুগল ক্রোম স্বয়ংক্রিয়রূপে পূরণ করা হয়েছে।
ThdK

71

ওয়েবকিট ব্রাউজারগুলির জন্য সমাধান

এমডিএন ডক্স থেকে :-ওয়েবেকিট-অটোফিল সিএসএস সিউডো-ক্লাস:

ব্রাউজারের মাধ্যমে যখন কোনও উপাদানটির মান স্বয়ংক্রিয়ভাবে পূর্ণ হয় তখন -webkit-autofill CSS সিউডো-ক্লাস মেলে

এটি সম্পাদিত হয়ে গেলে আমরা কাঙ্ক্ষিত উপাদানটির উপর একটি অকার্যকর রূপান্তর সিএসএস নিয়ম সংজ্ঞা দিতে পারি । জেএস এরপরে ইভেন্টটিতে প্রবেশ করতে সক্ষম হবে ।<input>:-webkit-autofillanimationstart

ক্লারনা ইউআই দলের কৃতিত্ব । তাদের সুন্দর বাস্তবায়ন এখানে দেখুন:


1
এটি এখন পর্যন্ত, সেরা সমাধান! এই জন্য এখানে লেভ থেকে Kudos। ক্লারনা ইউআইয়ের সমাধান ভাগ করে নেওয়ার জন্য ধন্যবাদ ... আমি এটি না পাওয়া পর্যন্ত আর কিছুই আমার পক্ষে কাজ করে নি। লাইফ সেভার!
ব্র্যাডেন রকওয়েল নেপিয়ার

1
পাশাপাশি সিএসএসের নিয়ম অনুসারে কীফ্রেমগুলি এখানে github.com/klarna/ui/blob/v4.10.0/Feld/styles.scss#L181-L189 এছাড়াও প্রয়োজন
ব্যবহারকারী 1069816

এটি আমার জন্য নির্দোষ কাজ করেছে! সঠিক পদ্ধতিটি বের করার জন্য এটির সাথে কিছুটা খেলার প্রয়োজন। ধন্যবাদ
ক্লারনা

18

এটি আমার জন্য সর্বশেষতম ফায়ারফক্স, ক্রোম এবং এজগুলিতে কাজ করে:

$('#email').on('blur input', function() {
    ....
});

6
'input'! এটি ছিল আমার পক্ষে সবচেয়ে সহজ সমাধান, তবে আমি কেবল স্বতঃপূরণের জন্য পরীক্ষা করেছিলাম, অটোফিল নয়।
গ্রিনআরাকাকুন 23

অস্পষ্ট কিছু অটো সম্পূর্ণ অ্যাড-অন্স দিয়ে আমার পক্ষে কাজ করে না
প্যাথফাইন্ডার

ইনপুট প্রতিটি কিপ্রেসে ট্রিগার করবে। আপনি যদি সার্ভার কল করেন তবে এটি প্রায়শই ট্রিগার হতে পারে।
রিজকিট

দুর্দান্ত সমাধান! এই ইভেন্টগুলির সংমিশ্রণটি ব্যবহারকারী দ্বারা পূরণ করা এবং ব্রাউজার দ্বারা স্বতঃপূরণ নিয়ে সমস্যার সমাধান করে।
পেটর হ্যালাদেক

17

গুগল ক্রোম স্বয়ংক্রিয়রূপে, এটি আমার পক্ষে কাজ করেছে:

if ($("#textbox").is(":-webkit-autofill")) 
{    
    // the value in the input field of the form was filled in with google chrome autocomplete
}

এটি আমার পক্ষেও কাজ করেছিল। আমি কয়েকশো সমাধানের চেষ্টা করেছি এবং কেউ কাজ করেনি। আপনাকে অনেক ধন্যবাদ, আমার দিন এবং আমি যতবার সমাধান অনুসন্ধান করেছি তার সমস্ত সময় বাঁচাও।
পেরোজ্জো

4
এই পদ্ধতির ত্রুটিটি ছুঁড়েছে: "সিনট্যাক্স ত্রুটি, অচেনা এক্সপ্রেশন: অসমর্থিত সিউডো:
-webkit-অটোফিল

1
2020 এর মতো ক্রোমেও কাজ করা হচ্ছে না, ত্রুটিটি অস্বীকৃত অভিব্যক্তি ছুঁড়েছে: অসমর্থিত সিউডো:-ওয়েবকিট-অটোফিল
লিও

15

কোনও ক্ষেত্রে কোনও সমাধান সমাধানের সন্ধান করতে (যেমনটি আমি আজ ছিলাম ঠিক তেমন) ব্রাউজারের স্বতঃপূর্ব পরিবর্তন শুনতে, এখানে একটি কাস্টম জ্যাকুরি পদ্ধতি তৈরি করেছি যা আমি একটি ইনপুটটিতে পরিবর্তন শ্রোতাদের যুক্ত করার সময় প্রযোজনাকে সহজ করার জন্য:

    $.fn.allchange = function (callback) {
        var me = this;
        var last = "";
        var infunc = function () {
            var text = $(me).val();
            if (text != last) {
                last = text;
                callback();
            }
            setTimeout(infunc, 100);
        }
        setTimeout(infunc, 100);
    };

আপনি এটিকে কল করতে পারেন:

$("#myInput").allchange(function () {
    alert("change!");
});

1
আমার কোনও কারণে, এই কোডটি পৃষ্ঠা পুনঃনির্দেশে কাজ করছে না (যখন আমি অ্যাপ্লিকেশনটির লগআউট করি এবং অটোফিলটি ঘটে সেখানে লগইন পৃষ্ঠায় পুনঃনির্দেশিত হয়)। যদিও এটি পৃষ্ঠা রিফ্রেশে কাজ করে।
বিশ্বকুমার

1
দেখতে বেশ মোবাইল ব্যাটারি ড্রেনারের মতো দেখতে: /
স্টেফান ফিস্ক

@ স্টেফানফিস্ক - আসলে তা হয় না। একটি ব্রাউজার পৃষ্ঠার জেএস স্তরে সেট করা একটি সাধারণ পুনরাবৃত্তি টাইমার আপনার ব্যাটারির উপর প্রভাব ফেলতে যথেষ্ট নয়, কারণ বেশিরভাগ ওয়েব পৃষ্ঠায় এটি প্রচুর চলছে .... আপনি সত্যিই ভাবেন যে google.com কোনও পুনরাবৃত্তি টাইমার সেট করে না? আমি যদি
জেএসের সাথে

15

আমি এই সমস্যাটি সম্পর্কে প্রচুর পরিমাণে পড়ছিলাম এবং খুব দ্রুত একটি কার্যপ্রণালী সরবরাহ করতে চেয়েছিলাম যা আমাকে সহায়তা করেছিল।

let style = window.getComputedStyle(document.getElementById('email'))
  if (style && style.backgroundColor !== inputBackgroundNormalState) {
    this.inputAutofilledByBrowser = true
  }

কোথায় inputBackgroundNormalState আমার টেমপ্লেটের জন্য 'আরজিবি (255, 255, 255)'।

সুতরাং মূলত ব্রাউজারগুলি যখন স্বতঃপূরণ প্রয়োগ করে তখন তারা ইঙ্গিত দেয় যে ইনপুটটিতে আলাদা (বিরক্তিকর) হলুদ বর্ণ প্রয়োগ করে ইনপুটটি স্বয়ংক্রিয়ভাবে পূর্ণ।

সম্পাদনা করুন: এটি প্রতিটি ব্রাউজারের জন্য কাজ করে


দুর্দান্ত চিন্তা!
মোটো

7

দুর্ভাগ্যক্রমে আমি এই ক্রস ব্রাউজারটি চেক করার একমাত্র নির্ভরযোগ্য উপায় হ'ল ইনপুটটি পোল করা। এটিকে প্রতিক্রিয়াশীল করার জন্য ইভেন্টগুলিও শুনুন। ক্রোম জাভাস্ক্রিপ্ট থেকে অটো ফিল মানগুলি গোপন করা শুরু করেছে যার একটি হ্যাক দরকার needs

  • প্রতি সেকেন্ডের প্রতিটি অর্ধেক থেকে তৃতীয়াংশ পর্যন্ত পোল করুন (বেশিরভাগ ক্ষেত্রে তাত্ক্ষণিক হওয়া দরকার নেই)
  • JQuery ব্যবহার করে পরিবর্তন ইভেন্টটি ট্রিগার করুন তারপরে পরিবর্তন ইভেন্টটি শোনার কোনও ফাংশনে আপনার যুক্তিটি করুন।
  • Chrome লুকানো স্বতঃপূর্ণ পাসওয়ার্ড মানগুলির জন্য একটি সংযোজন যুক্ত করুন।

    $(document).ready(function () {
        $('#inputID').change(YOURFUNCTIONNAME);
        $('#inputID').keypress(YOURFUNCTIONNAME);
        $('#inputID').keyup(YOURFUNCTIONNAME);
        $('#inputID').blur(YOURFUNCTIONNAME);
        $('#inputID').focusin(YOURFUNCTIONNAME);
        $('#inputID').focusout(YOURFUNCTIONNAME);
        $('#inputID').on('input', YOURFUNCTIONNAME);
        $('#inputID').on('textInput', YOURFUNCTIONNAME);
        $('#inputID').on('reset', YOURFUNCTIONNAME);
    
        window.setInterval(function() {
            var hasValue = $("#inputID").val().length > 0;//Normal
            if(!hasValue){
                hasValue = $("#inputID:-webkit-autofill").length > 0;//Chrome
            }
    
            if (hasValue) {
                $('#inputID').trigger('change');
            }
        }, 333);
    });

6

গিথুব এ সমস্যাটি সমাধান করার জন্য একটি নতুন পলিফিল উপাদান রয়েছে। কটাক্ষপাত আছে স্বতঃপূর্ণ ঘটনা । কেবল এটি ইনস্টল করতে এবং চালিত হওয়া দরকার, অটোফিল প্রত্যাশার মতো কাজ করে।

bower install autofill-event

এটি jQuery কাস্টম ফর্মগুলির সাথে দুর্দান্ত কাজ করেছে। আমি কেবল এটিকে বাদ দিয়েছি এবং আমার কাস্টম নির্বাচন তালিকাটি অটোফিলের সাথে দুর্দান্ত কাজ করেছে।
ক্রিস ব্লুম

6

আমার সমাধান:

changeআপনি সাধারণত যেমন ইভেন্টগুলি শোনেন এবং ডিওএম সামগ্রী লোডে এটি করুন:

setTimeout(function() {
    $('input').each(function() {
        var elem = $(this);
        if (elem.val()) elem.change();
    })
}, 250);

এটি ব্যবহারকারীর সম্পাদনা করার সুযোগ পাওয়ার আগে খালি নয় এমন সমস্ত ক্ষেত্রের পরিবর্তনের ইভেন্টগুলিকে আগুন ধরিয়ে দেবে।


পারফেক্ট। আমি প্রথম সমাধানটি ক্রোমের সাথে কাজ করতে পেলাম!
আইকুলাস

3
এটি সত্যিই @ রিডইকুলাস যা কিছু সমাধান কতটা সহজ হতে পারে।
ক্যামিলো মার্টিন

3
তবে ইলেম.ওয়াল () ক্রোমে স্বতঃপূর্ণ পাসওয়ার্ড ক্ষেত্রগুলির জন্য খালি স্ট্রিং ফিরিয়ে দেয় :(
হেমন্ত_নেগি

@ হেমন্ত_নেগি কি ক্রোম কোনওভাবেই পরিবর্তিত ইভেন্ট প্রেরণ করে না? আমি ভুল হলে শুধরে. আমি লাস্টপাস ব্যবহার করছি এবং এটি নিষ্ক্রিয় করতে খুব অলস আমি এটি ছাড়াও কাজ করে কিনা তা দেখতে।
ক্যামিলো মার্টিন

1
হ্যাঁ ক্রোম প্রেরণ পরিবর্তন ইভেন্ট কিন্তু আমি যখন মানটি পুনরুদ্ধার করার চেষ্টা করি তখন এটি খালি ফিরে আসে।
হেমন্ত_নেগি

4

আমি একই সমস্যার মুখোমুখি হয়েছি যেখানে লেবেলটি পাঠানোর ক্ষেত্রে পাঠানো লেবেলটি ওভারল্যাপিংয়ের জন্য অটোফিল এবং অ্যানিমেশন সনাক্ত করতে পারেনি এবং এ দ্রবণটি আমার পক্ষে কাজ করেছে।

input:-webkit-autofill ~ label {
    top:-20px;
} 

এটি সহায়ক।
রুস্তিশ্যাকলফোর্ড


4

আমি একই জিনিস খুঁজছিলাম। কেবলমাত্র ক্রোম ... আমার ক্ষেত্রে র‍্যাপার ডিভের ইনপুট ক্ষেত্রটি স্বতঃপূর্ণ হয়েছে কিনা তা জানা দরকার। সুতরাং আমি ক্রোম যেমন স্বয়ংক্রিয়ভাবে পূরণ হয় তখন ইনপুট ফিল্ডের মতোই এটিও অতিরিক্ত সিএসএস দিতে পারি। উপরের সমস্ত উত্তর দেখে আমার সম্মিলিত সমাধানটি ছিল:

/* 
 * make a function to use it in multiple places
 */
var checkAutoFill = function(){
    $('input:-webkit-autofill').each(function(){
        $(this).closest('.input-wrapper').addClass('autofilled');
    });
}

/* 
 * Put it on the 'input' event 
 * (happens on every change in an input field)
 */
$('html').on('input', function() {
    $('.input-wrapper').removeClass('autofilled');
    checkAutoFill();
});

/*
 * trigger it also inside a timeOut event 
 * (happens after chrome auto-filled fields on page-load)
 */
setTimeout(function(){ 
    checkAutoFill();
}, 0);

এই কাজের জন্য এইচটিএমএল হবে

<div class="input-wrapper">
    <input type="text" name="firstname">
</div>

3

আমি জানি এটি একটি পুরানো থ্রেড তবে আমি কল্পনা করতে পারি অনেকে এখানে এর সমাধান পেতে পারেন।

এটি করতে, আপনি ইনপুট (গুলি) এর সাথে মান (গুলি) আছে কিনা তা পরীক্ষা করতে পারেন:

$(function() {
    setTimeout(function() {
        if ($("#inputID").val().length > 0) {
            // YOUR CODE
        }
    }, 100);
});

জমা দেওয়ার বোতামটি সক্ষম করার জন্য এটি লোড হয়ে গেলে আমার লগইন ফর্মের মানগুলি পরীক্ষা করতে আমি নিজেই এটি ব্যবহার করি। কোডটি jQuery এর জন্য তৈরি তবে প্রয়োজনে পরিবর্তন করা সহজ।


1
এই কোডটি আমার পক্ষে দুর্দান্ত কাজ করে যদি আপনি তৃতীয় লাইনটি আপডেট করেন($("#inputID:-webkit-autofill").val().length > 0) {
হেক্টর

3

ওয়েবকিট রেন্ডার ইঞ্জিন সহ ব্রাউজারগুলির জন্য এটি সমাধান । ফর্মটি স্বতঃপূর্ণ হয়ে গেলে, ইনপুটগুলি সিউডো শ্রেণিটি পাবেন : -উইবকিট-অটোফিল- (fe ইনপুট:-ওয়েবেকিট-অটোফিল {...})। সুতরাং এটি আপনাকে জাভাস্ক্রিপ্টের মাধ্যমে যাচাই করতে হবে তা শনাক্তকারী।

কিছু পরীক্ষার ফর্ম সহ সমাধান:

<form action="#" method="POST" class="js-filled_check">

    <fieldset>

        <label for="test_username">Test username:</label>
        <input type="text" id="test_username" name="test_username" value="">

        <label for="test_password">Test password:</label>
        <input type="password" id="test_password" name="test_password" value="">

        <button type="submit" name="test_submit">Test submit</button>

    </fieldset>

</form>

এবং জাভাস্ক্রিপ্ট:

$(document).ready(function() {

    setTimeout(function() {

        $(".js-filled_check input:not([type=submit])").each(function (i, element) {

            var el = $(this),
                autofilled = (el.is("*:-webkit-autofill")) ? el.addClass('auto_filled') : false;

            console.log("element: " + el.attr("id") + " // " + "autofilled: " + (el.is("*:-webkit-autofill")));

        });

    }, 200);

});

পৃষ্ঠার লোডগুলি পাসওয়ার্ডের মান, এমনকি দৈর্ঘ্য প্রাপ্ত হলে সমস্যা। এটি ব্রাউজারের সুরক্ষা কারণ। এছাড়াও সময়সীমার , এটা কারণ ব্রাউজার কিছু সময় ক্রম পরে ফর্ম পূরণ করতে হবে।

এই কোডটি পূরণ করা ইনপুটগুলিতে ক্লাস অটো_ফিল্ড যুক্ত করবে । এছাড়াও, আমি ইনপুট ধরণের পাসওয়ার্ডের মান বা দৈর্ঘ্য যাচাই করার চেষ্টা করেছি, তবে পৃষ্ঠায় কিছু ঘটনা ঘটে যাওয়ার ঠিক পরে এটি কাজ করেছে। তাই আমি কিছু ইভেন্টের ট্রিগার চেষ্টা করেছি, কিন্তু সাফল্য ছাড়াই। আপাতত এটি আমার সমাধান। উপভোগ করুন!


এটি আপ-টু-ডেট উত্তর।
বেন র্যাকিকোট

আমি এই সমাধানটি চেষ্টা করেছিলাম এবং আমার পক্ষে খুব ভাল কাজ করেছি। আপনাকে অনেক ধন্যবাদ.
মার্কাস ক্রিসোস্তোমো

2

এই প্রশ্নের স্নিপেট চেষ্টা করে দেখতে এই প্রশ্নের সঠিক সমাধান আমার কাছে আছে।
ডেমো এখানে আছে

function ModernForm() {
    var modernInputElement = $('.js_modern_input');

    function recheckAllInput() {
        modernInputElement.each(function() {
            if ($(this).val() !== '') {
                $(this).parent().find('label').addClass('focus');
            }
        });
    }

    modernInputElement.on('click', function() {
        $(this).parent().find('label').addClass('focus');
    });
    modernInputElement.on('blur', function() {
        if ($(this).val() === '') {
            $(this).parent().find('label').removeClass('focus');
        } else {
            recheckAllInput();
        }
    });
}

ModernForm();
.form_sec {
  padding: 30px;
}
.form_sec .form_input_wrap {
  position: relative;
}
.form_sec .form_input_wrap label {
  position: absolute;
  top: 25px;
  left: 15px;
  font-size: 16px;
  font-weight: 600;
  z-index: 1;
  color: #333;
  -webkit-transition: all ease-in-out 0.35s;
  -moz-transition: all ease-in-out 0.35s;
  -ms-transition: all ease-in-out 0.35s;
  -o-transition: all ease-in-out 0.35s;
  transition: all ease-in-out 0.35s;
}
.form_sec .form_input_wrap label.focus {
  top: 5px;
  color: #a7a9ab;
  font-weight: 300;
  -webkit-transition: all ease-in-out 0.35s;
  -moz-transition: all ease-in-out 0.35s;
  -ms-transition: all ease-in-out 0.35s;
  -o-transition: all ease-in-out 0.35s;
  transition: all ease-in-out 0.35s;
}
.form_sec .form_input {
  width: 100%;
  font-size: 16px;
  font-weight: 600;
  color: #333;
  border: none;
  border-bottom: 2px solid #d3d4d5;
  padding: 30px 0 5px 0;
  outline: none;
}
.form_sec .form_input.err {
  border-bottom-color: #888;
}
.form_sec .cta_login {
  border: 1px solid #ec1940;
  border-radius: 2px;
  background-color: #ec1940;
  font-size: 14px;
  font-weight: 500;
  text-align: center;
  color: #ffffff;
  padding: 15px 40px;
  margin-top: 30px;
  display: inline-block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<form class="form_sec">
    <div class="row clearfix">
        <div class="form-group col-lg-6 col-md-6 form_input_wrap">
            <label>
                Full Name
            </label>
            <input type="text" name="name" id="name" class="form_input js_modern_input">
        </div>
    </div>
    <div class="row clearfix">
        <div class="form-group form_input_wrap col-lg-6 col-md-6">
            <label>
                Emaill
            </label>
            <input type="email" name="email" class="form_input js_modern_input">
        </div>
    </div>
    <div class="row clearfix">
        <div class="form-group form_input_wrap col-lg-12 col-md-12">
            <label>
                Address Line 1
            </label>
            <input type="text" name="address" class="form_input js_modern_input">
        </div>
    </div>
    <div class="row clearfix">
        <div class="form-group col-lg-6 col-md-6 form_input_wrap">
            <label>
                City
            </label>
            <input type="text" name="city" class="form_input js_modern_input">
        </div>
        <div class="form-group col-lg-6 col-md-6 form_input_wrap">
            <label>
                State
            </label>
            <input type="text" name="state" class="form_input js_modern_input">
        </div>
    </div>
    <div class="row clearfix">
        <div class="form-group col-lg-6 col-md-6 form_input_wrap">
            <label>
                Country
            </label>
            <input type="text" name="country" class="form_input js_modern_input">
        </div>
        <div class="form-group col-lg-4 col-md-4 form_input_wrap">
            <label>
                Pin
            </label>
            <input type="text" name="pincode" class="form_input js_modern_input">
        </div>
    </div>
    <div class="row cta_sec">
        <div class="col-lg-12">
            <button type="submit" class="cta_login">Submit</button>
        </div>
    </div>
</form>


2

ক্রোমে, আপনি স্বতঃপূর্ণ উপাদানগুলির জন্য একটি বিশেষ সিএসএস নিয়মটি সেটিংস দ্বারা অটোফিল ক্ষেত্রগুলি সনাক্ত করতে পারেন এবং তারপরে জাভাস্ক্রিপ্ট দিয়ে পরীক্ষা করে দেখতে পারেন যে উপাদানটিতে এই নিয়মটি প্রয়োগ হয়েছে কিনা।

উদাহরণ:

সিএসএস

input:-webkit-autofill {
  -webkit-box-shadow: 0 0 0 30px white inset;
}

জাভাস্ক্রিপ্ট

  let css = $("#selector").css("box-shadow")
  if (css.match(/inset/))
    console.log("autofilled:", $("#selector"))

2

ক্লারনা ইউআই টিম থেকে নেওয়া সিএসএস সমাধান এখানে। তাদের সুন্দর বাস্তবায়ন এখানে সংস্থান দেখুন

আমার জন্য ভাল কাজ করে।

input:-webkit-autofill {
  animation-name: onAutoFillStart;
  transition: background-color 50000s ease-in-out 0s;
}
input:not(:-webkit-autofill) {
  animation-name: onAutoFillCancel;
}

1

আমি একই সমস্যার জন্য এই সমাধানটি ব্যবহার করেছি।

এইচটিএমএল কোড এ পরিবর্তন করা উচিত:

<input type="text" name="username" />
<input type="text" name="password" id="txt_password" />

এবং jQuery কোড থাকা উচিত document.ready:

$('#txt_password').focus(function(){
    $(this).attr('type','password');
});

0

Pwd ফিল্ডটি স্বয়ংক্রিয়ভাবে পূরণ হয়েছে কিনা তা পরীক্ষা করতে আমি ব্যবহারকারীর নামটিতে অস্পষ্ট ইভেন্টটি ব্যবহার করেছি।

 $('#userNameTextBox').blur(function () {
        if ($('#userNameTextBox').val() == "") {
            $('#userNameTextBox').val("User Name");
        }
        if ($('#passwordTextBox').val() != "") {
            $('#passwordTextBoxClear').hide(); // textbox with "Password" text in it
            $('#passwordTextBox').show();
        }
    });

এটি আইইয়ের জন্য কাজ করে এবং অন্যান্য সমস্ত ব্রাউজারের জন্য কাজ করা উচিত (আমি কেবলমাত্র আইআই পরীক্ষা করেছি)


@ ক্রিসএনএন আমি আইইয়ের সাথে আমার সমাধানটি পরীক্ষা করে দেখেছি, ব্রাউজারগুলি জাভাসক্রিপ্ট ইভেন্টগুলি আলাদাভাবে পরিচালনা করে। আমার সমাধানটি সহজ এবং পড়তে সহজ এবং এর জন্য কোড করা আরও কঠিন ব্রাউজারগুলির মধ্যে একটি।
ব্রিজেট অ্যারিংটন

1
আমি একই সমাধান: blurইভেন্ট দিয়ে শেষ করছি । আমি একই ফাংশন প্রয়োগ changeএবং blurঘটনা এবং এটি কাজ করে মহান। অতিরিক্ত লাইব্রেরি ছাড়াই একটি সহজ সমাধান।
পাওলো চেক

0

আমারও একই সমস্যা ছিল এবং আমি এই সমাধানটি লিখেছি।

পৃষ্ঠাটি লোড হওয়ার পরে এটি প্রতিটি ইনপুট ক্ষেত্রে ভোটদান শুরু করে (আমি 10 সেকেন্ড সেট করে ফেলেছি তবে আপনি এই মানটি টিউন করতে পারেন)।
10 সেকেন্ড পরে এটি প্রতিটি ইনপুট ক্ষেত্রে ভোটদান বন্ধ করে এবং এটি কেবলমাত্র ফোকাসড ইনপুটটিতে (যদি এক হয়) ভোটদান শুরু করে। আপনি যখন ইনপুটটি অস্পষ্ট করেন তখন তা বন্ধ হয়ে যায় এবং আপনি যদি কোনওটিতে ফোকাস করেন তবে আবার শুরু হয়।

এইভাবে আপনি শুধুমাত্র সত্যিকারের প্রয়োজন হলে এবং কেবলমাত্র একটি বৈধ ইনপুটটিতে পোল করেন।

// This part of code will detect autofill when the page is loading (username and password inputs for example)
var loading = setInterval(function() {
    $("input").each(function() {
        if ($(this).val() !== $(this).attr("value")) {
            $(this).trigger("change");
        }
    });
}, 100);
// After 10 seconds we are quite sure all the needed inputs are autofilled then we can stop checking them
setTimeout(function() {
    clearInterval(loading);
}, 10000);
// Now we just listen on the focused inputs (because user can select from the autofill dropdown only when the input has focus)
var focused;
$(document)
.on("focus", "input", function() {
    var $this = $(this);
    focused = setInterval(function() {
        if ($this.val() !== $this.attr("value")) {
            $this.trigger("change");
        }
    }, 100);
})
.on("blur", "input", function() {
    clearInterval(focused);
});

আপনার একাধিক মান স্বয়ংক্রিয়ভাবে sertedোকানো হলে এটি বেশ কার্যকরভাবে কাজ করে না তবে বর্তমান ফর্মের প্রতিটি ইনপুট অনুসন্ধান করে এটি টুইট করা যেতে পারে।

কিছুটা এইরকম:

// This part of code will detect autofill when the page is loading (username and password inputs for example)
var loading = setInterval(function() {
    $("input").each(function() {
        if ($(this).val() !== $(this).attr("value")) {
            $(this).trigger("change");
        }
    });
}, 100);
// After 10 seconds we are quite sure all the needed inputs are autofilled then we can stop checking them
setTimeout(function() {
    clearInterval(loading);
}, 10000);
// Now we just listen on inputs of the focused form
var focused;
$(document)
.on("focus", "input", function() {
    var $inputs = $(this).parents("form").find("input");
    focused = setInterval(function() {
        $inputs.each(function() {
            if ($(this).val() !== $(this).attr("value")) {
                $(this).trigger("change");
            }
        });
    }, 100);
})
.on("blur", "input", function() {
    clearInterval(focused);
});

0

আপনি যদি কেবল অটো-ফিল ব্যবহার করা হয়েছে কিনা তা সনাক্ত করতে চান তবে কখন এবং কোন ক্ষেত্রের স্বয়ংক্রিয়-ফিল ব্যবহার করা হয়েছে তা সনাক্ত করার পরিবর্তে আপনি কেবল কোনও লুকানো উপাদান যুক্ত করতে পারেন যা স্বয়ংক্রিয়ভাবে পূর্ণ হবে এবং তারপরে এটি পরীক্ষা করে কিনা যে কোনও মান রয়েছে। আমি বুঝতে পেরেছি যে এটি অনেক লোকের আগ্রহী হতে পারে না। এটি গুরুত্বপূর্ণ যে ইনপুটটি অন্য ইনপুটটির মতো একই ফর্মের অংশ। আপনাকে অবশ্যই এমন একটি নাম ব্যবহার করতে হবে যা অটো-ফিল দ্বারা গ্রহণ করা হবে (উদা। "দ্বিতীয় নাম")।

var autofilldetect = document.createElement('input');
autofilldetect.style.position = 'absolute';
autofilldetect.style.top = '-100em';
autofilldetect.style.left = '-100em';
autofilldetect.type = 'text';
autofilldetect.name = 'secondname';
autofilldetect.tabIndex = '-1';

এই ইনপুটটি ফর্মটিতে যুক্ত করুন এবং ফর্ম জমা দেওয়ার জন্য তার মানটি পরীক্ষা করুন।


0

সেখানে নেই এই যে পোলিং (অন্তত Chrome এর জন্য) ওপর নির্ভর করে না একটি সমাধান মনে করা হয়। এটি প্রায় হ্যাকিশ, তবে আমি মনে করি বিশ্বব্যাপী ভোটদানের চেয়ে কিছুটা ভাল।

নিম্নলিখিত পরিস্থিতিতে বিবেচনা করুন:

  1. ব্যবহারকারী ফিল্ড 1 পূরণ করতে শুরু করে

  2. ব্যবহারকারী একটি স্বতঃপূরণ পরামর্শ নির্বাচন করে যা ফিল্ড 2 এবং ফিল্ড 3 স্বতঃপূর্ণ করে

সমাধান: নিম্নলিখিত jQuery স্নিপেট auto (': - ওয়েবকিট-অটোফিল') এর মাধ্যমে অটো-ফিল্ড ফিল্ডগুলির উপস্থিতি যাচাই করে এমন সমস্ত ক্ষেত্রে একটি অন্বলুর নিবন্ধন করুন)

এটি তাত্ক্ষণিক হবে না যেহেতু ব্যবহারকারী ফিল্ড 1 ব্লার না করা পর্যন্ত এটি বিলম্বিত হবে তবে এটি বিশ্বব্যাপী ভোটদানের উপর নির্ভর করে না তাই আইএমও, এটি আরও ভাল সমাধান।

এটি বলেছে যেহেতু এন্টার কী টিপুন কোনও ফর্ম জমা দিতে পারে তাই আপনার অন্কিপ্রেস সম্পর্কিত একটি হ্যান্ডলারের প্রয়োজনও হতে পারে।

পর্যায়ক্রমে, আপনি polling (': - ওয়েবকিট-অটোফিল') পরীক্ষা করতে বিশ্বব্যাপী ভোটদান ব্যবহার করতে পারেন


0

আমার ব্যক্তিগত অভিজ্ঞতা থেকে, নীচের কোডটি ফায়ারফক্স আইই এবং সাফারির সাথে ভালভাবে কাজ করে তবে ক্রোমে স্বয়ংক্রিয়রূপে বাছাইয়ের ক্ষেত্রে খুব ভাল কাজ করছে না।

function check(){
clearTimeout(timeObj);
 timeObj = setTimeout(function(){
   if($('#email').val()){
    //do something
   }
 },1500);
}

$('#email').bind('focus change blur',function(){
 check();
});

নীচের কোডটি আরও ভাল কাজ করে, কারণ এটি প্রতিটি সময় ট্রিগার করবে যখন ব্যবহারকারীরা ইনপুট ক্ষেত্রে ক্লিক করে এবং সেখান থেকে আপনি ইনপুট ক্ষেত্রটি খালি কিনা তা যাচাই করতে পারেন।

$('#email').bind('click', function(){
 check();
});

0

আমি এর সাথে ক্রোমে সাফল্য পেয়েছি:

    setTimeout(
       function(){
          $("#input_password").focus();
          $("#input_username").focus();
          console.log($("#input_username").val());
          console.log($("#input_password").val());
       }
    ,500);

ঠিক কখন Chrome ক্রম স্বয়ংক্রিয়ভাবে চালিত হয় তা নিশ্চিত নয়, তবে $ ('ইনপুট, নির্বাচন করুন') তে ' আমি ইতিমধ্যে সমস্ত ক্ষেত্রের জন্য স্বতঃপূর্ণ মানগুলি পেয়েছি।
মিরেক

নতুন সংস্করণ হতে পারে?
এন্টোইন ও

0

আমার সমাধানটি হ'ল:

    $.fn.onAutoFillEvent = function (callback) {
        var el = $(this),
            lastText = "",
            maxCheckCount = 10,
            checkCount = 0;

        (function infunc() {
            var text = el.val();

            if (text != lastText) {
                lastText = text;
                callback(el);
            }
            if (checkCount > maxCheckCount) {
                return false;
            }
            checkCount++;
            setTimeout(infunc, 100);
        }());
    };

  $(".group > input").each(function (i, element) {
      var el = $(element);

      el.onAutoFillEvent(
          function () {
              el.addClass('used');
          }
      );
  });

আপনার সমাধান জন্য একটি ব্যাখ্যা সাহায্য করবে
টন

আমি ভেবেছিলাম এটা স্পষ্টতই ছিল। সুতরাং মূলত ধারণাটি হ'ল ইনপুট ক্ষেত্রের মান কয়েকবার পরীক্ষা করা। বর্তমান বাস্তবায়নে এটি 100 বারের বিলম্বের সাথে 10 গুণ। সুতরাং যখন দ্বিতীয় 10 * 1000 = 1 সেকেন্ডের মধ্যে ব্রাউজারটি স্বতঃপূরণ মান পূরণ করে তখন অটোফিলকে দেওয়া কলব্যাক কল করা হবে। বর্তমান উদাহরণে এটি কেবল একটি শ্রেণি যুক্ত করে। আপনার যদি আরও প্রশ্ন থাকে তবে দয়া করে দ্বিধা করবেন না এবং কেবল জিজ্ঞাসা করবেন না :)।
রোমিক

0

গবেষণার পরে সমস্যাটি হ'ল ওয়েবকিট ব্রাউজারগুলি স্বয়ংক্রিয়রূপে পরিবর্তিত ইভেন্টটিকে চালিত করে না। আমার সমাধানটি ছিল ওয়েটকিট যা আমার নিজের দ্বারা ইভেন্টটি যুক্ত করে এবং ট্রিগার পরিবর্তনের ইভেন্টটি স্বতঃপূর্ণ শ্রেণি পায়।

setTimeout(function() {
 if($('input:-webkit-autofill').length > 0) {
   //do some stuff
 }
},300)

ক্রোমিয়ামে ইস্যুটির জন্য এখানে একটি লিঙ্ক দেওয়া আছে। https://bugs.chromium.org/p/chromium/issues/detail?id=636425


0

উদাহরণস্বরূপ ইমেল সনাক্ত করতে, আমি "পরিবর্তন" এবং একটি মিউটেশন পর্যবেক্ষক চেষ্টা করেছি, দু'জনেরই কাজ হয়নি। সেটইন্টারওয়াল লিঙ্কডইন অটো-ফিলের সাথে ভালভাবে কাজ করে (আমার সমস্ত কোড প্রকাশ করে না, তবে আপনি ধারণাটি পাবেন) এবং আপনি যদি এজেএক্সকে ধীর করতে এখানে অতিরিক্ত শর্ত যোগ করেন তবে ব্যাকএন্ডের সাথে এটি দুর্দান্ত খেলে। এবং যদি ফর্ম ক্ষেত্রে কোনও পরিবর্তন হয় না, যেমন তারা তাদের ইমেল সম্পাদনা করতে টাইপ করে না, সর্বশেষ ইমেল অর্থহীন এজেএক্স পিংসকে বাধা দেয়।

// lastEmail needs scope outside of setInterval for persistence.
var lastEmail = 'nobody';
window.setInterval(function() { // Auto-fill detection is hard.
    var theEmail = $("#email-input").val();
    if (
        ( theEmail.includes("@") ) &&
        ( theEmail != lastEmail )
    ) {
        lastEmail = theEmail;
        // Do some AJAX
    }
}, 1000); // Check the field every 1 second

0

ফায়ারফক্সে স্বতঃপূরণ শনাক্ত করতে আমার বেশ কষ্ট হয়েছিল। এটি আমার পক্ষে কাজ করা একমাত্র সমাধান:

ডেমো

এইচটিএমএল:

<div class="inputFields">
   <div class="f_o">
      <div class="field_set">
        <label class="phold">User</label>
        <input type="tel" class="form_field " autocomplete="off" value="" maxlength="50">
      </div>
   </div>
   <div class="f_o">
      <div class="field_set">
         <label class="phold">Password</label>
         <input type="password" class="form_field " autocomplete="off" value="" maxlength="50">
      </div>
   </div>
</div>

সিএসএস:

/* Detect autofill for Chrome */
.inputFields input:-webkit-autofill {
    animation-name: onAutoFillStart;
    transition: background-color 50000s ease-in-out 0s;
}
.inputFields input:not(:-webkit-autofill) {
    animation-name: onAutoFillCancel;
}

@keyframes onAutoFillStart {
}

@keyframes onAutoFillCancel {
}
.inputFields {
  max-width: 414px;
}

.field_set .phold{
  display: inline-block;
  position: absolute;
  font-size: 14px;
  color: #848484;
  -webkit-transform: translate3d(0,8px,0);
  -ms-transform: translate3d(0,8px,0);
  transform: translate3d(0,8px,0);
  -webkit-transition: all 200ms ease-out;
  transition: all 200ms ease-out;
  background-color: transparent;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
  margin-left: 8px;
  z-index: 1;
  left: 0;
  pointer-events: none;
}

.field_set .phold_active {
   font-size: 12px;
   -webkit-transform: translate3d(0,-8px,0);
  -ms-transform: translate3d(0,-8px,0);
  transform: translate3d(0,-8px,0);
  background-color: #FFF;
  padding-left: 3px;
  padding-right: 3px;
}

.field_set input[type='text'], .field_set select, .field_set input[type='tel'], .field_set input[type='password'] {
    height: 36px;
}

.field_set input[type='text'], .field_set input[type='tel'], .field_set input[type='password'], .field_set select, .field_set textarea {
    box-sizing: border-box;
    width: 100%;
    padding: 5px;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    border: 1px solid #ababab;
    border-radius: 0;
}

.field_set {
    margin-bottom: 10px;
    position: relative;
}

.inputFields .f_o {
    width: 100%;
    line-height: 1.42857143;
    float: none;
}

javascript:

    // detect auto-fill when page is loading
  $(window).on('load', function() {
    // for sign in forms when the user name and password are filled by browser
    getAutofill('.inputFields');
  });

  function getAutofill(parentClass) {
    if ($(parentClass + ' .form_field').length > 0) {    
      var formInput = $(parentClass + ' .form_field');
      formInput.each(function(){   
        // for Chrome:  $(this).css('animation-name') == 'onAutoFillStart'
        // for Firefox: $(this).val() != ''
        if ($(this).css('animation-name') == 'onAutoFillStart' || $(this).val() != '') {
          $(this).siblings('.phold').addClass('phold_active');
        } else {
          $(this).siblings('.phold').removeClass('phold_active');
        }
      });
    }
  } 

  $(document).ready(function(){

    $(document).on('click','.phold',function(){
      $(this).siblings('input, textarea').focus();
    });
    $(document).on('focus','.form_field', function(){
      $(this).siblings('.phold').addClass('phold_active');
    });

    // blur for Chrome and change for Firefox
    $(document).on('blur change','.form_field', function(){
      var $this = $(this);
      if ($this.val().length == 0) {        
        $(this).siblings('.phold').removeClass('phold_active');
      } else {
        $(this).siblings('.phold').addClass('phold_active');
      }
    });

    // case when form is reloaded due to errors
    if ($('.form_field').length > 0) {
      var formInput = $('.form_field');
      formInput.each(function(){
        if ($(this).val() != '') {
          $(this).siblings('.phold').addClass('phold_active');
        } else {
          $(this).siblings('.phold').removeClass('phold_active');
        }
      });
    }

  }); 

ক্রোমের জন্য আমি ব্যবহার করি: if ($(this).css('animation-name') == 'onAutoFillStart')

ফায়ারফক্সের জন্য: if ($(this).val() != '')


-2

সিএসএসে চেষ্টা করুন

input:-webkit-autofill { border-color: #9B9FC4 !important; }

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.