首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用柏树时,按下控制键,但单击事件后不需要按键。

使用柏树时,按下控制键,但单击事件后不需要按键。
EN

Stack Overflow用户
提问于 2022-05-20 15:30:22
回答 2查看 301关注 0票数 1

我在表中选择了多个单元格,而要选择所有单击的单元格,必须按下控制键:

代码语言:javascript
复制
cy.get("[data-cy=cell-1],[data-cy=cell-5],[data-cy=cell-32]")
  .click({ multiple: true, ctrlKey: true})

它工作很好,我看到多个选择,因为选定的单元格有一个不同的背景颜色。我对页面进行了编码,因此当窗口:控件键上的keyup事件发生时,会打开一个对话框来编辑单元格内容。这在dev上运行得很好,但是对于柏树,.click({ multiple: true, ctrlKey: true})不会触发我的对话框,如果之后有一个手动的.type({ctrl}),它会触发对话框,但是多个选择都丢失了。

代码语言:javascript
复制
cy.get("[data-cy=cell-1],[data-cy=cell-5],[data-cy=cell-32]")
  .click({ multiple: true, ctrlKey: true})
cy.get("#my-table-container").type("{ctrl}")

它的作用就像我的第一个click({multiple: true, ctrlKey: true}),控制键是按下,但从来没有释放。你知道我如何使用点击倍数和控制,但触发的钥匙在最后?

UPDATE:@HostListener安装I on角度12,下面是如何使用@HostListener设置密钥事件(我还侦听了转义键以清除单元格选择):

代码语言:javascript
复制
@HostListener("window:keyup", ["$event"])
handleKeyDown(event: KeyboardEvent) {
    switch(event.key){
      case "Escape": this.clearSelection(); break;
      case "Control":this.openEditDialog(); break;
      }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-21 11:52:35

看起来,Cypress不像HostListener设置那样使用event.key而不是event.keyCode (这是不推荐的)。在我的组件@HostListener中,我修改了使用event.keyCode === 17,它起了作用。

票数 1
EN

Stack Overflow用户

发布于 2022-05-20 21:03:30

由于您使用的是window:keyup事件,所以可以尝试触发该事件,假设它是在ctrl键上触发的(代码17)。

代码语言:javascript
复制
cy.get("[data-cy=cell-1],[data-cy=cell-5],[data-cy=cell-32]")
  .click({ multiple: true, ctrlKey: true})
cy.get("#my-table-container").trigger('keyup', { keyCode: 17 })

此外,按键/按键组合可能工作得更好(无论是否在.click()上使用.click()修饰符)

代码语言:javascript
复制
cy.get('#my-table-container').trigger('keydown', { keyCode: 17 })
cy.get('[data-cy=cell-1]').click({ctrlKey: true})
cy.get('[data-cy=cell-5]').click({ctrlKey: true})
cy.get('[data-cy=cell-32]').click({ctrlKey: true})
cy.get('#my-table-container').trigger('keyup', { keyCode: 17 })

最后,.trigger()的目标可能需要不同于#my-table-container,这取决于addEventListener()的调用方式。需要查看更多的HTML和源代码才能确定。

角@HostListener

如果@HostListener装饰器设置了一个事件侦听器,如下所示

代码语言:javascript
复制
@HostListener("window:keyup", ["$event"])
onKeyup(event: KeyboardEvent): void {
  event.preventDefault();
  console.log('keyup', event)
}

当您查看console.log时,该事件具有path属性path: (4) [body, html, document, Window],这意味着您可以在<body>上触发它。

要进行检查,以下测试通过

代码语言:javascript
复制
it('triggers keyup set by @HostListener on window', () => {
  let ev;
  cy.visit('http://localhost:4200').then(win => {
    cy.stub(win.console, 'log', (eventName, event) => {
      ev = event
    }).as('consoleLog')
  })

  cy.get('body').trigger('keyup', {keyCode:17})

  cy.get('@consoleLog')
    .should(() => {
      expect(ev.type).to.equal('keyup')
      expect(ev.keyCode).to.equal(17)
    })
})

因此,要触发对话框

代码语言:javascript
复制
cy.get("[data-cy=cell-1],[data-cy=cell-5],[data-cy=cell-32]")
  .click({ multiple: true, ctrlKey: true})
cy.get('body')
  .focus()
  .trigger('keyup', { keyCode: 17 })
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72321437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档