基于JQuery 改造bootstrap模态框拖动功能

看不爽现有的bootstrap拖动实现,自己也手痒,就自己写了一个拖动处理。

PS:其他实现拖动方法 http://www.gbtags.com/gb/rtreplayerpreview/230.htm 供参考


JQuery版本1.7.2

Bootstrap版本3.3.4

html代码(就是普通的模态框代码)

<div class="modal fade" id="modalID"  tabindex="-1" role="dialog" 
    aria-labelledby="myModal"  aria-hidden="true" >
    <div class="modal-dialog">
    	<div class="modal-content">
			<form method="POST" id="" action="" onSubmit="">
	    		<div class="modal-header popup_box_head_style">
	    			<button type="button" class="close popup_box_close_style" style="color:white"
	                data-dismiss="modal" aria-hidden="true">
	                  ×
	            	</button>
	    		 <div class="modal-footer popup_box_footer_style" style="text-align:center">
		           <button type="button" class="btn btn-default btn-lg" style="background-color:#4497f8;color:white;border:1px solid #4497f8"
	                    data-dismiss="modal">关闭
		            </button>
			</div>
			</form>
    	</div>
    </div>
</div>			

Js代码

/** 拖拽模态框*/
		var mouseStartPoint = {"left":0,"top":  0};
		var mouseEndPoint = {"left":0,"top":  0};
		var mouseDragDown = false;
		var oldP = {"left":0,"top":  0};
		var moveTartet ;
		$(document).ready(function(){
			$(document).on("mousedown",".modal-header",function(e){
				if($(e.target).hasClass("close"))//点关闭按钮不能移动对话框
					return;
				mouseDragDown = true;
				moveTartet = $(this).parent();
				mouseStartPoint = {"left":e.clientX,"top":  e.clientY};
				oldP = moveTartet.offset();
			});
			$(document).on("mouseup",function(e){
				mouseDragDown = false;
				moveTartet = undefined;
				mouseStartPoint = {"left":0,"top":  0};
				oldP = {"left":0,"top":  0};
			});
			$(document).on("mousemove",function(e){
				if(!mouseDragDown || moveTartet == undefined)return;
				var mousX = e.clientX;
				var mousY = e.clientY;
				if(mousX < 0)mousX = 0;
				if(mousY < 0)mousY = 25;
				mouseEndPoint = {"left":mousX,"top": mousY};
				var width = moveTartet.width();
				var height = moveTartet.height();
				mouseEndPoint.left = mouseEndPoint.left - (mouseStartPoint.left - oldP.left);//移动修正,更平滑
				mouseEndPoint.top = mouseEndPoint.top - (mouseStartPoint.top - oldP.top);
				moveTartet.offset(mouseEndPoint);
			});
		});

原理:

并没有什么鬼原理,就是简单的数学计算。


在使用jQueryBootstrap框架开发网页时,我们可能会遇到在模态框中多次触发同一事件导致多个Ajax请求被同时发送的情况。为了防止这种情况发生,我们可以在发送Ajax请求前对模态框进行一些控制,以阻止用户在等待Ajax响应时重复触发事件。 一个常见的做法是使用Bootstrap提供的数据属性来控制模态框的状态。在打开模态框前,可以通过设置模态框的`data`属性来标记已经打开,然后在Ajax请求结束后清除这个状态。这样,当用户尝试再次触发事件时,我们可以通过检查这个标记来决定是否需要执行后续操作。 以下是一个简单的示例代码: ```javascript // 假设这是一个触发模态框的按钮的点击事件处理函数 $('#myButton').on('click', function () { // 检查模态框是否已经打开 if ($('#myModal').data('is-opening')) { return; // 如果已经打开,则不执行后续操作 } // 标记模态框正在打开 $('#myModal').data('is-opening', true); // 显示模态框 $('#myModal').modal('show'); // 发送Ajax请求 $.ajax({ url: 'your-endpoint-url', method: 'POST', // ...其他ajax选项 success: function (response) { // 处理成功的响应 // ... // 清除标记 $('#myModal').data('is-opening', false); }, error: function (xhr) { // 处理错误情况 // ... // 清除标记 $('#myModal').data('is-opening', false); } }); }); ``` 在上面的示例中,我们使用了`data('is-opening')`来检查模态框是否正在打开。这是一个简单的标志位,你可以根据实际情况进行调整或扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值