这个简单的测试代码适用于除IE之外的所有浏览器(在IE8中测试):
#dBox {
height:100px;
width: 230px;
overflow-y:auto;
}
$(function () {
$('#s').focus(function(){
$(this).after('<ul id="dBox"></ul>');
for (i=0;i<10;i++) $('#dBox').append('<li>'+i+'</li>');
});
$('#dBox').live('mousedown',function(event) {
//event.stopPropagation();
//event.preventDefault();
//console.log (event.isDefaultPrevented());
//event.stopImmediatePropagation();
return false;
});
$('#s').blur(function () { $('#dBox').remove(); });
});
<input type="text" id="s"/>
我尝试了现场fn的所有选项,但没有运气
在event.isDefaultPrevented()
,它返回true,但#dBox
它仍然被删除
我甚至试图在焦点fn中绑定一个常规的mousedown。但同样的结果是它适用于所有浏览器,但不适用于IE
有没有人知道什么是错的?
答案 0 :(得分:0)
这直接是因为使用live的jQuery live()绑定事件的事件委派不绑定直接元素。相反,它会在文档的根节点上附加一个处理程序。
.live()方法能够影响 尚未添加的元素 通过使用事件到DOM 委托:绑定到的一个处理程序 祖先元素负责 在其上触发的事件 后人。处理程序传递给 .live()永远不会绑定到元素; 相反,.live()绑定一个特殊的 处理器到DOM树的根。 在我们的例子中,当新元素 单击,将执行以下步骤:
假设您想在单击#dBox元素时继续关注输入,这将有效,这里是demo http://www.jsfiddle.net/WurDE/
注意:如果您不想专注于输入,请从代码中删除trigger('focus')
。
$(function () {
$('#s').focus(function(){
if (!$('#dBox').length) {
var $dbox = $('<ul id="dBox"></ul>');
for (i=0;i<10;i++) $dbox.append('<li>'+i+'</li>');
$(this).after($dbox);
$dbox.bind("mousedown", function() {
$('#s').unbind('blur')
});
$dbox.bind("mouseup", function() {
$('#s').bind('blur', function () {
$('#dBox').remove();
}).trigger('focus');
});
}
});
$('#s').bind('blur', function () {
$('#dBox').remove();
});
});