2015-08-02 4 views
10

Im пытается реализовать событие hover, но onMouseLeave не всегда срабатывает при уходе с элементом, особенно при быстром перемещении курсора по элементам. Я пробовал Chrome, Firefox и Internet Explorer, но в каждом браузере появилась такая же проблема.Реагировать событие onMouseLeave не запускается при быстром перемещении курсора

Мой код:

import React from 'react'; 
import Autolinker from 'autolinker'; 
import DateTime from './DateTime.jsx' 
class Comment extends React.Component{ 

    constructor(props){ 
     super(props); 
     this.handleOnMouseOver = this.handleOnMouseOver.bind(this); 
     this.handleOnMouseOut = this.handleOnMouseOut.bind(this); 
     this.state = { 
      hovering: false 
     }; 
    } 

    render(){ 
     return <li className="media comment" onMouseEnter={this.handleOnMouseOver} onMouseLeave={this.handleOnMouseOut}> 
      <div className="image"> 
       <img src={this.props.activity.user.avatar.small_url} width="42" height="42" /> 
      </div> 
      <div className="body"> 
       {this.state.hovering ? null : <time className="pull-right"><DateTime timeInMiliseconds={this.props.activity.published_at} byDay={true}/></time>} 
       <p> 
        <strong> 
         <span>{this.props.activity.user.full_name}</span> 
         {this.state.hovering ? <span className="edit-comment">Edit</span> : null} 

        </strong> 
       </p>  
      </div> 
     </li>; 
    } 


    handleOnMouseOver(event){ 
     event.preventDefault(); 
     this.setState({hovering:true}); 
    } 

    handleOnMouseOut(event){ 
     event.preventDefault(); 
     this.setState({hovering:false}); 
    } 

    newlines(text) { 
     if (text) 
      return text.replace(/\n/g, '<br />'); 

    } 



} 

export default Comment; 
+0

Эй, как вы определения OnMouseLeave не срабатывает? Вы пытались добавить инструкции console.log? Мне интересно, если вместо этого у вас плохой порядок для onMouseOver/onMouseOut, потому что настройка состояний не является синхронным действием. Я создал простой компонент реакции, и я не мог легко воспроизвести. – noveyak

+0

Случается, что при выходе из элемента функция onMouseLeave не вызывается .. Да, я попытался с протоколированием, и функция не вызывается .. тогда как мне реализовать событие hover? – zazmaister

+0

Вы можете попробовать onMouseOver/onMouseOut, чтобы убедиться, что он работает лучше для вас, так как я думаю, что эти события лучше поддерживаются, хотя поведение этого немного отличается, поэтому может оказаться непригодным для вашего приложения. – noveyak

ответ

-3

У меня была аналогичная проблема, я пробовал разные подходы, и я остановился на этом обходной путь (частично опираясь на JQuery):

  • Зов $(event.currentTarget).one("mouseleave", this.onMouseLeaveHandler.bind(this)); когда OnMouseEnter спусков.
  • Не устанавливайте обработчик события onMouseLeave.

Вот пример:

import React from 'react'; 
import $ from 'jquery'; 
import Autolinker from 'autolinker'; 
import DateTime from './DateTime.jsx' 
class Comment extends React.Component{ 

    constructor(props){ 
     super(props); 
     this.state = { 
      hovering: false 
     }; 
    } 

    render(){ 
     return <li className="media comment" onMouseEnter={this.handleOnMouseOver.bind(this)}> 
      <div className="image"> 
       <img src={this.props.activity.user.avatar.small_url} width="42" height="42" /> 
      </div> 
      <div className="body"> 
       {this.state.hovering ? null : <time className="pull-right"><DateTime timeInMiliseconds={this.props.activity.published_at} byDay={true}/></time>} 
       <p> 
        <strong> 
         <span>{this.props.activity.user.full_name}</span> 
         {this.state.hovering ? <span className="edit-comment">Edit</span> : null} 

        </strong> 
       </p>  
      </div> 
     </li>; 
    } 


    handleOnMouseOver(event){ 
     event.preventDefault(); 
     this.setState({hovering:true}); 
     $(event.currentTarget).one("mouseleave", this.onMouseLeaveHandler.bind(this)); 
    } 

    handleOnMouseOut(event){ 
     event.preventDefault(); 
     this.setState({hovering:false}); 
    } 

    newlines(text) { 
     if (text) 
      return text.replace(/\n/g, '<br />'); 

    } 



} 

export default Comment; 

Или проверить этот пример на jsfiddle: http://jsfiddle.net/qtbr5cg6/1/

Смежные вопросы