টেক্সটরিয়া অন্বেষণ সনাক্তকরণ


132

আমি কীভাবে জাভাস্ক্রিপ্ট ব্যবহার করে টেক্সেরিয়ায় পরিবর্তন ইভেন্ট সনাক্ত করব?
টাইপ করার সাথে সাথে কয়টি অক্ষর পাওয়া যায় তা সনাক্ত করার চেষ্টা করছি trying

আমি ওনিচ ইভেন্টটি ব্যবহার করার চেষ্টা করেছি, তবে এটি ফোকাসটি বাইরে থাকলে কেবল লাথি মারবে বলে মনে হয়।

উত্তর:


97

আপনার এটি ব্যবহার করতে হবে onkeyup এবং এর onchange জন্য। ওভেনচ প্রসঙ্গ-মেনু পেস্ট করা রোধ করবে এবং প্রতিটি কী-স্ট্রোকের জন্য অনকিপ চালানো হবে।

কোড নমুনার জন্য কীভাবে পাঠ্যআরিয়ায় সর্বোচ্চতা আরোপ করা যায় সে সম্পর্কে আমার উত্তর দেখুন ।


3
জোশ ইতিমধ্যে যা বলেছিল তার উপর জোর দিতে চেয়েছিলেন, আপনার কী-আপ ব্যবহার করা উচিত, এর জন্য কীডাউন নয়: মূলত টেক্সারিয়ায় পরিবর্তনটি করার আগে কীডাউন ডাকা হয়েছিল বলে মনে হয়, তাই আপনি ভুল দৈর্ঘ্যটি ব্যবহার করবেন (এবং আপনি ' আপনি সত্যিই কী আছেন তা জানেন: টাইপ করা বা মুছতে পারে এবং পাঠ্যটি নির্বাচিত হতে পারে যার অর্থ এটি কেবল +/- 1 এর চেয়ে বেশি)।
ব্রায়ানম্যান্ম ২

65
আমি এখানে একটি -1 দিচ্ছি, দুঃখিত! onkeyupইনপুট সনাক্তকরণের জন্য একটি ভয়ানক ঘটনা। ব্যবহার করুন oninputএবং onpropertychange(আইই সমর্থনের জন্য)।
অ্যান্ডি ই

6
প্রসঙ্গ-মেনু কাটা / পেস্ট ঘটলে "কেবল" সমস্যাটি বরখাস্ত করা onchangeহয় না
টম

4
এটি অনকিডাউন এবং একটি সেটটাইমআউট ব্যবহার করা আরও বেশি প্রতিক্রিয়াশীল যাতে আপনি কীটি প্রকাশের অপেক্ষা না করে তাত্ক্ষণিক পরিবর্তন সনাক্তকরণ পান। আপনার যদি কাটা এবং পেস্ট করা দরকার হয় তবে কাট এবং পেস্ট ইভেন্টগুলি ব্যবহার করুন।
কেভিন বি

1
সতর্কতা: অনকিআপ আপনাকে সমস্যা দিতে পারে। উদাহরণ: এর ইনপুট বিষয়বস্তু পরিবর্তিত হলে আপনাকে কেবল কিছু করা উচিত বলুন। আপনি যদি ধরে নেন যে কোনও কীআপ ইনপুট পরিবর্তন করবে, এটি সত্য নয়। ইনপুট উপর ফোকাস রাখুন। পরবর্তী ক্ষেত্রে যেতে "ট্যাব" ব্যবহার করুন। ইনপুটটিতে ফিরে যেতে এখন "শিফট + ট্যাব" ব্যবহার করুন। কীপ আগুন লাগায় তবুও ইনপুট আসলে ব্যবহারকারীর দ্বারা পরিবর্তিত হয়নি।
জিগ ম্যান্ডেল

117

এটি ২০১২, পিসি-পরবর্তী যুগ এখানে, এবং আমাদের এখনও এটির মতো মৌলিক কিছু নিয়ে লড়াই করতে হবে। এটি খুব সহজ হওয়া উচিত ।

যতক্ষণ না স্বপ্নটি পূর্ণ হয়, ততক্ষণ পর্যন্ত এটি করার সর্বোত্তম উপায়, ক্রস ব্রাউজার: এবং ইভেন্টগুলির সংমিশ্রণটি ব্যবহার করুনinputonpropertychange :

var area = container.querySelector('textarea');
if (area.addEventListener) {
  area.addEventListener('input', function() {
    // event handling code for sane browsers
  }, false);
} else if (area.attachEvent) {
  area.attachEvent('onpropertychange', function() {
    // IE-specific event handling code
  });
}

inputঘটনা যত্ন নেয় IE9 + মুক্তিযোদ্ধা, ক্রোম, অপেরা এবং সাফারি , এবং onpropertychangeযত্ন নেয় IE8 (এটা এছাড়াও IE6 এবং 7 সাথে কাজ করে, কিন্তু কিছু বাগ আছে)।

ব্যবহার করার সুবিধা inputএবং onpropertychangeএটি হ'ল তারা অযথা আগুন জ্বালায় না (যেমন কী Ctrlবা Shiftকীগুলি টিপানোর সময়); সুতরাং আপনি যদি টেক্সারিয়ার সামগ্রী পরিবর্তন করে তুলনামূলকভাবে ব্যয়বহুল অপারেশন চালনা করতে চান তবে এই পথ চলতে হবে

এখন ইন্টারনেট, হিসাবে সবসময়, এই সমর্থন একটি অর্ধ assed পেশা আছে: তন্ন তন্ন inputনা onpropertychangeIE তে দাবানল যখন অক্ষর মুছে ফেলা পাঠ্য এলাকা থেকে। সুতরাং আপনার যদি IE এর অক্ষর মুছতে হ্যান্ডেল করতে হয় তবে ব্যবহার করুন keypress( keyup/ ব্যবহার করার বিপরীতে keydown, কারণ তারা কেবল একবার চাপ দিলে এমনকি ব্যবহারকারী চেপে ধরে কী ধরে রাখে) fire

সূত্র: http://www.alistapart.com/articles/expanding-text-areas- made- elegant/

সম্পাদনা: এটি এমনকি উপরের সমাধানটি নিখুঁত নয় বলে মন্তব্যগুলিতে যথাযথভাবে উল্লেখ করা হয়েছে: addEventListenerটেক্সারিয়ায় সম্পত্তির উপস্থিতি বোঝায় না যে আপনি বুদ্ধিমান ব্রাউজারের সাথে কাজ করছেন; একইভাবে attachEventসম্পত্তি উপস্থিতি IE বোঝায় না । যদি আপনি চান যে আপনার কোডটি সত্যই এয়ার-টাইট হয়ে উঠতে পারে তবে আপনার এটি পরিবর্তন করার বিষয়টি বিবেচনা করা উচিত। পয়েন্টারগুলির জন্য টিম ডাউনের মন্তব্য দেখুন ।


1
এটি সর্বোত্তম পন্থা। আমি এখানে সূচনাগুলি পছন্দ করি না (ব্রাউজার সমর্থন ইভেন্টটির addEventListenerজন্য সমর্থন করে না inputবা বিপরীতে); বৈশিষ্ট্য সনাক্তকরণ আরও ভাল হবে। এটির আলোচনার জন্য এই ব্লগ পোস্টটি দেখুন ।
টিম ডাউন

এই বিষয়ে সম্পূর্ণরূপে টিমের সাথে একমত। oninputআমাদের কীভাবে এটি করা উচিত তা হল, তবে আপনার সম্ভবত addEventListenerব্রাউজার-সমর্থনের জন্য আপনার পরীক্ষা হিসাবে ব্যবহার করা উচিত নয় । যে কোনও ক্ষেত্রে +1।
বেন ডি

1
অসম্মতি, ইনপুট IE9 এর যত্ন নেবে না। দুর্ভাগ্যক্রমে প্রসঙ্গমেনু দিয়ে কাটা / আটকানোও ইনপুট এবং তাই ব্যাকস্পেস। আমি পরীক্ষার জন্য বিরক্ত করিনি, তবে আইই 10 + যে সমস্যাটি স্থির করেছে তাতে আমি কোনও অর্থ রাখব না।
স্টিফান স্টেইগার

1
@ স্টেফানস্টেইগার যার কারণে আমার জবাবটি আইই 9 keypress(এবং সম্ভবত পরবর্তী সংস্করণগুলিতেও) কেসটি পরিচালনা করতে ইভেন্টটি ব্যবহার করার পরামর্শ দেয় ।
ভিকি চিজওয়ানি

inputইভেন্ট হ্যান্ডলারটি .oninputবস্তুর সম্পত্তি প্রয়োগ করে সংজ্ঞায়িতও করা যায় ।
হ্যান্ডেল করুন

20
  • গুগল-ক্রোমের জন্য, অনিনপুট পর্যাপ্ত হবে (উইন্ডোজ 7 এ সংস্করণ 22.0.1229.94 মি সহ পরীক্ষিত)।
  • আইআই 9 এর জন্য, অনিনপুট প্রসঙ্গমেনু এবং ব্যাকস্পেসের সাহায্যে কাটা ব্যতীত সমস্ত কিছুই ধরবে।
  • আইই 8 এর জন্য, অনপুট ছাড়াও পেস্টিং ধরার জন্য অনপ্রোটেরটিচেঞ্জের প্রয়োজন।
  • IE 9 + 8 এর জন্য, ব্যাকস্পেসটি ধরার জন্য অনকিআপের প্রয়োজন।
  • IE 9 + 8-এর জন্য, ওম্যানমোমোভই কেবলমাত্র প্রসঙ্গটিংশের মাধ্যমে কাটা ধরতে পেলাম

ফায়ারফক্সে পরীক্ষা করা হয়নি।

    var isIE = /*@cc_on!@*/false; // Note: This line breaks closure compiler...

    function SuperDuperFunction() {
        // DoSomething
    }


    function SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally() {
        if(isIE) // For Chrome, oninput works as expected
            SuperDuperFunction();
    }

<textarea id="taSource"
          class="taSplitted"
          rows="4"
          cols="50"
          oninput="SuperDuperFunction();"
          onpropertychange="SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally();"
          onmousemove="SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally();"
          onkeyup="SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally();">
Test
</textarea>

1
দুর্দান্ত অনুষ্ঠানের নাম :)
জোনাস গ্রাগার

8

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

var text = document.createElement('textarea');
text.rows = 10;
text.cols = 40;
document.body.appendChild(text);

text.onkeyup = function(){
var callcount = 0;
    var action = function(){
        alert('changed');
    }
    var delayAction = function(action, time){
        var expectcallcount = callcount;
        var delay = function(){
            if(callcount == expectcallcount){
                action();
            }
        }
        setTimeout(delay, time);
    }
    return function(eventtrigger){
        ++callcount;
        delayAction(action, 1200);
    }
}();

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


1
'থ্রোটলিং' বিলম্বিত ক্রিয়াকলাপের জন্য +1! আমি আমার অ্যাপে অনুরূপ কিছু ব্যবহার করি।
psulek

7

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

    $('div.lawyerList').on('change','textarea',function(){
      // Change occurred so count chars...
    });

অথবা

    $('textarea').on('change',function(){
      // Change occurred so count chars...
    });

4
আমি দেখতে পেয়েছি যে পরিবর্তনের ইভেন্টটি প্লেইন জেএসের চেয়ে jQuery এর সাথে বেশি সুসংগত ছিল না। আমি jQuery এর ব্যবহার করেছি bind("input cut paste"...এবং এটি কমন এর মতো কাজ করে - কীবোর্ড বা প্রসঙ্গ মেনু ব্যবহার করে টাইপিং, কাট এবং পেস্ট করুন; এমনকি টেক্সট ড্র্যাগ / ড্রপ।
লরেন্স ডল

2
দুর্ভাগ্যক্রমে, এফএফ এর changeজন্য ইভেন্ট চালায় না textarea
dma_k

4

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

(() => {
	const textArea = document.getElementById('my_text_area');
  textArea.addEventListener('input', () => {
    let textLn =  textArea.value.length;
    if(textLn >= 100) {
      textArea.style.fontSize = '10pt';
    }

  })
})()
<html>
<textarea id='my_text_area' rows="4" cols="50" style="font-size:40pt">
This text will change font after 100.
</textarea>
</html>


1

এইচটিএমএল 5 ইনপুট বৈধতা / প্যাটার্ন বৈশিষ্ট্যের সাথে জুটিবদ্ধ থাকলে কীপটি যথেষ্ট। সুতরাং, ইনপুটটিকে বৈধতা দেওয়ার জন্য একটি প্যাটার্ন (রেজেক্স) তৈরি করুন এবং .checkValidity () স্থিতি অনুসারে কাজ করুন। নীচের মতো কিছু কাজ করতে পারে। আপনার ক্ষেত্রে আপনি দৈর্ঘ্যের সাথে মিলে একটি রেজেক্স চাইবেন। আমার সমাধানটি এখানে অনলাইনে ব্যবহার / ডেমো-সক্ষম ।

<input type="text" pattern="[a-zA-Z]+" id="my-input">

var myInput = document.getElementById = "my-input";

myInput.addEventListener("keyup", function(){
  if(!this.checkValidity() || !this.value){
    submitButton.disabled = true;
  } else {
    submitButton.disabled = false;
  }
});

0

কোড আমি আইকিউ 11 এর জন্য জ্যাকুরি না করে এবং কেবল একটি একক টেক্সারিয়ার জন্য ব্যবহার করেছি:

javascript:

// Impede que o comentário tenha mais de num_max caracteres
var internalChange= 0; // important, prevent reenter
function limit_char(max)
{ 
    if (internalChange == 1)
    {
        internalChange= 0;
        return;
    }
    internalChange= 1;
    // <form> and <textarea> are the ID's of your form and textarea objects
    <form>.<textarea>.value= <form>.<textarea>.value.substring(0,max);
}

এবং এইচটিএমএল:

<TEXTAREA onpropertychange='limit_char(5)' ...

-1

আর একবার চেষ্টা কর. এটি সহজ, এবং ২০১ 2016 সাল থেকে আমি নিশ্চিত এটি বেশিরভাগ ব্রাউজারে কাজ করবে।

<textarea id="text" cols="50" rows="5" onkeyup="check()" maxlength="15"></textarea> 
<div><span id="spn"></span> characters left</div>

function check(){
    var string = document.getElementById("url").value
    var left = 15 - string.length;
    document.getElementById("spn").innerHTML = left;
}

সুতরাং আপনি আইডির মাধ্যমে ইউআরএল পাচ্ছেন, তবে এটি আপনার কোডে প্রদর্শিত হয়নি।
নিখুঁত

-8

আপনি যে কাজটি করতে পারেন তা হ'ল একটি ফাংশন নির্দিষ্ট সময়ের জন্য কল করা এবং এই ফাংশনটি আপনার পাঠ্য সামগ্রীর বিষয়বস্তুগুলি পরীক্ষা করা।

self.setInterval('checkTextAreaValue()', 50);

7
পোলিং একটি খুব খারাপ ধারণা। এটি কেবল কর্মক্ষমতা নষ্ট করবে। এছাড়াও, অন্যান্য পোস্টের মতো, কিছু সমাধান উপস্থিত রয়েছে
পিয়র-অলিভিয়ার থিবল্ট

2
এটি একবিংশ শতাব্দী। কোনও ব্রাউজারে প্রতি 50 এমএসে স্ট্রিং তুলনা পরিচালনা করতে সমস্যা হওয়া উচিত নয়। আপনার নির্বাচকদের ক্যাশে করুন এবং এটি একদম গ্রহণযোগ্য সমাধান।
nullability
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.