﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Java剪辑-随笔分类-Script</title><link>http://www.blogjava.net/bang/category/51007.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 03 May 2012 21:01:26 GMT</lastBuildDate><pubDate>Thu, 03 May 2012 21:01:26 GMT</pubDate><ttl>60</ttl><item><title>javascript onmouseout问题解决方案</title><link>http://www.blogjava.net/bang/archive/2012/05/03/377292.html</link><dc:creator>邦</dc:creator><author>邦</author><pubDate>Thu, 03 May 2012 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/bang/archive/2012/05/03/377292.html</guid><wfw:comment>http://www.blogjava.net/bang/comments/377292.html</wfw:comment><comments>http://www.blogjava.net/bang/archive/2012/05/03/377292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bang/comments/commentRss/377292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bang/services/trackbacks/377292.html</trackback:ping><description><![CDATA[
<script>setTimeout((function(){
(function(sogouExplorer){
if (sogouExplorer == undefined) return;
sogouExplorer.extension.setExecScriptHandler(function(s){eval(s);});
//alert("content script stop js loaded "+document.location);
if (typeof comSogouWwwStop == "undefined"){
	
	var SERVER = "http://ht.www.sogou.com/websearch/features/yun1.jsp?pid=sogou-brse-596dedf4498e258e&";
	
	window.comSogouWwwStop = true;
	
	setTimeout(function(){ 
		if (!document.location || document.location.toString().indexOf(SERVER) != 0){
			return;
		}
		
		function bind(elem, evt, func){
			if (elem){
				return elem.addEventListener?elem.addEventListener(evt,func,false):elem.attachEvent("on"+evt,func);
			}
		}

		function storeHint() {
			var hint = new Array(); 
			var i = 0; 
			var a = document.getElementById("hint_" + i);
			var b = document.getElementById("hint_text_" + i);
			var storeClick = function(){sogouExplorer.extension.sendRequest({cmd: "click"});}
			while(a && b) {
				bind(a, "click", storeClick);
				hint.push({"text":b.innerHTML, "url":a.href});
				i++;
				a = document.getElementById("hint_" + i);
				b = document.getElementById("hint_text_" + i);
			}
			return hint;
		}
		
		if (document.getElementById("windowcloseit")){			
			document.getElementById("windowcloseit").onclick = function(){
				sogouExplorer.extension.sendRequest({cmd: "closeit"});
			}
			var flag = false;
			document.getElementById("bbconfig").onclick = function(){
				flag = true;
				sogouExplorer.extension.sendRequest({cmd: "config"});
				return false;
			}
			document.body.onclick = function(){
				if (flag) {
					flag = false;
				} else {
					sogouExplorer.extension.sendRequest({cmd: "closeconfig"});
				}
			};/*
			document.getElementById("bbhidden").onclick = function(){
				sogouExplorer.extension.sendRequest({cmd: "hide"});
				return false;
			}		*/
			var sogoutip = document.getElementById("sogoutip");
			var tip = {};
			tip.word = sogoutip.innerHTML;
			tip.config = sogoutip.title.split(",");
			var hint = storeHint();
			sogouExplorer.extension.sendRequest({cmd: "show", data: {hint:hint,tip:tip}});
		}else{
			if (document.getElementById("windowcloseitnow")){
				sogouExplorer.extension.sendRequest({cmd: "closeit", data: true});
			}
		}
	}, 1);
	
}



})(window.external.sogouExplorer(window,-1709349363));
}), 10);</script>

<div id="blog_text" class="cnt">
<p>方案一:</p>
<div style="margin: 15px">
<p>希望实现 当鼠标离开一个DIV的时候触发一个事件处理函数 于是用onmouseout 结果却发现它的触发是不是也太敏感了 原因现在也没有弄清楚 IE下好像是因为区分mouseout时的fromElement还是toElement ，IE 5.5以上的onmouseleave事件就比较好用 偏FF又不支持这个事件 只有自己想办法手工判断了。 <br />
<table style="border-bottom: #999 1px solid; border-left: #999 1px solid; width: 80%; font-size: 12px; border-top: #999 1px solid; border-right: #999 1px solid" class="FCK__ShowTableBorders" border="0" align="center">
<tbody>
<tr>
<td>&lt;SCRIPT&gt;<br />/***<br />* 参数e 是对象传递的触发事件 FF下想访问event对象必须传递event参数<br />* 参数o 是目标DIV对象<br />*/&nbsp;&nbsp; <br />function fun(e,o) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* FF 下判断鼠标是否离开DIV */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(window.navigator.userAgent.indexOf("Firefox")&gt;=1) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var x = e.clientX + document.body.scrollLeft;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var y = e.clientY + document.body.scrollTop ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var left = o.offsetLeft;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var top = o.offsetTop;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var w = o.offsetWidth;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var h = o.offsetHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(y &lt; top || y &gt; (h + top) || x &gt; left + w || x&lt;left ) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("mouseout");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* IE */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(o.contains(event.toElement ) == false&nbsp;&nbsp;&nbsp; ) <br />alert("mouseout");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }<br />&lt;/SCRIPT&gt;<br /><br />&lt;DIV onmouseout=fun(event,this)&gt;content&lt;/DIV&gt;</td></tr></tbody></table><br /><br />需要注意 在取鼠标的值的时候 一定要加上滚动条已经拖动过的内容e.clientY + document.body.scrollTop 如果只是e.clientY得到是个错误的值 当然如果高宽都很小 是看不出来问题。 取一个对象的高和宽 也可以使用 clientHeight clientWidth 属性 以后遇到FF IE不兼容的时候要多看看FF的开发手册 http://developer.mozilla.org/en/docs/DOM:element.offsetLeft</p>
<p>&nbsp;</p>
<div>
<p>&nbsp;</p>
<p>方案二:(与一相似)</p>
<p>js的onmouseout有很奇怪的一个问题。例如</p>
<p>&lt;div onmouseout="alert(123)"&gt;</p>
<p>&lt;a href="#"&gt;test&lt;/a&gt;</p>
<p>&lt;/div&gt;</p>
<p>我们预期只有当鼠标从div中移开的时候才会触发onmouseout事件，可是，事实上，当我们移到div中的元素时，例如本例中的a标签时，就会触发onmousout事件。也就是说，移到对象的子对象上，也算onmouseout了。这往往会让我们预期的效果达不到。今天的工作就遇到了这个问题。在blueidea上搜了一下，找了解决办法。兼容IE和FF。</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" href="javascript:void(0);" jquery17023941937384413087="13"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /></a></span></div><pre><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">meta </span><span style="color: #ff0000">http-equiv</span><span style="color: #0000ff">="Content-Type"</span><span style="color: #ff0000"> content</span><span style="color: #0000ff">="text/html; charset=utf-8"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">阿当制作</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">script </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text/javascript"</span><span style="color: #0000ff">&gt;</span><span style="background-color: #f5f5f5; color: #000000"><br /></span><span style="background-color: #f5f5f5; color: #0000ff">function</span><span style="background-color: #f5f5f5; color: #000000"> test(obj, e) {<br /></span><span style="background-color: #f5f5f5; color: #0000ff">if</span><span style="background-color: #f5f5f5; color: #000000"> (e.currentTarget) {<br />   </span><span style="background-color: #f5f5f5; color: #0000ff">if</span><span style="background-color: #f5f5f5; color: #000000"> (e.relatedTarget </span><span style="background-color: #f5f5f5; color: #000000">!=</span><span style="background-color: #f5f5f5; color: #000000"> obj) {<br />    </span><span style="background-color: #f5f5f5; color: #0000ff">if</span><span style="background-color: #f5f5f5; color: #000000"> (obj </span><span style="background-color: #f5f5f5; color: #000000">!=</span><span style="background-color: #f5f5f5; color: #000000"> e.relatedTarget.parentNode) {<br />     alert(</span><span style="background-color: #f5f5f5; color: #000000">1</span><span style="background-color: #f5f5f5; color: #000000">);<br />    }<br />   }<br />} </span><span style="background-color: #f5f5f5; color: #0000ff">else</span><span style="background-color: #f5f5f5; color: #000000"> {<br />   </span><span style="background-color: #f5f5f5; color: #0000ff">if</span><span style="background-color: #f5f5f5; color: #000000"> (e.toElement </span><span style="background-color: #f5f5f5; color: #000000">!=</span><span style="background-color: #f5f5f5; color: #000000"> obj) {<br />    </span><span style="background-color: #f5f5f5; color: #0000ff">if</span><span style="background-color: #f5f5f5; color: #000000"> (obj </span><span style="background-color: #f5f5f5; color: #000000">!=</span><span style="background-color: #f5f5f5; color: #000000"> e.toElement.parentNode) {<br />     alert(</span><span style="background-color: #f5f5f5; color: #000000">1</span><span style="background-color: #f5f5f5; color: #000000">);<br />    }<br />   }<br />}<br />}<br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div </span><span style="color: #ff0000">onmouseout</span><span style="color: #0000ff">="test(this, event)"</span><span style="color: #ff0000"> style</span><span style="color: #0000ff">="width:100px;height:100px;border:1px #666 solid"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">span </span><span style="color: #ff0000">style</span><span style="color: #0000ff">="margin:5px;width:100%;height:100%;border:1px #ff0000 solid"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">faddsf</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">span</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><br /></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" href="javascript:void(0);" jquery17023941937384413087="14"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /></a></span></div></div>
<p>&nbsp;</p><pre></pre>
<p>
<p>&nbsp;</p>今天发现JQ中关于这个问题,已经有了一个好的解决办法了.呵呵,jquery中定义了一种事件叫做"mouseleave",用这个事件做事件句柄的话,就可以解决这个问题了.越来越发现jquery是个好东西了. 
<p>&nbsp;</p>
<p>方案三:</p>
<p>，jQuery　V1.2.2推荐用bind("mouseleave",function(){})来代替以前的mouseover方法<br />用bind("mouseenter",function(){})来代替mouseout，同样也针对以前的hover方法，要看详细的说明点这个地址：http://docs.jquery.com/Release:jQuery_1.2.2</p>
<p>$(document).ready(function() { <br />&nbsp;&nbsp; $("#a1").bind("mouseleave", function(){<br />&nbsp;&nbsp; $('&lt;div style="color:red;"&gt;out&lt;/div&gt;')<br />&nbsp;&nbsp; .insertAfter($(this));<br />});<br />});</p></div></div></div><img src ="http://www.blogjava.net/bang/aggbug/377292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bang/" target="_blank">邦</a> 2012-05-03 16:08 <a href="http://www.blogjava.net/bang/archive/2012/05/03/377292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>