当前位置: 首页 > 知识库问答 >
问题:

javascript - 如何解决动态创建的droppable的over事件无法被第一时间触发的问题?

孙泳
2023-09-30

我使用jqui中的droppable小部件。

我的父元素“Div”是一个droppable对象,当accept对象“ball”进入其中时会在父元素Div内创建另一个同样是droppable的子元素“circle”,这个子元素同样绑定了一个over事件,当“ball”对象进入“circle”时,会触发“进球了”函数

但是,我发现:当我移动ball进入Div内,circle产生了,而此时我移动ball进入circle内,却没有正确触发“进球”事件(事实上,任何绑定在"circle"上的droppable事件都没有触发),必须先松开处于拖拽中的ball,再点击ball拖拽,使其进入circle中,才能正确触发circle的over事件。

然而,这并不符合我的预期,我希望当ball进入Div内,再进入circle时,能够直接触发这个事件,而不是先松开,再拖拽,随后触发这个事件,我该如何解决这个问题?感谢任何愿意提出的建议!

共有1个答案

田嘉慕
2023-09-30

这个问题似乎是由于jQuery UI的droppable组件在处理拖动事件时存在一些困难。当你在拖动一个元素并放入另一个droppable元素时,它可能无法正确地触发那个元素的"over"事件。

你可以尝试使用一个叫做"activate"的事件来代替"over"。这个事件在元素被放置并且是目标元素的时候被触发,所以它可能能解决你的问题。以下是你如何修改你的代码的一个示例:

$("#Div").droppable({    accept: "#ball",    activate: function(event, ui) {        var circle = $(event.target).find("#circle");        if(circle.length > 0) {            circle.droppable("option", "over", function(event, ui) {                // 这里写你的"进球了"函数                console.log("进球了");            });        }    }});

在这个例子中,当#ball被拖动到#Div并且#circle被创建时,我们检查#circle是否存在,如果存在,我们就在#circle上设置"over"事件。这样,当你将#ball拖到#circle时,应该能够立即触发"进球了"函数。

然而,这个解决方案有一个局限性,就是当#ball被放入#circle后,如果你再把#ball从#circle中取出,#circle的"over"事件将不会被触发,除非你再次将#ball放入#circle。这是因为droppable组件在初始化的时候会为每个可接受的元素创建一个新的"over"事件监听器,而这个监听器只在元素第一次被放置的时候被触发。

为了解决这个问题,你可能需要使用一个自定义的事件处理器,而这个处理器可以在每次#ball被放入#Div和#circle的时候被触发。这样,无论何时#ball被移动到#Div或者#circle,你都能确保你的"进球了"函数会被正确地触发。

 类似资料:
  • 我想获取GET参数的值并触发一个事件。如何在Created方法中触发事件? 我尝试了这种方式,但没有找到点击方法:

  • 本文向大家介绍jquery中trigger()无法触发hover事件的解决方法,包括了jquery中trigger()无法触发hover事件的解决方法的使用技巧和注意事项,需要的朋友参考一下 今天做一个项目,遇到了一个问题,是以前没有遇到过的,就此记上一笔。 1、trigger方法解释 官方是这么解释的: 用法: .trigger( eventType [, extraParameters] )

  • 一个名为专题报告的下拉框,点击下拉框后给后端发一个special_report/special_report/selectList的get请求,将获取到的数据展示在下拉框,当我第一次点击下拉框时,没有数据,之后点击数据就展示出来了,百度是因为fetch发的是异步请求,于是在fetch中添加一个Promise,但是无效,用async/await依然无效,求大佬指点!! 第一次点击: 之后点击:

  • 我在用柏树。io根据react页面自动上传一个文件测试用例。用于文件上载的输入组件(type=file)是在呈现页面时在运行时创建的。 似乎按钮(通过单击“选择文件”)打开了一个本机文件选择器,而赛普拉斯网络驱动程序似乎不支持与之交互,所以在这种情况下,可能会触发一个模拟文件选择的事件。但是Cypress无法定位输入(type=file),因为它不是DOM的一部分,这意味着cy.get('输入[t

  • 问题内容: 我正在通过日历窗口小部件设置日期时间文本字段值。显然,日历小部件会执行以下操作: 我想要的是:在更改日期时间文本字段中的值时,我需要重置页面中的其他一些字段。我已经将一个onchange事件侦听器添加到了不会被触发的datetimetext字段中,因为我猜只有在元素获得焦点并且其值更改为失去焦点时才会被触发。 因此,我正在寻找一种手动触发此事件的方法(我认为应该注意检查文本字段中的值差

  • 本文向大家介绍解决Vue.js父组件$on无法监听子组件$emit触发事件的问题,包括了解决Vue.js父组件$on无法监听子组件$emit触发事件的问题的使用技巧和注意事项,需要的朋友参考一下 最近学习vuejs看例子中用$on无法监听子组件$emit触发事件: 使用版本 vue.js 2.2.5 参考文献 1.vuejs API 2.解决实例 问题分析 1.之前写的自定义组件事件触发为this