`
jsnjlc
  • 浏览: 50917 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何调整jQuery中的事件队列

阅读更多

大家都发现,通过jQuery绑定事件是件非常容易的事情

$("a").click(function(){
	console.info("A");
	return false;
});

 但是A事件绑定后,我发现我需要B事件来决定其是否触发,好办,现在就改。

$("a").click(function(){
	console.info("B");
	return false;
});
$("a").click(function(){
	console.info("A");
	return false;
});

 真的能够阻止后面的click事件触发吗?事与愿违。

如果B事件需要通过异步调用来判断A事件是否需要触发呢?

$("a").click(function(){
	$.ajax({
		url:"b.html",
		success:function(msg){
			if(msg){
				console.info("pass");
				return true;
			}else{
				console.info("nopass");
				return false;
			}
		}
	});
});
$("a").click(function(){
	console.info("B");
	return false;
});

 事实发现根本不可能,那怎么办呢?

先说几种思路:

  1. 将后绑定的事件通过另外一种触发,比如A事件是绑定在click上,那么B事件绑定在mouseover上,先触发mouseover再通过它来阻止click事件。(后来经过研究,发现这几乎是不可能的事情)
  2. 将2个事件通过jquery的queue进行处理。(这个确实可以解决先后触发的问题,但是现实的情况是项目中所有的事件绑定已经全部写好,目前需要每个按钮事件前都加上1个判断的AJAX请求。要不就是所有的按钮事件全部重写,要么另外寻找一条路)
  3. 深入jQuery的事件机制,获得其事件的队列,针对其事件队列进行处理。
//我们先让其默认绑定个事件,称其为A事件
$("a").click(function(){
	console.info(1);
	return false;
});
//现在我们要让后面绑定的B事件先触发,并且控制A事件是否触发
//获取对象a绑定的事件对象中的click事件
var event = $("a").data("events").click;
//因为这个a在我们的B事件中也需要用到,为了防止this对象的改变,因此特地声明变量that保存
var that = $("a");
//下面就是B事件了,但是貌似好像没有绑定啊
var B = function(){
	$.ajax({
		url:"b.html",
		success:function(msg){
			if(msg){
				console.info("pass");
				tt.call(that);
			}else{
				console.info("nopass");
			}
		}
	});        
        return false;
};
//关键对象,尽请对其多关注
var tt;
//关键代码,尽请多关注
for(var i in event){
	tt = event[i];
	event[i] = B;//如果注释此行,下面2行必须取消注释。在FF中效果一样,原理不同...在IE中会循环调用...
 //delete(event[i]); //that.click(B); break; }

 问题貌似圆满解决,但是AJAX的callback函数中的return,是否可以抓的到呢?

分享到:
评论
4 楼 jsnjlc 2009-09-24  
rainchen 写道
jquery的ajax有几个全局钩子,不知对你的问题有没帮助:
$.ajaxStart(function(){
this; // dom element listening
});


详细见
http://docs.jquery.com/Ajax_Events

谢谢,其实我之所以这么做是因为开发的时候权限验证部分的设计还没有完成,因此,也没有为其留下接口。等权限验证部分的设计差不多的时候,整个JS部分的框架已经构建的差不多了,此时再对框架进行大幅度调整不太适合,而且权限验证是AJAX的验证,因此,只能调整对象上已经绑定好的事件队列了。
我想,应该会有人和我有一样的需求,如果jQuery开放这部分的功能,我想功能会更加的强大。
你所提到的钩子我已经用了,作为404和500等报错使用。
顺便说下我的项目,是用Extjs和jQuery合作开发的。前端只有我一人,纯Extjs不太现实,工作量太大,而jQuery绑定事件等又方便,所以2者进行了融合。
3 楼 rainchen 2009-09-23  
jquery的ajax有几个全局钩子,不知对你的问题有没帮助:
$.ajaxStart(function(){
this; // dom element listening
});


详细见
http://docs.jquery.com/Ajax_Events
2 楼 jsnjlc 2009-09-22  
<div class="quote_title">kimmking 写道</div>
<div class="quote_div">
<div class="quote_title"><span style="font-size: x-small;">.click(function(e) {</span></div>
<div class="quote_title"><span style="font-size: x-small;">     e.stopPropagation(); //<span style="color: #c60a00;">阻止事件冒泡</span> </span></div>
<div class="quote_title"><span style="font-size: x-small;">     e.preventDefault(); //可以阻止浏览器默认事件 </span></div>
<div class="quote_title"><span style="font-size: x-small;">});</span></div>
</div>
<p>谢谢你的回复,但是,在jQuery中的AJAX是异步调用的,虽然可以改成同步,但是,AJAX无法阻塞线程,因此,我目前能够做的就是先将后续的事件剥离掉再重新调用。</p>
<p>如果您有更好的办法,欢迎指正。</p>
1 楼 kimmking 2009-09-18  
<div class="quote_title"><span style="font-size: x-small;">.click(function(e) {</span></div>
<div class="quote_title"><span style="font-size: x-small;">     e.stopPropagation(); //<span style="color: #c60a00;">阻止事件冒泡</span> </span></div>
<div class="quote_title"><span style="font-size: x-small;">     e.preventDefault(); //可以阻止浏览器默认事件 </span></div>
<div class="quote_title"><span style="font-size: x-small;">});</span></div>

相关推荐

    jQuery图片文件上传队列代码.zip

    这些文件会被添加到上传队列中。 2. **队列管理**:`easyUpload.js`会维护一个文件队列,每个文件都有状态(如待上传、上传中、已上传、已删除等),并提供接口供用户操作队列,如添加、删除文件。 3. **分块上传*...

    jquery效果事件

    本文将深入探讨jQuery中的效果与事件,帮助你更好地理解和运用这一强大的工具。 一、jQuery简介 jQuery是由John Resig在2006年创建的一个JavaScript库,它的主要目标是简化JavaScript的DOM操作,动画效果以及事件...

    jQuery 事件队列调整方法

    这个问题的核心是如何在事件队列中调整事件的执行顺序。 首先,jQuery的事件绑定允许你通过`.on()`方法或者简化的`.click()`等方法添加事件处理器。在默认情况下,这些处理器会按照它们被绑定的顺序依次执行。例如...

    jQuery队列控制方法详解queue()/dequeue()/clearQueue()

    1. **获取队列**:当你传入一个字符串(如 "fx" 或 "",代表默认队列)作为参数时,`queue()` 返回一个数组,包含了当前队列中所有未执行的任务。 ```javascript var queueItems = $('selector').queue('fx'); ``` 2...

    jQuery动画队列特效代码.zip

    默认情况下,jQuery会将所有动画添加到一个内部的队列中,一个接一个地执行。通过`.queue()`方法,我们可以访问和控制这个队列。例如,我们可以使用`.queue()`方法添加自定义的函数到队列中: ```javascript $("#...

    Jquery队列动画特效

    **jQuery队列动画特效详解** 在前端开发中,jQuery库以其简洁易用的API和强大的功能深受开发者喜爱。尤其在处理动画效果时,jQuery的队列功能提供了灵活且高效的解决方案。本文将深入探讨jQuery队列函数的使用以及...

    利用Jquery队列实现根据输入数量显示的动画

    JQuery队列是一种特殊的数组,用于管理页面上发生的各种动画事件。在JQuery中,所有的动画方法如.show()、.hide()、.fadeIn()、.fadeOut()以及许多自定义动画方法都可以被添加到队列中进行排队执行。本文介绍的利用...

    jquery快速学三(事件与动画)

    本篇将深入探讨jQuery中的事件处理和动画效果,帮助初学者快速掌握这两个核心概念。 一、事件处理 1. 事件绑定:jQuery提供了方便的事件绑定方法,如`.on()`。例如,`$("#myButton").on("click", function() {...}...

    jQuery中文文档1.8和1.4的chm文档

    jQuery以其简洁的API和强大的功能,极大地简化了DOM操作、事件处理、动画效果以及Ajax交互等任务,使得网页动态化变得更加容易。 在jQuery 1.8版本中,引入了一些关键更新和改进,如: 1. **$.ajax()** 方法的增强...

    JQuery中文帮助文档

    jQuery,一个轻量级的JavaScript库,极大地简化了JavaScript的DOM操作、事件处理、动画设计和Ajax交互。它以其简洁、易用的API深受开发者喜爱,使得网页开发变得更加高效。这份“jQuery中文帮助文档”旨在为开发者...

    Jquery函数队列

    每个函数都接受一个`next`参数,这是jQuery提供的回调函数,当当前函数执行完毕后调用它,以便进入队列中的下一个函数。`delay`方法用于在动画之间插入延迟。 除了手动添加函数到队列,还可以使用`$.dequeue()`方法...

    图片的队列呈递效果-Jquery实现

    在网页设计中,动态的视觉效果常常能提升用户体验,其中图片的队列呈递效果是一种常见且吸引人的交互设计。这种效果通常是通过JavaScript库,尤其是Jquery来实现的。Jquery是一个强大的JavaScript库,它简化了DOM...

    [jQuery] 事件和动画详解

    jQuery事件是JavaScript事件的一种简化和扩展,使得在JavaScript中处理DOM元素的事件变得更加方便。jQuery提供了一系列的API来绑定、解绑、触发事件,以及处理事件冒泡和默认行为。 1. DOM加载 在jQuery中,我们...

    jQuery图片文件批量上传队列代码.zip

    1. **文件选择与队列管理**:在jQuery事件监听器中,当用户选择文件后,`easyUpload.js`会捕获这些文件并将其添加到上传队列中。队列管理确保了文件按顺序上传,并在上传过程中保持用户的操作流畅性。 2. **异步...

    jquery中文手册,让你快速掌握jquery!

    **jQuery简介** jQuery是一款强大的JavaScript库,由John Resig在2006年创建,它极大地简化了JavaScript的DOM操作、事件处理、动画设计以及...在实际应用中,不断实践和探索,你会发现jQuery是一个不可或缺的工具。

    精通jquery(中文第二版)_扫描版_以及源代码

    2. **事件处理**:详述jQuery中的事件绑定与解绑,如click、mouseover等常见事件,以及如何使用事件委托来优化性能。同时,会讨论事件对象和自定义事件的使用。 3. **DOM操作**:详细解析jQuery中的DOM操作方法,如...

Global site tag (gtag.js) - Google Analytics