চাবি নিচে আছে কিনা তা পরীক্ষা করে দেখুন?


94

বর্তমানে জাভাস্ক্রিপ্টে একটি কী নিচে রয়েছে কিনা তা সনাক্ত করার কোনও উপায় আছে?

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

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


6
আমি এখানে যে উত্তরগুলি দেখতে পাচ্ছি তার মধ্যে একটি সাধারণ সমস্যা হ'ল আপনি যদি কীটি ধরে রাখেন, তবে ট্যাবগুলি পরিবর্তন করুন বা ফোকাস পরিবর্তন করুন, কীটি উপরে চাপুন এবং তারপরে আবার স্যুইচ করুন, কোডটি বিশ্বাস করা হবে আপনি কীটি আবার চাপ না দেওয়া বা না সরিয়ে না দেওয়া পর্যন্ত কীটি নীচে থাকবে is পৃষ্ঠার উপর মাউস। :-(
এরিক মিকেলসেন

উত্তর:


75

বর্তমানে জাভাস্ক্রিপ্টে একটি কী নিচে রয়েছে কিনা তা সনাক্ত করার কোনও উপায় আছে?

নাহ। শুধুমাত্র সম্ভাবনা প্রতিটি পর্যবেক্ষণ করছে keyupএবং keydownএবং স্মরণ।

কিছু সময়ের পরে কীটি পুনরাবৃত্তি হতে শুরু করে, কীডাউন এবং কীপ ইভেন্টগুলিকে একটি শৌখিনীর মতো বন্ধ করে দেয়।

এটা করা উচিত নয়। আপনি অবশ্যই keypressপুনরাবৃত্তি পাবেন, এবং অনেক ব্রাউজারে আপনার পুনরাবৃত্তি হবে keydown, তবে যদি keyupপুনরাবৃত্তি হয় তবে এটি একটি বাগ।

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


15
আপনি, স্যার, একটি সজ্জন এবং একটি পণ্ডিত হয়. উবুন্টুতে থাকা ক্রোমিয়াম এবং ফায়ারফক্স হ'ল আমার প্রাথমিক বিকাশের পরিবেশ, যাতে আমি যে সমস্যাটি দেখছি তা সঠিকভাবে ব্যাখ্যা করে। আশা করি এটি আরও ভাল হয়ে উঠবে, অন্যথায় that টাইমার হ্যাক সলিউশনটি কেবলমাত্র একমাত্র কাজ হতে পারে।
ড্যানিয়েল এক্স মুর

4
হ্যাঁ, এটি হতাশাজনক যে এ নিয়ে কোনও অগ্রগতি নেই। Bugs.launchpad.net/ubuntu/+bug/369880 দেখুন । আমি একটি ব্রাউজার গেম লিখছি এবং মুহুর্তের জন্য আমার কাজটি সংশোধনকারী কীগুলিতে (শিফট, সিটিআরএল, ইত্যাদি) লেগে থাকা যা একেবারে পুনরায় হয় না।
16

4
না, তাদের যথাযথ ইভেন্টগুলির অভাবের দ্বারা সত্যিকারের পুনরাবৃত্ত কীপ্রেসগুলি থেকে আলাদা করা সম্ভব keyup
মকো

4
এটি কি এখনও 8 বছর পরে আছে? এই উত্তরটি আপডেট করার প্রয়োজন হতে পারে।
মার্কো লাভাগ্নিনো

4
পার্সিং সহায়তা: (লিনাক্স
অ্যান্ড অ্যান্ড

136

ব্যবহারের ক্ষেত্রে keyupএবং keydownলিসেনারের যখন চাবিকাঠি যায় নিচে ট্র্যাক ব্যাক আপ, সেখানে হয় আসলে কিছু বৈশিষ্ট্য যে আপনাকে বলতে যদি নির্দিষ্ট কী ডাউন হয়।

window.onmousemove = function (e) {
  if (!e) e = window.event;
  if (e.shiftKey) {/*shift is down*/}
  if (e.altKey) {/*alt is down*/}
  if (e.ctrlKey) {/*ctrl is down*/}
  if (e.metaKey) {/*cmd is down*/}
}

এটি সমস্ত ব্রাউজার দ্বারা উত্পন্ন ইভেন্ট অবজেক্টগুলিতে উপলভ্য keydown, যেমনগুলির keyup, এবং keypress, সুতরাং আপনাকে মাউসমোভ ব্যবহার করতে হবে না।

আমি নিজের ইভেন্টের জিনিসগুলি তৈরি করে document.createEvent('KeyboardEvent')এবং এর document.createEvent('KeyboardEvent')জন্য e.shiftKeyএবং এর সন্ধানের চেষ্টা করেছি , তবে আমার ভাগ্য হয়নি।

আমি ম্যাকে ক্রোম 17 ব্যবহার করছি


আমি এটি নতুন এবং পুরানো উভয় ব্রাউজারেই, এমনকি এইচটিএ-র ব্যবহার করছি
জাকব স্টার্নবার্গ

4
কিছু নম্বর বর্তমানে নিচে থাকলে এই উত্তরটি কার্যকর করার কোনও উপায় আছে কি? আমি চেষ্টা করেছি (e.keyCode == 49) {কনসোল.লগ ("1 নিচে"); works তবে কাজ করে না :(
রবার্তো সেপলভেদা ব্রাভো

আরে @ রবার্তোসেপলভেদা ব্র্যাভো রবার্ট পরের উত্তরে আপনাকে প্রশ্নের উত্তর বলে মনে হচ্ছে। ;)
মার্ক ওডি

আপনি শিফটটি বোঝাতে চাইলে আপনার কীআপে e.shiftKey সন্ধান করা উচিত নয়। পরিবর্তে যেমন onclick এ e.shiftKey ব্যবহার করুন।
ম্যাকিক

46

আমার সমাধান:

var pressedKeys = {};
window.onkeyup = function(e) { pressedKeys[e.keyCode] = false; }
window.onkeydown = function(e) { pressedKeys[e.keyCode] = true; }

আমি এখন চেক করে স্ক্রিপ্টের অন্য কোনও কি টিপুন কিনা তা পরীক্ষা করে দেখতে পারি

pressedKeys["code of the key"]

যদি এটি সত্য হয় তবে কীটি টিপুন।


4
যেহেতু কীগুলি ইতিমধ্যে একটি ফাংশন, তাই একটি ভিন্ন ভেরিয়েবলের নাম আরও ভাল।
রাভেন

4
এটি আল্ট কীটি নিচে রয়েছে কিনা বা না তা সনাক্ত করার জন্য কাজ করবে না।
মাইকেল

4
এটি ডাউন / ডাউন / বাম / ডান সনাক্ত করার জন্য দুর্দান্ত
জোনাথন স্পিলার

11

আমি বিশ্বাস করি না ইসকিডাউন ফাংশনের মতো কিছু আছে তবে আপনি নিজের লেখা লিখতে পারেন।

মূলত, এমন একটি অ্যারে তৈরি করুন যার দৈর্ঘ্যটি আপনি কীগুলি পর্যবেক্ষণ করতে চান তার সংখ্যা। তারপরে ডকুমেন্টস / পৃষ্ঠাগুলি / কী-আপ এবং কীডাউন ইভেন্টগুলি নিয়ন্ত্রণ করে, কীটির স্থিতি দিয়ে অ্যারে আপডেট করুন।

তারপরে একটি ফাংশন লিখুন যা একটি নির্দিষ্ট কী নিচে রয়েছে কিনা তা পরীক্ষা করে একটি বিল ফেরত দেয়।

var keyEnum = { W_Key:0, A_Key:1, S_Key:2, D_Key:3 };
var keyArray = new Array(4);

function onKeyDown()
{
    // Detect which key was pressed
    if( key == 'w' )
        keyArray[keyEnum.W_Key] = true;
    // Repeat for each key you care about...
}

function onKeyUp()
{
    // Detect which key was released
    if( key == 'w' )
        keyArray[keyEnum.W_Key] = false;
    // Repeat for each key you care about...
}

function isKeyDown(key)
{
    return keyArray[key];
}

আপনি যা চান তা পূরণ করা উচিত।


4
এটি ভাল, এবং প্রকৃতপক্ষে সমাধানের অংশ, তবে আমি যে কীপটির পুনরাবৃত্তি বাগটি ভোগ করছি তাতে এটি সম্বোধন করে না। বোবিন্সের উত্তর দেখুন।
ড্যানিয়েল এক্স মুর

5
আপনি ভাল এবং আরও বেশি লিখতে চাইলে এটি কোনও ভাল সমাধান নয়। একটি "কীলিস্ট = {};" একটি বস্তু হচ্ছে "কীলিস্ট [কী] = সত্য;" এনাম বা সীমা ছাড়াই এটি স্ট্রিং সূচকগুলি / বৈশিষ্ট্যগুলি ব্যবহার করে এবং সমস্ত কীগুলির জন্য কাজ করে।

6

ইতিমধ্যে ব্রাউজারে কিছু অন্তর্নির্মিত আছে কিনা তা পরীক্ষা করতে এখানে শেষ হয়েছিল, তবে মনে হয় এটি সেখানে নেই। এটি আমার সমাধান (রবার্টের উত্তরের সাথে খুব মিল):

"use strict";

const is_key_down = (() => {
    const state = {};

    window.addEventListener('keyup', (e) => state[e.key] = false);
    window.addEventListener('keydown', (e) => state[e.key] = true);

    return (key) => state.hasOwnProperty(key) && state[key] || false;
})();

তারপরে আপনি কি টিপুন কি না তা পরীক্ষা করতে পারেন is_key_down('ArrowLeft')


1

অন্যান্য ব্যক্তিরা এর আগে এই ধরণের প্রশ্ন জিজ্ঞাসা করেছেন (যদিও আমি এখনই কোনও স্পষ্টতূপ দেখি না)।

আমি মনে করি এর উত্তর হ'ল keydownইভেন্ট (এবং এর দুটি keyup) আপনার প্রাপ্ত সমস্ত তথ্য। পুনরাবৃত্তি অপারেটিং সিস্টেমে দৃ firm়ভাবে তারযুক্ত হয় এবং একটি অ্যাপ্লিকেশন প্রোগ্রাম কীটির আসল অবস্থার জন্য BIOS কে জিজ্ঞাসা করার খুব একটা সুযোগ পায় না।

আপনি যা করতে পারেন এবং সম্ভবত আপনাকে যদি এই কাজটি করার দরকার হয় তবে হ'ল প্রোগ্রামটিমে কীটিটি ডি-বাউন্স করা। মূলত, আপনি মূল্যায়ন করতে পারেন keydownএবং keyupনিজেকে কিন্তু একটি উপেক্ষা keyupঘটনা যদি এটা শেষ পর খুব দ্রুত সঞ্চালিত keydown... অথবা মূলত, আপনি আপনার প্রতিক্রিয়া বিলম্ব করা উচিত নয় keyupদীর্ঘ যথেষ্ট নিশ্চিত আরেকটা নয় হতে keydownএর 0.25 সেকেন্ড ভালো কিছু সঙ্গে নিম্নলিখিত ইভেন্টে keyup

এটিতে টাইমার ক্রিয়াকলাপ ব্যবহার করা এবং পূর্ববর্তী ইভেন্টগুলির জন্য মিলিসেকেন্ড সময় রেকর্ড করা জড়িত। আমি এটি বলতে পারি না এটি খুব আবেদনময়ী সমাধান, তবে ...


4
আমি চিন্তিত ছিলাম যে এটি এখানে আসতে পারে।
ড্যানিয়েল এক্স মুর

1
/*
Tracks what keys are currently down on the keyboard
*/

function keyboard_module(onUpdate){
    var kb = {};
    var unicode_mapping = {};
    document.onkeydown = function(e){
        var unicode=e.charCode? e.charCode : e.keyCode
        var key = getKey(unicode);
        kb[key] = true;
        if(onUpdate){
            onUpdate(kb);
        }
    }

    document.onkeyup = function(e){
        var unicode=e.charCode? e.charCode : e.keyCode
        var key = getKey(unicode);
        delete kb[key];
        if(onUpdate){
            onUpdate(kb);
        }
    }

    function getKey(unicode){
        if(unicode_mapping[unicode]){
            var key = unicode_mapping[unicode];
        }else{
            var key= unicode_mapping[unicode] = String.fromCharCode(unicode);
        }
        return key;
    }
    return kb;
}

function testing(kb){
    console.log('These are the down keys', kb);
}


var keyboard = keyboard_module(testing);

....
//somewhere else in the code
if(keyboard['K']){/*do something special */}

স্ট্রিং.ফ্রোমচারড (ইউনিকোড) নিশ্চিত না; একটি দ্রুত অনুসন্ধান বা না, তাই আমার কাছে ইউনিকোড_ম্যাপিং অবজেক্ট রয়েছে। এই কোডটি যদি অতিমাত্রায় হয় তবে এই কোডটি কিছুটা ছাঁটাতে বের করার মতো কিছু হতে পারে। যেহেতু কী-ডাউনগুলি জন্য বার বার বলা হবে, গতি গুরুত্বপূর্ণ, তাই কেন আমি ম্যাপিংকে হতাশাবাদীভাবে যুক্ত করেছি।
রবকোহর

1

নিম্নলিখিত কোডটি আমি ব্যবহার করছি:

var altKeyDownCount = 0;
window.onkeydown = function (e) {
    if (!e) e = window.event;
    if (e.altKey) {
        altKeyDownCount++;
        if (30 < altKeyDownCount) {
            $('.key').removeClass('hidden');
            altKeyDownCount = 0;
        }
        return false;
    }
}

window.onkeyup = function (e) {
    if (!e) e = window.event;
    altKeyDownCount = 0;
    $('.key').addClass('hidden');
}

যখন ব্যবহারকারী কিছু সময়ের জন্য (প্রায় ২ সেকেন্ড) আল্ট কীটি ধরে রাখেন, তখন একটি গ্রুপের লেবেল (শ্রেণি = 'কী লুকানো') উপস্থিত হয়। আল্ট কীটি প্রকাশিত হলে, লেবেলগুলি অদৃশ্য হয়ে যায়। jQuery এবং বুটস্ট্র্যাপ উভয়ই ব্যবহৃত হয়।


এবং অল্ট ডাউন থাকাকালীন "ট্যাব" টিপলে কী হবে?
মাইকেল

1

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

গ্রন্থাগারটি কীড্রাউন

এখানে অপারেটিভ কোডের নমুনা যা শ্রোতাদের সেট করতে হবে তার কীটি পরিবর্তন করে আমার উদ্দেশ্যগুলির জন্য ভাল কাজ করেছে:

kd.P.down(function () {
  console.log('The "P" key is being held down!');
});

kd.P.up(function () {
  console.clear();
});

// This update loop is the heartbeat of Keydrown
kd.run(function () {
  kd.tick();
});

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

আশা করি এটা কাজে লাগবে.


1

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

সংশোধক কী ( Shiftইত্যাদি) ইত্যাদির মাধ্যমে পর্যবেক্ষণ করা যেতে পারে mousemoveধরে নেওয়া যে পিছনে ট্যাব করার সময় কমপক্ষে একটি মাউস মিথস্ক্রিয়া প্রত্যাশিত, যা প্রায়শই ঘটে।

সবচেয়ে সব অন্যান্য চাবি জন্য (সংশোধনকারীদের ছাড়া, Tab, Delete, কিন্তু সহ Space, Enter), পর্যবেক্ষণ keypressসবচেয়ে অ্যাপ্লিকেশনের জন্য কাজ করবে - একটি কী চেপে অনুষ্ঠিত আগুন অব্যাহত থাকবে। চাবিটি পুনরায় সেট করতে কিছুটা বিলম্ব হয়েছে যদিও keypressগুলি চালানোর সময়সীমার কারণে । মূলত, যদি keypressগুলি চালানো না থাকে , তবে বেশিরভাগ চাবিটি বাতিল করা সম্ভব। এটি, সংশোধকগুলির সাথে একত্রিত করা বেশ বায়ুচঞ্চল, যদিও আমি কী করব Tabএবং কী করব তা সন্ধান করি নি Backspace

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


কিপ্রেস এখন হ্রাস করা হয়েছে। এটি Chrome এ মোটেও কাজ করে বলে মনে হচ্ছে না।
এডজর

0

এটি ফায়ারফক্স এবং ক্রোমে কাজ করে।

আমার স্থানীয়ভাবে একটি বিশেষ এইচটিএমএল ফাইল খোলার প্রয়োজন ছিল ( Enterউইন্ডোজের ফাইল এক্সপ্লোরারটিতে ফাইলটি নির্বাচন করার সময় টিপে ), কেবলমাত্র ফাইলটি দেখার জন্য বা এটি একটি বিশেষ অনলাইন সম্পাদকে সম্পাদনার জন্য।

তাই আমি Ctrlটিপতে- ধরে-কী ধরে রেখে না ধরে এই দুটি বিকল্পের মধ্যে পার্থক্য করতে চেয়েছিলাম Enter

আপনারা সকলেই এখানে সমস্ত উত্তর থেকে বুঝতে পেরেছেন, এটি সত্যই সম্ভব নয় বলে মনে হয়, তবে এখানে এমন একটি উপায় যা এই আচরণটিকে এমনভাবে নকল করে যা আমার পক্ষে গ্রহণযোগ্য ছিল।

এটি যেভাবে কাজ করে তা এইরকম:

আপনি যদি Ctrlফাইলটি খোলার সময়-কী ধরে রাখেন তবে জাভাস্ক্রিপ্ট কোডটিতে একটি কীডাউন ইভেন্টটি কখনই চলবে না। তবে একটি কি-আপ ইভেন্টে আগুন জ্বলে উঠবে (যখন আপনি অবশেষে- Ctrlকীটি প্রকাশ করবেন )। কোড এটি ধারণ করে।

কোডগুলির সাথে সাথে এর সংঘটিত হওয়ার সাথে সাথে কীভেন্টস (কীআপ এবং কীডাউন উভয়) বন্ধ করে দেওয়া হয়। সুতরাং Ctrlফাইলটি খোলার পরে আপনি যদি -কি টিপেন, কিছুই হবে না।

window.onkeyup = up;
window.onkeydown = down;
function up(e) {
  if (e.key === 'F5') return; // if you want this to work also on reload with F5.

  window.onkeyup = null;
  window.onkeyup = null;
  if (e.key === 'Control') {
    alert('Control key was released. You must have held it down while opening the file, so we will now load the file into the editor.');
  }         
}
function down() {
  window.onkeyup = null;
  window.onkeyup = null;
}

-2
$('#mytextbox').keydown(function (e) {
            if (e.keyCode == 13) {
                if (e.altKey) {
                    alert("alt is pressed");
                }
            }
 });

আপনি Alt + enter টিপলে আপনি সতর্কতাটি দেখতে পাবেন।


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