当文档单击时删除元素,但仍然触发元素的单击事件
Remove element when document click - but still fire click event for the element
对不起,我有麻烦试图把这个词和标题斗争。我正在使用jQuery在某些条件下删除一个元素-我也在寻找这个元素的点击。似乎在点击事件发生之前它被删除了,我已经尝试了各种各样的事情来让它工作得很好。
http://jsfiddle.net/Yr54c/
如果你注释掉第一个#icon.remove()上的小提琴它都工作得很好,但我想要的是小图标消失,如果有人点击它。我希望我说得有道理!
基本上应该发生的是,当一个单词在2-25个字符之间被选中时,它旁边会出现一个图标(div)。该图标一直保留到:
- 点击页面的其他地方。
点击后,页脚出现
请记住,人们可以拖动选择单词,或者双击!
我只有jQuery 1.4.4工作太!
selectionchange.start();
document.addEventListener('selectionchange', function (event) {
var sel = this.getSelection();
if (sel.toString().length > 1 && sel.toString().length < 25) {
$("#icon").remove();
var range = sel.getRangeAt(0)
var startNode = range.startContainer,
startOffset = range.startOffset;
if (range.endOffset > range.startOffset) {
startNode = range.endContainer;
startOffset = range.endOffset;
}
var boundaryRange = range.cloneRange();
boundaryRange.collapse(false);
boundaryRange.insertNode($('<div id="icon" data="' + sel + '"></div>')[0]);
boundaryRange.setStart(startNode, startOffset);
boundaryRange.collapse(true);
}
});
$("#icon").live("touchend click", function(e) {
$("#footer").remove();
$("body").append("<div id='footer'><div id='footer-inner'><p></p></div></div>");
$("#icon").remove();
$("#footer-inner p").html('<div id="footer-close">Close this bar</div>');
});
文档上的selectionchange
事件当前首先触发,并在其上的click事件被触发之前删除#icon
。不要删除selectionchange
上的图标,而是在#icon
元素之外的单击事件上删除它。例如,将#icon
上的单击侦听器替换为:
$(document).bind("click", function (e) {
if(e.target.id=="icon")
{
$("#footer").remove();
$("body").append("<div id='footer'><div id='footer-inner'><p></p></div></div>");
$("#footer-inner p").html('<div id="footer-close">Close this bar</div>');
}
$("#icon").remove();
});
实例:http://jsfiddle.net/Yr54c/3/
在DOM上创建元素之前调用#图标上的事件绑定。所以你需要在代码的这一行之后调用这个方法:
boundaryRange.insertNode($('<div id="icon" data="' + sel + '"></div>')[0]);
bindEvent(); // something like this
function bindEvent(){
$("#icon").live("touchend click", function(e) {
$("#footer").remove();
$("body").append("<div id='footer'><div id='footer-inner'><p></p></div></div>");
$("#icon").remove();
$("#footer-inner p").html('<div id="footer-close">Close this bar</div>');
});
}
看起来你的问题是每次"selectionchange"事件被触发时(通过调用$("#icon").remove()然后添加一个新的),你都创建了一个新的图标元素,但是你只绑定了一次点击处理函数,当代码第一次运行时。这是因为click和touchend绑定发生在selectionchange处理程序之外。
要解决这个问题,你应该绑定一个新的触摸和点击处理函数到新的图标元素,每次你创建一个,或者(这是更好的做法,IMO)绑定点击处理函数到包含#图标的元素,通过使用
$(".cool").on("click", "#icon", (handler));
- 单击元素外部时进行JQuery
- 单击p元素时的javascript触发事件
- 单击元素的x/y点
- 单击元素两次后执行操作
- 在使用jQuery第二次单击元素类后开始操作
- 页面加载后自动单击元素
- 检查气泡中的单击元素
- 单击元素时出现问题,这些元素是用.html()添加到页面的
- 单击元素时移除类并添加类
- 单击元素后Jquery选择器不工作
- 在单击元素部分时显示元素的代码
- 如果用户多次单击元素,如何避免争用条件
- 单击元素时,JQuery 不会更改具有“活动”类的元素
- 在 JavaScript / jQuery 回调中使用“this”更改单击元素的文本
- 如何防止在拖动时单击元素
- 通过 jquery .on() 函数将单击元素的属性值传递给外部函数
- Angularjs 指令单击元素
- jQuery 和单击元素中的第一个元素
- 单击元素时重新加载 iframe src
- 防止单击元素上的单击事件