在 div 或元素外单击以在 Blazor 上关闭它的事件

Ami*_*inM 6 c# .net-core razor-pages blazor blazor-server-side

在我的Blazor server-side项目中,我需要通过在菜单外单击来关闭弹出菜单。我使用一个简单的If语句通过触发onClick事件来显示/隐藏弹出窗口。但是没有这样的事件可以通过在弹出菜单外单击来关闭弹出窗口。所以用户应该只通过点击带有onClick事件的元素来关闭它。所以我的问题是我们如何在不使用的情况下更好地解决这个问题JS

先感谢您。

Fab*_*nus 19

以下是我使用 div 来触发 onfocusout 事件的方法,其中 if 语句使用 ShowSelectBox 变量来显示或隐藏某些内容:

<div tabindex="0" @onfocusout="@(() => ShowSelectBox = false)">
...
</div>
Run Code Online (Sandbox Code Playgroud)

我在 blazor webassambly 应用程序中使用了它,但对于服务器端应该是相同的。

  • 不幸的是,这似乎不起作用,因为首先您需要为弹出窗口提供焦点。因此,如果您单击弹出窗口,然后单击外部,它将关闭。而且据我所知,如果不使用 JS,就无法将窗口设置为焦点,正如这里也提到的:/sf/ask/4221643191/西装外套中的盒子。 (2认同)

Nik*_*k P 9

添加一个<div>与屏幕大小相同的元素,其 z 索引比弹出菜单低 1,但比应用程序的其余部分高。你需要position: fixed在 CSS 类中使用,然后width: 100%; height: 100%; top: 0%; left: 0%;它就会填满页面。初始 CSS 显示值应为display: none;。当您打开弹出窗口时,还要将 div 的显示属性更改为 ,display: flex将其添加到 DOM,然后@OnClick在此浮动 div 上添加一个单击处理程序,该处理程序将关闭弹出窗口并将浮动 div 显示属性设置回display: none;。div 应该清晰,这样您仍然可以看到其后面的应用程序的其余部分,但允许您在弹出窗口外部单击以获取所需的行为,因为弹出窗口之外的任何位置都将位于覆盖屏幕其余部分的 Div 上。

请注意,在弹出窗口中,当您从弹出窗口内部关闭弹出窗口时,您还需要将浮动 Div 显示值设置回“无”,否则它会一直存在并需要额外单击才能使其消失。

您还可以使用透明度稍微遮蔽 Div 元素,以便在弹出窗口打开时为其提供突出显示效果。


Net*_*oTI 5

我想出了一个不使用 JS 的解决方案,使用 onmouseover 事件我们可以将 bool var 的值设置为 true,使用 onmouseout 事件我们可以设置为 false 等等,验证鼠标是否单击了标签元素

 <button @onclick="Show">Click</button>
<div  @onmouseover="MouseIn" @onmouseout="MouseOut">...</div>
    
@code{
bool IsInside; 
void Show()
{
   if(!IsInside)
   {
       ...
   }
}
void MouseIn()
{
   IsInside= true
}; 
void MouseOut()
{
   IsInside= False;
}
}
Run Code Online (Sandbox Code Playgroud)


小智 2

@onmouseout我的标签内的事件确实div有效,但对于我需要的东西来说有点太敏感了,因为我div有几个孩子,所以当我不希望它关闭时,它一直关闭。我发现这个解决方案更可靠。

我创建了一个事件处理程序类

[EventHandler("onmouseleave", typeof(EventArgs), true, true)]
public class EventHandlers
{
}
Run Code Online (Sandbox Code Playgroud)

然后在我的剃刀页面中:

<div class="menu" @onmouseleave="MouseLeave"></div>

@code {
    private void MouseLeave(EventArgs args)
    {
        IsVisible = false;
    }
}
Run Code Online (Sandbox Code Playgroud)