javascript函数返回的一个奇怪的现象

问题描述

HTML代码:<!Doctype html><html lang="en"><head><meta charset="utf-8" /><title>2.2.1</title><style type="text/css">h2{ text-align: center; color: #666; text-shadow: 2px 2px 2px #eee; margin: 10px;}body{ margin:0px; padding:0px; background-color: #DDD;}#canvas{ width: 600px; height: 600px; position:relative; margin:0px auto; padding:10px; background-color: #999; border: 10px solid #F40; box-shadow: 1px 1px 10px #f60; }</style><script type="text/javascript" src="js/util.js"></script><script type="text/javascript">window.onload=function(){ var can=document.getElementById('canvas'); var mouse1=captureMouse(can); can.onmousedown=function(){ console.log("x:"+mouse1.x); }}</script></head><body><h2>canvas动画</h2><div id="canvas"><canvas width="600" height="600"><i>您的浏览器版本太低,请升级至最新版本</i></canvas></div></body></html>下面是utils.js代码:var captureMouse=function(ele){ var mouse={x:0,y:0}; ele.onmousemove=function(event){ event=event || window.event; if(event.pageX || wvwnt.pageY){ x=event.pageX; y=event.pageY; }else{ x=event.clientX+document.body.scrollLeft+document.documentElement.scrollLeft; y=event.clientY+document.body.scrollTop+document.documentElement.scrollTop; } x-=ele.offsetLeft; y-=ele.offsetTop; mouse.x=x; mouse.y=y; }; return mouse;}问题出现在captureMouse这个函数的返回值上面(captureMouse函数是一个求鼠标相对当前元素坐标的求法函数)。captureMouse在html页面onload后会执行一次,然后为ele元素绑定了鼠标移动事件,同时会将当前鼠标相对于ele元素的坐标返回,html页面接受变量为mouse1。但是大家想一下,接下来的鼠标移动只是响应了鼠标移动的事件,但是html页面并没有在鼠标移动的同时调用captureMouse,所以mouse1这个对象应该是一个不变的值,但是当我点击ele元素时发现坐标是变的,这是为什么呢?鼠标按下输入控制台的是mouse1对象的x的值,求大神指点迷津。 问题补充:请注意,mouse1的值只有在onload时赋予了值,之后的鼠标移动事件没有对mouse1的值做出改变,但为什么点击ele显示的mouse1的值是在变化着的?

解决方案

ele.onmousemove=function(event){ event=event || window.event; 传入这个参数是canvas,你这行代码给它添加了监听鼠标滑过的监听,只要鼠标在canvas上移动,就会触发事件,上面的代码和下面的是等效的。var captureMouse=function(ele){ var mouse={x:0,y:0}; ele.onmousemove=function(event){ event=event || window.event; if(event.pageX || event.pageY){ x=event.pageX; y=event.pageY; }else{ x=event.clientX+document.body.scrollLeft+document.documentElement.scrollLeft; y=event.clientY+document.body.scrollTop+document.documentElement.scrollTop; } x-=ele.offsetLeft; y-=ele.offsetTop; mouse.x=x; mouse.y=y; };ele.onmousedown=function(){ console.log("x:"+mouse.x); } return mouse;}window.onload=function(){ var can=document.getElementById('canvas'); var mouse1=captureMouse(can); }
解决方案二:
问题在 var captureMouse=function(ele){ var mouse={x:0,y:0}; ele.onmousemove=function(event){ ,其中ele.onmousemove=function(event)这里已经给ele添加了function,当然会自动执行这个函数

时间: 2024-11-13 06:48:55

javascript函数返回的一个奇怪的现象的相关文章

IE下一个奇怪的现象

问题描述 首页页面A,这个页面里有一些SQL语句,suchas:select*fromuser..还有一个LINK可以跳到页面B页面B,静态页面A和B都包含一个公共函数页面#includec.asp现在我从A点LINK跳到B,发现页面A的SQL语句select*fromuser..被执行了通过HTTPWATCH监视,我先好象有个HTTPGET的请求发给了A页面,FIREFOX下正常请问各位大侠有知道怎么会事的吗我们是用的ASP开发页面,不是ASP.NET 解决方案 解决方案二:没有碰到过...应

CSS的BUG:IE6中一个奇怪的现象!

css 先声明,是偶的同事xpoint遇到的,不是偶首发的.不说这句话偶肯定挨揍...当ID与Class组合使用的时候在IE6下无法正常显示. CSS代码: #f{ font-size:20px} #f.a{color: red;} #f.b{color: black; font-size:50px} #f.c{color: blue;} #f.d{color: orange;} HTML代码: <div id="f" class="a">a</d

一个奇怪的现象,Float型 保留两位小数,出现问题.....

问题描述 floatf=123000.0;FloattranF=Float.valueOf(newDecimalFormat("#.00").format(f));System.out.println(tranF);如果两位小数是非零的就能打印出两位小数但是如果两位小数全是零就打印出一位小数这是怎么回事啊?有知道的吗?我用的是MyEclipse6.5已经重启过了!还是这样,又遇到过的吗?大家帮帮忙!!分不多大家交流一下.... 解决方案 解决方案二:第二行代码改为StringtranF

JavaScript使用Max函数返回两个数字中较大数的方法_javascript技巧

本文实例讲述了JavaScript使用Max函数返回两个数字中较大数的方法.分享给大家供大家参考.具体如下: JavaScript的Math对象带有一个max函数用于获取两个数字的较大数,下面的代码详细演示了max的用法 <!DOCTYPE html> <html> <body> <p id="demo"> Click the button to return the highest number of 5 and 10. </p&

JavaScript实现函数返回多个值的方法_javascript技巧

本文实例讲述了JavaScript实现函数返回多个值的方法.分享给大家供大家参考.具体分析如下: 这里用字典类型返回多个值 //One var mValues= function(){ var a ="a"; var b = "b"; return [a, b]; }; var values= mValues(); var valOne= values[0]; var valTwo = values[1]; //Two var mValues= function()

JavaScript 函数

JavaScript 函数定义 JavaScript 使用关键字 function 定义函数 函数可以通过声明定义,也可以是一个表达式 函数声明 函数声明的语法 : function sum1(n1,n2){ return n1+n2; }; 函数声明后不会立即执行,会在我们需要的时候调用到 分号是用来分隔可执行JavaScript语句,由于函数声明不是一个可执行语句所以不以分号结束 函数表达式,又叫函数字面量 JavaScript 函数可以通过一个表达式定义 函数表达式可以存储在变量中: va

JavaScript函数使用的基本教程

  这篇文章主要介绍了JavaScript函数使用的基本教程,是JS入门学习中的基础知识,需要的朋友可以参考下 函数是一组可重用的代码,可以在程序的任何地方被调用.这消除了一次又一次地写入相同的代码的需要.这将帮助程序员编写模块化代码.您可以在一些小且易于管理的功能划分大程序. 像任何其他高级编程语言,JavaScript支持所有必要写模块化的代码使用函数的特点. 一定见过这样 alert() 和write()在前面的章节功能.我们一次又一次地使用这些功能,但它们已经写在核心JavaScript

JavaScript函数使用的基本教程_基础知识

 函数是一组可重用的代码,可以在程序的任何地方被调用.这消除了一次又一次地写入相同的代码的需要.这将帮助程序员编写模块化代码.您可以在一些小且易于管理的功能划分大程序. 像任何其他高级编程语言,JavaScript支持所有必要写模块化的代码使用函数的特点. 一定见过这样 alert() 和write()在前面的章节功能.我们一次又一次地使用这些功能,但它们已经写在核心JavaScript只有一次. JavaScript允许我们写自己的函数,以及本节将介绍如何编写自己的函数在JavaScript.

c++-C++函数返回的临时匿名对象的生命周期

问题描述 C++函数返回的临时匿名对象的生命周期 C++函数返回的临时匿名对象什么时候被释放内存 #include using namespace std; class A { public: int x; A(int a){cout<<"creating"<<endl;x=a;} A(const A& a){cout<<"copy"<<endl;x=a.x;} void operator=(A& a)