使用jQuery autocomplete / jScrollPane,IE事件传播的行为不符合预期

时间:2011-07-13 09:53:15

标签: jquery javascript-events autocomplete event-propagation

我有一个使用ajax自动完成的文本输入字段。结果显示在带有垂直滚动条的jScrollPane面板中。

我遇到IE特定的问题,当用户点击jscrollPane下拉列表的滚动条时会触发输入字段的模糊事件(滚动条的向上和向下箭头生成为下面显示的锚标记)。

我的理解是返回false应该阻止事件传播,我希望mousedown和click事件都为锚标记返回false。这适用于FF和Chrome,但不适用于IE。

虽然下面没有显示,但我也尝试在我的活动中使用以下代码,但无济于事:

    e.preventDefault ? e.preventDefault() : e.stop();
    e.returnValue = false;
    e.stopPropagation();

我想我的第一个问题是:

我是否应该期望在一种类型的事件上停止传播以实际阻止其他类型的事件传播?

即。如果触发了一个返回false的mousedown事件,这是否会阻止模糊或将事件聚焦于触发?

如何解决此问题以确保IE与FF和Chrome的工作方式相同?

提前感谢您的帮助

var rf = function() { return false; };

$('<a></a>')
    .attr({'href':'javascript:;', 'className':'jScrollArrowUp'})
    .css({'width':settings.scrollbarWidth+'px'})
    .html('Scroll up')
    .bind('mousedown', function()
    {
        currentArrowButton = $(this);
        currentArrowDirection = -1;
        onArrowMouseDown();

        return false;
    })
    .bind('click', rf)

$("#InputBox").blur(function(e) {
    hasFocus = 0;
    if (!config.mouseDownOnSelect) {
        hideResultsNow();
    }

2 个答案:

答案 0 :(得分:0)

仅限IE浏览器中的相同问题。

经过数小时的实验和谷歌搜索后,我决定在模糊事件和动作之间使用微小的延迟(隐藏列表)。它为触发点击事件提供了时间。然后在单击事件处理程序中,您必须检查是否已安排延迟模糊事件处理,如果是 - 取消该处理。

答案 1 :(得分:0)

这已经晚了3年但我刚刚发现实际上有一种方法可以让IE≤8来e.preventDefault() mousedown在其他浏览器中做什么(这会阻止选择和< / strong>阻止焦点):设置unselectable属性! http://jsbin.com/yagekiji/1

请注意,与总是建议的解决方法(包括the other one here)不同,它总是归结为setTimeout(function() { thingIDidntWantFocusStolenFrom.focus(); }),这可以防止焦点首先被mousedown目标所窃取!

有关unselectable的有趣之处在于它不是继承的,因此经常会忽略selectstart事件(气泡和e.preventDefault()会阻止选择但阻止焦点),或使用树遍历设置每个后代元素(如the StackOverflow answer that first clued me in that this might be possible或Tim Down series of nearly { {3}} identical),但您实际上只需在event.target mousedown上设置它。

(另外,jQuery票证:answers