2013-07-16 38 views
2

如何防止jQuery对话框关闭其开启者?防止jQuery对话框聚焦开启器关闭

我有一个很大的textarea,当打开一个对话框的时候会关注它。如果页面向下滚动到底部,则打开对话框。当对话框关闭时,jQuery UI将焦点放在textarea上,并使页面跳回到顶部。

下面是一个例子:http://jsfiddle.net/bPqF2/1/

点击锚,然后关闭对话框。

<div> 
    <a id="click-me" href="#bottom">Click me</a> 
</div> 
<div> 
    <textarea style="height: 2000px"> 
     ... 
    </textarea> 
</div> 
<div> 
    <a id="bottom" name="bottom"></a> 
</div> 

$(function() { 
    $('#click-me').click(function() { 
     $('textarea').focus(); 
     setTimeout(function() { 
      $('<div>').text('Close me please!').dialog({ 
       modal: true 
      }); 
     }); 
    }); 
}); 

jQuery的用户界面的问题的行是https://github.com/jquery/jquery-ui/blob/86eaa30994657b650b26388e87ecff679cf93a50/ui/jquery.ui.dialog.js#L181

(注:上面只是一个自动化例如,在实际使用情况下,用户滚动窗口下来,打开的对话框(通过单击使用user-select: none),并且当它关闭时,窗口跳回到顶部)。

如果看到:http://jsfiddle.net/bPqF2/9并单击文本区域,向下滚动并等待弹出窗口,当窗口关闭时窗口将滚动到顶部。

+0

为什么你有一个焦点()呢? –

+0

@FrancisKim作为一个自动化的例子。在我的真实使用案例中,当打开对话框时,textarea已被用户手动聚焦。 – Petah

回答

2

这个怎么样?您可以根据自己的喜好调整滚动条。您还可以滚动到文本区域结束,如果你喜欢

<div> 
    <a id="click-me" href="#bottom">Click me</a> 
</div> 
<div> 
    <textarea id="myTxtArea" style="height: 2000px"></textarea> 
</div> 
<div> 
    <a id="bottom" name="bottom"></a> 
</div> 
<div data-role="dialog" id="myDialog"></div> 

$(function() { 
    $('#click-me').click(function() { 
     var pos = $(document).scrollTop(); // get current position before focus 
     $('textarea').focus(); 
     setTimeout(function() { 
      $('#myDialog').text('Close me please!').dialog({ 
       modal: true, 
       close: function (event, ui) { 
        console.log("dialog has closed"); 
        $('#myTxtArea').blur(); 
        $("html, body").scrollTop(pos); 
       } 
      }); 
     }); 
    }); 
}); 

Here is a demo on jsFiddle

+0

我不想让它滚动到最后。我希望它不要滚动。 (保持打开对话框时的滚动位置)。 – Petah

+0

好的,我认为textarea上的'blur'应该完成那个? – Ross

+0

不,按照原始顺序滚动到最上面。 – Petah

2

更改您的href="#bottom"href="javascript:void(0);"

你为什么不加入.blur()撤消用户的对焦点textarea的?

小提琴: http://jsfiddle.net/bPqF2/8/

+0

就像我在评论中所说的那样,这只是一个自动化的例子。如果你看到这个:http://jsfiddle.net/bPqF2/9/然后点击文本区域,向下滚动,并等待弹出对话框,当它关闭时窗口滚动到顶部。 – Petah

+0

@Petah我明白它是自动的。但是,如果它是手动聚焦,那么您应该使其模糊,以防止默认的浏览器操作(向上滚动)? –

+0

另外,由于您已链接到锚点,因此它最初会向下滚动。这不是jQuery.dialog()这样做。 –