How do I detect hardware keyboard presence with javascript?

后端 未结 5 1808
攒了一身酷
攒了一身酷 2020-12-17 10:30

What is the best cross-browser and cross-platform way to detect hardware keyboard presence with javascript?

相关标签:
5条回答
  • 2020-12-17 11:09

    Could you try the theoretical opposite? Instead of trying to detect keyboard hardware, why not try to detect a touch screen? With the ontouchstart event;

    if ('ontouchstart' in document.documentElement) {
        // show icon
    }
    
    0 讨论(0)
  • 2020-12-17 11:18

    Keyboard in JS is accessible via browser APIs which delegate to OS APIs and it's not possible to tell if there's a physical keyboard. I can cut the cord off of my physical keyboard right now, turn on virtual keyboard, click on the on-screen buttons with my mouse and the browser will still trigger every keyboard event the scripts are listening to. Form browsers's/JS's perspective the virtual keyboard is indistinguishable from a physical one.

    And what does "presence" even mean? If I have a phone with a touch screen and slide-out keyboard do you expect the browser to trigger some kind of "keboardIn"/"keyboardOut" event? Same with cable plug-in/out? :)

    If your app absolutely requires a physical keyboard just inform/ask the user.

    Edit - after clarification by OP:

    You know the facebook chat? You send messages simply by pressing "Enter", I have to show users that do not have a keyboard button to replace the "Enter" key.

    So just make a form with text input and listen to the input/form events. Most (every?) soft keyboards have some kind of "Done", "Ready" or similar button. You don't need to know if the "keyCode" is equal to "13", but detect that the user has an intent to submit what he has typed. Or, as the last resort, detect f the device i touch-enabled and display the button then. ( if('ontouchstart' in document.documentElement)/* show touch sbmit button */ )

    0 讨论(0)
  • 2020-12-17 11:19

    This may be an old question, but a few months ago, I was looking for a solution to this myself. I was building a messaging system which should send the message when someone hits Return on their physical keyboard, but inserts a newline when someone hits Return on a virtual keyboard. The way I solved it was by counting the time between keydown and keyup events and getting the average when Return was hit.

    I finally got around to documenting it on my blog here.

    0 讨论(0)
  • 2020-12-17 11:21

    Use keyboard event to detect if the user have keyboard or not (he/she may press it). Save it in localStorage and the browser will remember it for the next time.

    var app = this;
    app.hasKeyboard = false;
    this.keyboardPress = function() {
        app.hasKeyboard = true;
        $(window).unbind("keyup", app.keyboardPress);
        localStorage.hasKeyboard = true;
        console.log("has keyboard!")
    }
    $(window).on("keyup", app.keyboardPress)
    if(localStorage.hasKeyboard) {
        app.hasKeyboard = true;
        $(window).unbind("keyup", app.keyboardPress);
        console.log("has keyboard from localStorage")
    }
    
    0 讨论(0)
  • 2020-12-17 11:24
    if (confirm('Do you have hardware keyboard?')) {
    
    } else {
    
    }
    

    Edit according to description in comments under question:

    What about support 'Enter' everytime and add 'Send' icon only for touch screens (What's the best way to detect a 'touch screen' device using JavaScript?) and as a 'hover' pseudoclass for mouse?

    0 讨论(0)
提交回复
热议问题