`
flyingis
  • 浏览: 297802 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
    译者:Flyingis

    JavaScript擅长于修改页面中的DOM元素,但是我们使用JavaScript通常只是实现一些简单功能,例如实现图片的翻转,网页中的标签页,等等。这篇文章将向你展示如何在页面中,对创建的元素实现拖放。

    有许多理由让你在页面中加入拖放的功能,其中最简单的理由是重新组织数据。举个例子,你可能希望用户能够重组一系列的页面元素,通过放置一个input或select组件在各个元素的旁边来代表它们的顺序是一种解决方案,使该组元素可以被拖放是一种替代方案。或者也许你想在网站上拥有一个可以被用户移动的导航窗口。这些都是使用拖放功能的简单理由,因为你能够实现!

    在你的网页上实现拖放的效果并不是很复杂。首先,我们知道鼠标的位置,然后我们需要了解用户什么时候点击一个元素,以至于我们知道要准备开始拖动它,最后我们要移动这个元素。

    捕获鼠标的移动

    第一步,我们需要获取鼠标的坐标,通过一个函数并赋给document.onmousemove可以实现这一功能:

document.onmousemove = mouseMove;
function mouseMove(ev) {
  ev 
= ev || window.event;
  
var mousePos = mouseCoords(ev);
}

function mouseCoords(ev) {
  
if(ev.pageX || ev.pageY) {
    
return {x:ev.pageX, y:ev.pageY};
  }

  
return {
    x:ev.clientX 
+ document.body.scrollLeft - document.body.clientLeft,
    y:ev.clientY 
+ document.body.scrollTop - document.body.clientTop
  }
;
}

    首先我们需要解释一下event对象。不论你什么时候移动、点击鼠标,或按键,等等,一个事件都会发生。在IE中,这个事件是全局的,它被存储在window.event中,对于Firefox,及其他的浏览器来说,这个事件将被传递到任何指向这个页面动作的函数中。因此,我们使document.onmousemove指向鼠标移动的函数,鼠标移动的函数获得事件对象。

    上述代码中,ev在所有浏览器环境中都包含了event对象。在Firefox里,"||window.event"将被忽略,因为它已经包含事件。在IE中,ev的值为空,以至于需要将它的值设置为window.event。

    本文中我们需要多次捕获到鼠标的坐标,因此我们写了一个mouseCoords方法,它有一个参数:event。

    我们要再次讨论IE和其他浏览器之间的差异。Firefox和其他的浏览器使用event.pageX和event.pageY来表示鼠标相对于document文档的位置。如果你有一个500*500的窗口,并且鼠标位于窗口中间,那么pageX和pageY的值将都是250。如果你将窗口向下滚动500象素,pageY的值为750。

    如此相反的是,微软的IE使用event.clientX和event.clientY来表示鼠标相对于window窗口的位置,而不是当前document文档。在相同的例子中,如果将鼠标放置于500*500窗口的中间,clientX和clientY值将均为250。如果向下滚动页面,clientY将仍为250,因为它是相对于window窗口来测量,而不是当前的document文档。因此,在鼠标位置中,我们应该引入document文档body区域的scrollLeft和scrollTop属性。最后,IE中document文档实际并不在(0,0)的位置,在它周围有一个小(通常有2px)边框,document.body.clientLeft和document.body.clientTop包含了这个边框的宽度,从而还需要在鼠标位置中引入它们。

    幸运的是,现在我们拥有了mouseCoords函数,不用再为获取鼠标位置担心了。

    捕获鼠标的点击
 
    下一步,我们必须知道鼠标何时点击及何时释放。如果我们跳过这一步,只要你的鼠标移动经过这些元素时,都将产生拖动这些元素的效果,这是令人讨厌并违反人的直觉的。

    在这里,有两个函数可以帮助我们:onmousedown和onmouseup。先前我们已将document.onmousemove指向一个函数,因此从逻辑上似乎应该使document.onmousedown和document.onmouseup都指向函数。如果我们让document.onmousedown指向一个函数,那么这个函数将会因为鼠标点击任何元素而执行:文本、图像、表格,等等。我们只想页面中特定的元素具有被拖放的功能,因此,我们可以通过如下方法实现:

document.onmouseup = mouseUp;
var dragObject = null;
function makeClickable(object) {
  object.onmousedown 
= function() {
  dragObject 
= this;
  }

}

function mouseUp(ev) {
  dragObject 
= null;
}

    我们现在有了一个变量dragObject,包含了你点击的任何元素。当你释放鼠标的时候,dragObject被设置为空,从而在dragObject非空的时候,我们需要进行拖动操作。

    原文链接:http://www.webreference.com/programming/javascript/mk/column2/index.html

    续文:[翻译] 如何在 JavaScript 中实现拖放(中)   [翻译] 如何在 JavaScript 中实现拖放(下)
分享到:
评论

相关推荐

    ExtJS4官方指南翻译:DragandDrop拖放/Grid组件/Tree组件/容器与布局

    在"ExtJS4官方指南翻译:DragandDrop拖放/Grid组件/Tree组件/容器与布局"中,我们将会探讨以下几个核心概念: 1. **Drag and Drop(拖放)**: ExtJS4提供了完善的拖放支持,允许用户通过鼠标操作在界面上移动元素...

    react-Reactjs漂亮可移植性列表拖拽库文档中文翻译

    在上述代码中,`DragDropContext`包裹整个组件,定义了拖放上下文。`Droppable`组件定义了一个可以接受拖放元素的区域,而`Draggable`组件则表示可以被拖动的元素。`onDragEnd`函数处理拖放结束时的逻辑,更新列表...

    jquery easyui 翻译

    在电商应用中,实现类似购物车的拖放功能是常见的需求。以下展示了如何创建一个简单的购物车: ```html <!-- 产品列表 --> <!-- 购物车内容 --> ``` 产品列表由 `ul` 元素中的 `li` 元素表示,每个产品包括...

    ASP.NET客户关系管理系统的实现(源代码+文献综述+外文翻译+答辩PPT).rar

    在这个“ASP.NET客户关系管理系统的实现”项目中,开发者利用ASP.NET技术来设计并实现了客户关系管理系统(CRM),这是一套用于企业管理和维护客户关系的重要工具。 CRM系统的主要目标是通过收集、分析、组织和利用...

    翻译翻译什么叫HTML5(一)配套代码资源包

    10. **拖放功能**:HTML5的拖放API使得用户可以方便地在网页元素之间拖放内容,无需复杂的JavaScript实现。 这个资源包可能包含了这些功能的实例代码,帮助开发者了解和学习如何在实际项目中应用HTML5。通过`code1`...

    翻译翻译什么叫HTML5(四)配套资源

    8. **Drag and Drop**:支持拖放操作,使得用户可以直接在网页上拖放元素,提升交互性。 9. **Form控件**:更新了表单控件,如新增了日期选择器、搜索框等,提高了用户体验。 10. **连接性增强**:WebSocket提供...

    基于ASP.NET的客户关系管理项目设计与实现(项目报告+源代码+文献综述+外文翻译+答辩PPT).zip

    4. **AJAX(Asynchronous JavaScript and XML)**:ASP.NET支持AJAX,允许创建异步的、部分刷新的用户界面,提高用户体验,特别是在数据密集型的CRM系统中。 5. **安全性**:ASP.NET内置的安全特性包括身份验证、...

    ASP.NET网络商店设计与实现(源代码)

    此外,HTML、CSS和JavaScript也是构建UI不可或缺的部分,开发者可能利用Bootstrap或自定义CSS来实现响应式布局,确保商店界面在不同设备上都能良好展示。 数据库管理是任何电子商务系统的基础。ASP.NET通常与SQL ...

    react-dnd-in-chinese:react-dnd 中文文档

    React DND(Drag and Drop)中文文档主要涵盖了在React应用中实现拖放功能的相关知识点。React DND是一个流行的JavaScript库,它使得在React组件中添加拖放行为变得简单且直观。下面将详细介绍这个库的核心概念、...

    js弹出可拖动计算器代码.zip

    该压缩包"js弹出可拖动计算器代码.zip"包含了一个实用的JavaScript实现的可拖动计算器代码。这个计算器不仅能够进行基本的计算操作,还具有动态效果和用户交互功能,使得它在网页中可以作为一个方便的小工具使用。...

    网站建设技术外文翻译

    在网站中应用CSS,可实现页面的统一风格,提升视觉效果。 #### 3.2 应用JavaScript设计网页 JavaScript是一种脚本语言,它的出现让网页从静态展示转变为动态交互,增强了用户体验。通过JavaScript,网页可以实时...

    ASP.NET小型证券术语解释及翻译系统的设计与开发(源代码+论文).rar

    2. **Web Forms**:在这个项目中,可能使用了Web Forms模式,这是一种基于控件的模型,允许开发者通过拖放控件来创建用户界面,类似于Windows桌面应用的开发体验。 3. **C#编程**:ASP.NET通常使用C#作为后端编程...

    ext2.0中文语言包gb2312格式

    这个文件包含了所有EXT JS组件和方法的中文翻译,通过在应用程序中引用这个文件,可以将EXT JS的默认英文界面转换为中文。使用时,开发者通常会在EXT JS的初始化代码中指定这个语言文件,例如: ```javascript Ext....

    Android Web应用高级编程(源代码)

    《Android Web应用高级编程》是针对使用HTML5、CSS3和JavaScript在Android平台上开发Web应用的专业指南。这本书由张龙翻译,旨在帮助开发者利用这些现代Web技术构建高性能、功能丰富的移动应用。 HTML5是Web开发的...

    Jquery周历插件weekCalendar汉化并实现单日显示

    在Web开发中,日历插件是一种常见的用户交互元素,尤其对于日程管理、时间预约等应用场景尤为重要。jQuery WeekCalendar是一款强大的周历插件,它允许用户直观地查看和管理一周的日程。本文将详细介绍如何对这个插件...

    QT-Drag-Translator:为个人方便创建拖动翻译器

    在这里,JavaScript作为后端处理语言,负责处理拖放事件中的翻译逻辑。 4. **翻译API**:QT-Drag-Translator可能使用了某种在线翻译服务的API,如Google Translate API或Bing Translator API,来实现翻译功能。这些...

    简易而又灵活的Javascript拖拽框架(一)

    js拖拽的时候,发现了一个强大而又灵活的拖拽框架,(之前用了代码混淆器,还好代码比较短,我就翻译过来了)利用这个框架不仅能实现简单的拖动,更能轻易的实现各种复杂的拖放功能。这一篇先实现最简单的拖拽,稍微...

    Activiti流程设计汉化

    在国际化(i18n)开发中,这种JSON文件通常用于存储不同语言环境下的字符串资源,便于程序根据用户设置的语言加载相应的翻译。通过修改和更新en.json,开发者或用户可以实现Activiti界面的中文显示,使得中国用户...

    FullCalendar的使用demo

    全历组件FullCalendar是一款强大的JavaScript库,用于在网页上展示日程、事件和时间表。这个"FullCalendar的使用demo"提供了使用FullCalendar的基本示例,帮助开发者快速理解和应用到自己的项目中。以下是对该Demo的...

Global site tag (gtag.js) - Google Analytics