在angular2中,输入键触发页面上的任何点击事件?

时间:2016-06-21 06:25:23

标签: javascript jquery html events angular

在下面的代码中,单击span元素时应调用removeSelectedCountry(),并且当div上存在keydown事件时应调用handleKeyDown($event)

@Component({
    selector: "wng-country-picker",
    template: `
    <ul class="CountryPicker-selected" *ngIf="selectedCountries.length > 0">
    <li *ngFor="let country of selectedCountries">
        <span class="Pill Pill--primary" (click)="removeSelectedCountry(country)">
        {{ country.name }}
        </span>
    </li>
    </ul> 
    <div (keydown)="handleKeyDown($event)" class="CountryPicker-input"></div>
`,
providers: [CUSTOM_VALUE_ACCESSOR]
})

但每次按下回车键时都会调用removeSelectedCountry()

要使代码正常工作,我必须将click事件更改为mousedown事件。 现在工作正常。

任何人都可以解释为什么输入键会触发点击事件?

@Component({
    selector: "wng-country-picker",
    template: `
    <ul class="CountryPicker-selected" *ngIf="selectedCountries.length > 0">
    <li *ngFor="let country of selectedCountries">
        <span class="Pill Pill--primary" (mousedown)="removeSelectedCountry(country)">
        {{ country.name }}
        </span>
    </li>
    </ul> 
    <div (keydown)="handleKeyDown($event)" class="CountryPicker-input"></div>
`,
providers: [CUSTOM_VALUE_ACCESSOR]
})

添加class snipppet

export class CountryPickerComponent {

private selectedCountries: CountrySummary[] = new Array();

private removeSelectedCountry(country: CountrySummary){
    // check if the country exists and remove from selectedCountries
    if (this.selectedCountries.filter(ctry => ctry.code === country.code).length > 0)
    {
        var index = this.selectedCountries.indexOf(country);
        this.selectedCountries.splice(index, 1);
        this.selectedCountryCodes.splice(index, 1);
    }
}

private handleKeyDown(event: any)
{
    if (event.keyCode == 13)
    {
       // action
    }
    else if (event.keyCode == 40)
    {
        // action
    }  
    else if (event.keyCode == 38)
    {
        // action
    }    
}

7 个答案:

答案 0 :(得分:125)

对于ENTER键,为什么不使用(keyup.enter)

@Component({
  selector: 'key-up3',
  template: `
    <input #box (keyup.enter)="values=box.value">
    <p>{{values}}</p>
  `
})
export class KeyUpComponent_v3 {
  values = '';
}

答案 1 :(得分:31)

使用(keyup.enter)

Angular可以为我们过滤关键事件。 Angular具有键盘事件的特殊语法。我们可以通过绑定到Angular的keyup.enter伪事件来监听Enter键。

答案 2 :(得分:27)

这是正确的解决方案! 由于按钮没有定义的属性类型,因此angular可能会尝试将keyup事件作为提交请求发出,并触发按钮上的click事件。

<button type="button" ...></button>

非常感谢DeborahK!

Angular2 - Enter Key executes first (click) function present on the form

答案 3 :(得分:11)

@Component({
  selector: 'key-up3',
  template: `
    <input #box (keyup.enter)="doSomething($event)">
    <p>{{values}}</p>
  `
})
export class KeyUpComponent_v3 {
  doSomething(e) {
    alert(e);
  }
}

这对我有用!

答案 4 :(得分:2)

<form (keydown)="someMethod($event)">
     <input type="text">
</form>
someMethod(event:any){
   if(event.keyCode == 13){
      alert('Entered Click Event!');
   }else{
   }
}

答案 5 :(得分:0)

对于角度6,有一种新的处理方法。 在您的输入标签上添加

(keyup.enter)="keyUpFunction($event)"

keyUpFunction($event)是您的功能。

答案 6 :(得分:0)

我个人认为对我有用的是:

(mousedown)="callEvent()" (keyup.enter)="$event.preventDefault()

keyup.enter阻止该事件在键盘输入时触发,但对于键盘输入仍然会发生,这对我有用。