【问题标题】:detect if the browser is mobile without page reload检测浏览器是否在没有页面重新加载的情况下移动
【发布时间】:2020-07-21 07:28:15
【问题描述】:

如果我的 flexbox 布局是移动的,我正试图弄清楚当您单击 Click Me 时如何关闭侧边栏。如果我通过 isMobile 在移动模式下刷新浏览器,我可以关闭侧边栏,因为它已经知道它是移动的,但是如果用户有浏览器并将宽度缩小到移动视图,我也希望它关闭。 npmjs 库isMobile 不知道它是移动的,除非页面重新加载。 感谢您的帮助!

<mat-sidenav-container class="sidebar-container">


  <mat-sidenav [(opened)]="isOpen" #sidenav id="sideNav" mode="side" ngif="filtersVisible" opened>
    <div class="loading">


    </div>
    <div id="spacing1"></div>


    <mat-nav-list>
      <div id="topLinks">

      </div>

      <div class="loading">

        <ngx-spinner id="loadingIcon" *ngIf="isLoading" type="ball-spin-clockwise" size="medium" color="#3071a9">
        </ngx-spinner>

      </div>

      <a mat-list-item class="navList"><label routerLink="/store" (click)="closeSidebar()" onclick="return false;"
          class="menuOptions" routerLinkActive="active-list-item"><a href="#">Click Me</a></label></a>
      <hr>

      </label></a>
      <hr *ngIf="this.role === 'Admin'">

    </mat-nav-list>

  </mat-sidenav>



  <mat-sidenav-content>

    <div id="spacing"></div>
    <router-outlet>
    </router-outlet>
  </mat-sidenav-content>
</mat-sidenav-container>

 closeSidebar() {
    if (this.mobile || this.tablet) {
      this.isOpen = false;
      this.store.dispatch({ type: "false" });
    }
  }

【问题讨论】:

    标签: javascript angular flexbox


    【解决方案1】:

    试试这个: 服务-

            import { Injectable } from '@angular/core';
            const SMALL_WIDTH_BREAKPOINT = 720;
            @Injectable({
             providedIn: 'root'
             })
        export class ScreenSizeService {
         private mediaMatcher: MediaQueryList =
          matchMedia(`(max-width: ${SMALL_WIDTH_BREAKPOINT}px)`);
    
          constructor(  
          ) {}
         isScreenSmall(): boolean {
         return this.mediaMatcher.matches;
        }
      }
        
    

    在组件中使用:

    isScreenSmall: boolean;
    
    @HostListener('window:resize') onresize() {
      this.isScreenSmall= this.service.isScreenSmall();
    }
      constructor(private service: ScreenSizeService
      ) { }
    

    【讨论】:

    • 这似乎行得通。我在 HostListener 中放了一个console.log(this.isScreenSmall),它会根据折叠浏览器的大小输出真或假,谢谢。我以前从未使用过 HostListener。我的问题是,是否需要进行任何类型的垃圾收集或者它不会影响性能?
    • 另外,如何在主机侦听器中添加另一个检查。似乎如果我添加另一个检查 1002 宽度,它会忽略它,只检查 720 宽度版本。我可以在主机侦听器中获得两种不同的宽度检查吗?这是我当前的代码:pastebin.com/8bwZN4L5
    • 在您为 isScreenSmall() 和 isScreenTablet() 方法服务的代码中,您将返回 this.mediaMatcher.matches,在 isScreenTablet() 中您应该返回 this.mediaMathcer2.matches
    【解决方案2】:

    提到的 isMobile 库依赖于用户代理字符串,所以它基本上不应该需要另一个页面加载。

    但是,通常只有移动设备支持“TouchEvent”。您可以使用它来检查它是否可能是移动设备,而无需依赖用户代理

        function isTouch() {
            try {
              document.createEvent('TouchEvent');
              return true;
            }
            catch (e) {
              return false;
            }
        }
    

    【讨论】:

    • 如何检查它是否可以从角度组件移动?此外,它必须是某种可观察的内部构造函数解决方案,我会考虑我想要工作的内容。我不认为我可以在调整浏览器大小时以有效的方式调用函数,但也许我错了
    • 您可以检测到调整大小 developer.mozilla.org/en-US/docs/Web/API/Window/resize_event 对于角度的使用,这可能会有所帮助 *.com/a/35527852/6278591
    最近更新 更多