Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

getting mouse coordinates in React and jQuery

I am trying to get the relative coordinates of the mouse in an element in React using jQuery.

My code doesn't seem to be working and there are no console errors.

code:

index.html

<html lang="en">   <head>     <meta charset="utf-8">     <meta name="viewport" content="width=device-width, initial-scale=1">     <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">     <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">     <link rel="stylesheet" type="text/css" href="stylesheets.css" >     <script src="https://code.jquery.com/jquery-3.1.0.js"></script>     <script src="ja.js" type="text/javascript"></script>      <title>Where's Waldo</title>   </head>      <div id="root"></div>    </body> </html> 

ja.js (jQuery function)

jQuery(function($) {  var x,y;  $("#waldo1").mousemove(function(event) {      var offset = $(this).offset();      x = event.pageX- offset.left;      y = event.pageY- offset.top;      $("#coords").html("(X: "+x+", Y: "+y+")");  }); }); 

component

import React, { Component } from 'react' import Timer from './timer'  class Level1 extends Component {      render () {       return (       <div>       <div id="gameBoard">         <img id="waldo1" src={require('../images/waldo1(1).jpg')} alt="waldo"/>       </div>       <h2 id="coords"></h2>       <Timer start={Date.now()}/>       </div>         ) // return       } // render     } //component      export default Level1 

I hear jQuery doen't play nice with react. Is my syntax correct or is there a better way entirely?

Thank you.

like image 836
Quesofat Avatar asked Feb 11 '17 23:02

Quesofat


People also ask

How do I get the current cursor position in React JS?

You can get full control of cursor position by event. target. selectionStart and event. target.

Is it OK to use jQuery in React?

The main limitation of using jQuery in React is that jQuery manually updates the DOM. On the other hand, React has its system for making changes to the DOM. It internally determines when a React app or component should re-render. It also figures out which parts of the UI need to be updated.

Where is mouse position on screen JS?

Use event. clientY to get the mouse position relative to the browser viewport (Compatibility table).


2 Answers

As others have mentioned, the issue is that react has not rendered your component to the DOM when jQuery tries to attach the event listener.

You don't need jQuery to do this at all, a better approach is to use the React events:

class Application extends React.Component {   constructor(props) {     super(props);      this.state = { x: 0, y: 0 };   }    _onMouseMove(e) {     this.setState({ x: e.screenX, y: e.screenY });   }    render() {     const { x, y } = this.state;     return <div onMouseMove={this._onMouseMove.bind(this)}>       <h1>Mouse coordinates: { x } { y }</h1>     </div>;   } } 

Example pen: https://codepen.io/CarlosEME/pen/XWWpVMp

like image 75
Carlos Martinez Avatar answered Oct 05 '22 23:10

Carlos Martinez


You can try this:

import React, { Component } from "react";  class ClassCursorPosition extends Component {   constructor(props) {     super(props);     this.state = {       x: 0,       y: 0     };   }    logMousePosition = e => {     this.setState({       x: e.clientX,       y: e.clientY     });   };   componentDidMount() {     window.addEventListener("mousemove", this.logMousePosition);   }   render() {     return (       <div>         X- {this.state.x} Y - {this.state.y}       </div>     );   } } 

Actually there are three things you can consider, here I mention clientX, clientY you can search for pageX, pageY and secrrenX, screenY as well.

pageX, pageY => depends on mouse position according to page.( scrollable page)

screenX, screenY => depends on mouse position according to screen ( height and width of different screens)

like image 25
subhashis Avatar answered Oct 05 '22 22:10

subhashis