GVKun编程网logo

使 keydown NSEvent 在 Swift 中运行一次

1

针对使keydownNSEvent在Swift中运行一次这个问题,本篇文章进行了详细的解答,同时本文还将给你拓展.NET中的KeyDown和KeyPress有什么区别?、@HostListenerke

针对使 keydown NSEvent 在 Swift 中运行一次这个问题,本篇文章进行了详细的解答,同时本文还将给你拓展.NET 中的 KeyDown 和 KeyPress 有什么区别?、@HostListener keydown 事件不会在 Ionic angular 的整个页面上触发、ajax 请求中不允许的方法(keydown 事件仅在调试时激活)、angularJS文本框根据输入字符(文本框值)进行查询ng-keydown ng-keyup等相关知识,希望可以帮助到你。

本文目录一览:

使 keydown NSEvent 在 Swift 中运行一次

使 keydown NSEvent 在 Swift 中运行一次

如何解决使 keydown NSEvent 在 Swift 中运行一次

NSEvent keydown 代码在按下键时重复运行。如何确保事件只运行一次然后停止侦听直到发生 key up 事件?

  1. override func viewDidLoad() {
  2. super.viewDidLoad()
  3. NSEvent.addLocalMonitorForEvents(matching: .keyDown,handler: doSomething(event:))
  4. }
  5. func doSomething(event: NSEvent) -> NSEvent{
  6. // 36 is key code for ENTER key
  7. if event.keyCode == 36{
  8. print("Hello World!")
  9. }
  10. return event
  11. }

解决方法

您可以使用 isARepeat 属性简单地检查 NSEvent 是否重复:

  1. func doSomething(event: NSEvent) -> NSEvent {
  2. if event.keyCode == 36,!event.isARepeat {
  3. print("Hello World!")
  4. }
  5. return event
  6. }

如果您只是想摆脱按键声音,您需要将返回类型更改为可选并返回 nil:

  1. func doSomething(event: NSEvent) -> NSEvent? {
  2. guard !event.isARepeat else {
  3. // this will suppress the key sound if you return nil and not propagate the key down event
  4. return nil
  5. }
  6. if event.keyCode == 36 {
  7. print("Hello World!")
  8. // if you want to suppress the key sound when is not a repeat just return nil here as well
  9. return nil
  10. }
  11. return event
  12. }

.NET 中的 KeyDown 和 KeyPress 有什么区别?

.NET 中的 KeyDown 和 KeyPress 有什么区别?

KeyDown.NET 中的和KeyPress事件有什么区别?

答案1

小编典典

显然对这个 有很多 误解!

KeyDown和之间唯一实际的区别KeyPress是它KeyPress传递由按键产生的字符,并且仅在有一个字符时才被调用。

换句话说,如果您按下A键盘,您将获得以下事件序列:

  1. KeyDown:KeyCode=Keys.A,KeyData=Keys.A,修饰符=Keys.None
  2. KeyPress:KeyChar=’a’
  3. KeyUp:KeyCode=Keys.A

但是如果你按Shift+ A,你会得到:

  1. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modifiers=Keys.Shift
  2. KeyDown:KeyCode=Keys.A,KeyData=Keys.A | Keys.Shift,修饰符=Keys.Shift
  3. KeyPress:KeyChar=’A’
  4. KeyUp:KeyCode=Keys.A
  5. KeyUp:KeyCode=Keys.ShiftKey

如果你按住键一会儿,你会得到类似的东西:

  1. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modifiers=Keys.Shift
  2. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modifiers=Keys.Shift
  3. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modifiers=Keys.Shift
  4. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modifiers=Keys.Shift
  5. KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modifiers=Keys.Shift
  6. KeyDown:KeyCode=Keys.A,KeyData=Keys.A | Keys.Shift,修饰符=Keys.Shift
  7. KeyPress:KeyChar=’A’
  8. KeyDown:KeyCode=Keys.A,KeyData=Keys.A | Keys.Shift,修饰符=Keys.Shift
  9. KeyPress:KeyChar=’A’
  10. KeyDown:KeyCode=Keys.A,KeyData=Keys.A | Keys.Shift,修饰符=Keys.Shift
  11. KeyPress:KeyChar=’A’
  12. KeyDown:KeyCode=Keys.A,KeyData=Keys.A | Keys.Shift,修饰符=Keys.Shift
  13. KeyPress:KeyChar=’A’
  14. KeyDown:KeyCode=Keys.A,KeyData=Keys.A | Keys.Shift,修饰符=Keys.Shift
  15. KeyPress:KeyChar=’A’
  16. KeyUp:KeyCode=Keys.A
  17. KeyUp:KeyCode=Keys.ShiftKey

请注意,正如许多其他答案所说,KeyPress发生 在 and 之间 KeyDownKeyUp不是
之后,当没有生成字符时不会调用它,并且在按住键时会重复,这也与许多其他答案相反.KeyUp``KeyPress``KeyDown

直接导致调用的键示例KeyPress

  • Shift, Ctrl, Alt
  • F1 through F12
  • 方向键

确实会 导致调用的键示例KeyPress

  • A通过Z,0通过9
  • Spacebar
  • Tab(KeyChar=’\t’, ASCII 9)
  • Enter(KeyChar=’\r’, ASCII 13)
  • Esc(KeyChar=’\x1b’, ASCII 27)
  • Backspace(KeyChar=’\b’, ASCII 8)

对于好奇的人,KeyDown大致与WM_KEYDOWN、和相关。 可以 调用少于键重复的次数,但它发送一个重复计数,IIRC,WinForms
使用该计数每次重复生成一个 KeyDown。KeyPress``WM_CHAR``KeyUp``WM_KEYUP``WM_KEYDOWN __

@HostListener keydown 事件不会在 Ionic angular 的整个页面上触发

@HostListener keydown 事件不会在 Ionic angular 的整个页面上触发

如何解决@HostListener keydown 事件不会在 Ionic angular 的整个页面上触发?

我想为我的整个应用程序捕获 keydown 事件(特别是使用箭头键导航)

这适用于任何子组件,但菜单、根或标题级别的内容不起作用。所以用户必须点击进入组件,然后按下一个键。

我想从我的整个应用程序中捕获按键

将以下内容添加到我的主 app.component 中根本不会触发

  @HostListener(''keydown'',[''$event''])
  handleKeyboardEventkeydown(event: KeyboardEvent) { 
    console.log(''keydown AppComponent:'',event.key) // never logs
  }

在我的 home.component(路由器指向的地方)和我的实际管理内部页面的子组件中的代码相同。只有在最后一个事件才会触发,但不会在应用程序或家庭组件中触发

我的应用组件 html 是

<ion-app>
  <ion-menu contentId="main-content" type="overlay">
    <ion-header>
      <ion-toolbar>
        <ion-title>Menu</ion-title>
      </ion-toolbar>
    </ion-header>
    <ion-content>

      <ion-list>
        <ion-menu-toggle auto-hide="false" *ngFor="let p of appPages">
          <ion-item [routerDirection]="''root''" [routerLink]="[p.url]">
            <ion-icon slot="start" [name]="p.icon"></ion-icon>
            <ion-label> {{ p.title }} </ion-label>
          </ion-item>
        </ion-menu-toggle>
      </ion-list>
    </ion-content>


  </ion-menu>
  <ion-router-outlet id="main-content"></ion-router-outlet>
</ion-app>

如何在 app.component 上获取我的 HostListener 以捕获按键。或者我可以如何/在其他地方完成这项工作?

解决方法

将您的主机侦听器代码更改为以下内容:

@HostListener( ''window:keydown'',[ ''$event'' ] )
handleKeyboardEventkeydown(event: KeyboardEvent) { 
    // ...
}

注意 window:keydown 而不是 keydown

ajax 请求中不允许的方法(keydown 事件仅在调试时激活)

ajax 请求中不允许的方法(keydown 事件仅在调试时激活)

如何解决ajax 请求中不允许的方法(keydown 事件仅在调试时激活)?

我有一个关于 AJAX 请求的非常奇怪的问题。

服务器app.py

#### app.py

from flask import Flask,request,render_template

app = Flask(__name__)
app.debug = True


@app.route("/myajax",methods=[''GET'',''POST''])
def mypostajaxreq():
    
    print(request.form)
    if request.method == "POST":
        name = request.form["name"]
        return " Hello " + name
    else:
        return "Just Hello"                
            

@app.route("/")
def index():
    
    return render_template("indexlistener.html")


if __name__ == "__main__":
    app.run()

indexlistener.html

<!DOCTYPE html>
<html>
  <head>
    <title>Practice AJAX</title>
    <script type="text/javascript" src = "/static/js/myajaxrequestlistener.js"></script>

  </head>
  <body>
    <form method="post">
      <label>Name:<input type="text" id="name" value="" /></label>
      <button type="button" id="btn-post">Click</button>


      <div id="result"></div>
    </form>
  </body>
</html>

myajaxrequestlistener.js 文件

function do_ajax ()
{
    var req = new XMLHttpRequest();
    var result = document.getElementById(''result'');
    req.onreadystatechange = function()
    {
        if(this.readyState == 4 && this.status == 200) {
            result.innerHTML = this.responseText;
        }
    }

    req.open(''POST'',''/myajax'',true);
    req.setRequestHeader(''content-type'',''application/x-www-form-urlencoded;charset=UTF-8'');
    req.send("name=" + document.getElementById(''name'').value);
};



document.addEventListener(''DOMContentLoaded'',function()
{
    document.getElementById("btn-post").addEventListener("click",function()
    {
        do_ajax();

    })
})




document.addEventListener(''DOMContentLoaded'',function()
{
    document.addEventListener("keydown",function(event)
    {
        if(event.key === "Enter")
        {
            do_ajax();
        }

    })
})

当我单击按钮时,这一切正常,正如预期的那样,它会在 python 代码中触发 mypostajaxreq,但是当我按下 Enter 时,它返回 Error 405. Method not allowed。我不清楚为什么会发生这种情况,我检查了调试器,并将侦听器事件输入到 keydown,事实上,更奇怪的是,代码在我使用调试器时有效,但在我按下时却不起作用Enter 直接。我怀疑这是由于听众造成的,但我不明白为什么它不应该起作用。此外,我不明白我收到的错误 (405) 的逻辑:据我所知,只有当服务器端的路由不接受调用请求方法时才会发生这种情况,但在这里我接受两者,此外我只从网页发出 POST 请求。我是网络编程新手,提前致谢。

解决方法

在表单中唯一的文本框中按 Enter 将提交表单,向 / 发送一个 POST,这是该路由不允许的方法。
您可以将提交处理程序附加到表单而不是 keydown
此外,您不必使用多个 DOMContentLoaded 事件处理程序。

document.addEventListener(''DOMContentLoaded'',function()
{
    document.querySelector(''form'').addEventListener("submit",function(event)
    {
        event.preventDefault();
        do_ajax();
    });
    document.getElementById("btn-post").addEventListener("click",do_ajax);
});

angularJS文本框根据输入字符(文本框值)进行查询ng-keydown ng-keyup

angularJS文本框根据输入字符(文本框值)进行查询ng-keydown ng-keyup

html:

<input 
	          type="text" 
	          ng-model="employee.account" 
	          ng-keydown
            />

js:
/*directives*/
angular.module('activitiModeler').directive('ngKeydown',function() {
    return {
        restrict: 'A',link: function(scope,elem,attrs) {
             	  //var functionToCall = scope.$eval(attrs.ngKeydown);
             elem.on('keydown',function(e){
            	 alert(e+','+e.which);
             });
        }
    };
});


/*directives*/
angular.module('activitiModeler').directive('ngKeydown',attrs) {
             	  //var functionToCall = scope.$eval(attrs.ngKeydown);
             elem.on('keyup',function(e){
            	 alert(scope.employee.account);
             });
        }
    };
});

关于使 keydown NSEvent 在 Swift 中运行一次的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.NET 中的 KeyDown 和 KeyPress 有什么区别?、@HostListener keydown 事件不会在 Ionic angular 的整个页面上触发、ajax 请求中不允许的方法(keydown 事件仅在调试时激活)、angularJS文本框根据输入字符(文本框值)进行查询ng-keydown ng-keyup的相关知识,请在本站寻找。

本文标签: