[JS é muito divertido] Hello Nuggets front-end: O autor listou um bug, vamos ver como corrigi-lo juntos. A propósito, compartilhe habilidades criativas: mude EventListener

Esta é a minha coluna "JS is Fun" que vai te ensinar a fazer algumas coisas interessantes com JS. JS pode ser executado diretamente no navegador e é muito conveniente para mim aprender a usar JS para fazer coisas divertidas. Obrigado pela atenção~ Por favor, curta o artigo! Desejo que todos se tornem um " geek front-end " o mais rápido possível!

fundo

Uma vez, ajudei os Nuggets a encontrar alguns bugs. Hoje, atendemos às expectativas e continuamos a ajudar os Nuggets a encontrar bugs ~ ajudar os Nuggets a localizar o problema. Você precisa de algum conhecimento de JS, e é um pouco de habilidade que as pessoas comuns não conhecem. Venha aprender este criativo habilidade comigo!

Descrição do bug

Desta vez o bug é mais óbvio, na lista de autores .

  • Você clica com o botão esquerdo no nome de um autor e verá que 2 janelas aparecerão!
  • Você mantém pressionada a tecla Ctrl ou Command e clica no nome do autor, você verá que 2 janelas aparecem em segundo plano!
  • Você clica com o botão do meio no nome de um autor e verá que uma janela aparece. normal.
  • Se você não clicar no nome do autor, mas clicar em outro lugar nas informações do autor, será normal e uma janela aparecerá.

Como eu descobri? Quando você abre uma página de detalhes do autor e a fecha uma vez, você descobrirá que a página atual ainda é a página de detalhes do autor, você se sentirá um inferno! É como voltar alguns segundos. Ou tenha este sentimento: Por que esta página de detalhes do autor não pode ser fechada? Tão assustador!

Razões de bugs, venha aprender habilidades criativas!

Etapa 1, verifique o DOM relacionado ao evento de disparo

Aqui o bug aparece no nome do autor, verificamos o nome do autor e descobrimos que é uma tag:

imagem.png

Verifique o componente de detalhes do autor novamente e descubra que é uma tag div:

imagem.png

A suspeita inicial é que quando a tag a é clicada, o evento click da div é acionado ao mesmo tempo. Faz com que 2 janelas se abram.

Etapa 2, verifique o EventListener do elemento Bug

Esse truque é muito criativo, muita gente não usa, acho que você precisa saber:

imagem.png

我们选中某个Html元素后,除了能看它的Style并动态修改style,还可以查看它的事件监听器,看看它绑定了哪些事件。当然,也可以动态修改EventListener。

可以看到,a标签有一个的响应click的EventListener,是冒泡到div.link被捕获触发的~

imagem.png

而根据点击div.link的行为,不难想象它的handleClick(或者叫onClick)是这么写的:

function handleClick(event) {
  window.open('作者详情页'); // 新窗口打开作者详情页
}

第3步,验证想法

我们把div.link这个EventListener删掉!看看Bug有没有解决!

imagem.png

Remove它后,再次点击a标签,果然,只会打开1个窗口了!

Bug解决方案

一个方案

禁止a标签的点击事件冒泡,提前捕获,stopPropagation。在click事件里可以什么都不做,继续使用原生的a标签的行为。

一个更好的方案

追求极致用户体验:一切导航功能,都应该允许用户以各种方式打开。

虽然掘金这里静默要求新窗口打开,但是也建议使用a标签结合targer属性实现路由能力。而不要依赖div的onclick。

掘金目前的实现方法,针对作者信息的div.link,用户不能通过鼠标中键的方式打开。

这样不够追求极致用户体验。因为很多时候我愿意通过鼠标中键来打开新窗口,如果功能不支持,我其实用起来没有很爽。

怎么做呢?

建议掘金把div.link改为a标签,然后对a标签添加这个类似的EventListener:

imagem.png

完整代码和解释在下面这篇文章里,建议前端程序员都阅读一下:[极致用户体验] 你的 Link Button 能让用户选择新页面打开吗?

写在最后

Meu nome é HullQin e desenvolvi de forma independente a "Coleção de Jogos de Tabuleiro Online" . É uma página da web onde você pode facilmente jogar Doudizhu, Gobang, UNO e outros jogos online com seus amigos. Não há cobrança ou propaganda. Também desenvolveu independentemente "Synthetic Big Watermelon Remake" . Se você gostar, pode me seguir~ Quando tiver tempo, compartilharei as técnicas relacionadas à criação de jogos, e as compartilharei nesta coluna: "Ensiná-lo a fazer pequenos jogos" .

Recomenda-se que todos prestem atenção na coluna: experiência extrema do usuário . Eu realmente espero que todas as páginas da web de desenvolvedores front-end possam buscar a melhor experiência do usuário.

Estou participando do "Concurso de Desenvolvimento Criativo" para mais detalhes, veja: O concurso de desenvolvimento criativo do Nuggets está aqui!

Acho que você gosta

Origin juejin.im/post/7121558751001182215
Recomendado
Clasificación