ReactJS 中的浏览器检测

IT技术 javascript reactjs typescript
2021-04-16 08:21:06

有什么方法可以使用 React 检测 IE 浏览器并重定向到页面或提供任何有用的消息。我在 JavaScript 中找到了一些东西,但不确定如何将它与 React+TypeScript 一起使用。

var isEdge = !isIE && !!window.StyleMedia;

6个回答

您走在正确的轨道上,您可以使用这些来有条件地呈现 jsx 或帮助路由...

我已经成功地使用了以下内容。

最初来自 -如何检测 Safari、Chrome、IE、Firefox 和 Opera 浏览器?

// Opera 8.0+
const isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;

// Firefox 1.0+
const isFirefox = typeof InstallTrigger !== 'undefined';

// Safari 3.0+ "[object HTMLElementConstructor]" 
const isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification));

// Internet Explorer 6-11
const isIE = /*@cc_on!@*/false || !!document.documentMode;

// Edge 20+
const isEdge = !isIE && !!window.StyleMedia;

// Chrome 1 - 71
const isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);

// Blink engine detection
const isBlink = (isChrome || isOpera) && !!window.CSS;

请注意,由于浏览器的变化,它们都有可能被弃用。

我在 React 中像这样使用它们:

 content(props){
    if(!isChrome){
     return (
      <Otherjsxelements/>
     )
    }
    else { 
     return (
      <Chromejsxelements/>
     )
    }
  }

然后通过在我的主要组件中调用 {this.Content()} 来呈现不同的浏览器特定元素。

伪代码可能看起来像这样......(未经测试):

import React from 'react';

const isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);

export default class Test extends React.Component {

  content(){
    if(isChrome){
        return (
            <div>Chrome</div>
        )
    } else {
        return (
            <div>Not Chrome</div>
        )
    }
  }

    render() {
        return (
            <div>Content to be seen on all browsers</div>
            {this.content()}
        )
    }
}
如前所述,isChrome 仅适用于版本 71。但不能用于当前版本 95。这不是 chrome 的解决方案。
2021-05-24 08:21:06
查看像@Tallboy 提供的库这样的库可能是个好主意,因为它更有可能更定期地更新。然后只需使用我为 React 集成提供的示例。
2021-05-29 08:21:06
这些现在已弃用
2021-05-30 08:21:06
例如,您可以更改模式内容,甚至根据您的路由器让它调用函数并将您重定向到帮助页面。如果您需要进一步细分这些零件在组件内部的位置,请告诉我。
2021-06-15 08:21:06
也许试试这个……让 isSafari = navigator.userAgent.indexOf("Safari") > -1; 这些方法经常改变。
2021-06-18 08:21:06

不知道为什么,但没有人提到这个包:react-device-detect 这个包有很多浏览器检查,加上版本和其他一些相关的信息。它真的很小,而且已经更新。

您可以使用:

import { isIE } from 'react-device-detect';
isIE // returns true or false

react-device-detect 它也是非常小的捆绑恐惧症链接

@LucasAndrade 似乎有人删除了我的评论,但如果您错过了,这是在我的问题中not sure how would I use it with React+TypeScript软件包是好的,直到它们出现错误并且您推翻所有内容来更新软件包,才意识到它充满了错误,然后您会花费额外的时间来降级。我的理论是,如果可以的话,自己写。对于这么小的问题,我认为任何人都不应该使用包。当然,那里需要保持平衡,不要朝其他方向去尝试重新发明轮子。
2021-05-28 08:21:06
我刚刚使用了这个包,在 Safari 上访问,但它不起作用
2021-05-29 08:21:06
我认为放下这篇文章没有用。一个包是解决这个问题的一种完全合理的方法,并且确实有几个优点,即创建者/贡献者可能已经想到了你没有想到的边缘情况,以及设备/浏览器检测更改的有效和无效频繁地; 我个人宁愿不必每次都更新我的代码。
2021-06-02 08:21:06
虽然我的讨论有点晚了,但@LucasAndrade 只是想提供帮助。不管一个人在编程方面有多好,几乎总是会错过一些边缘情况。
2021-06-13 08:21:06
当然,我现在知道了@HafizTemuri,但也许您应该尝试在下一个问题中添加该信息,我们是开发人员,而不是千里眼。在我个人看来,该软件包在某些方面为我们节省了很多时间:首先,因为您不必自己编写任何代码,其次您不会花时间重构该代码,因为某些浏览器版本不再支持您的代码. 我强制执行有关包大小的信息,因为在我个人看来,在这种情况下,轻量级包不是矫枉过正,矫枉过正是花时间进行过早的优化。wiki.c2.com/?PrematureOptimization
2021-06-20 08:21:06

这是我在进行基于 JS/Browser 的浏览器检测时总是使用的服务:http : //is.js.org/

if (is.ie() || is.edge()) {
  window.location.href = 'http://example.com';
}
重定向到同一应用程序的页面。它可能会出现在同一个if语句中,并使其一遍又一遍地重定向。
2021-06-03 08:21:06
在我的情况下,无限重定向将如何发生?您只需确保不会在该页面上发生。除了创建潜在重定向循环的情况之外,您还如何重定向到基于浏览器的页面?
2021-06-16 08:21:06
这可能以永无止境的重定向循环结束。在我看来,这不是处理它的理想方式。
2021-06-17 08:21:06
您在原始消息中说“重定向到页面”,所以我完全回答了您的问题。
2021-06-17 08:21:06
更不用说,您刚刚标记为正确的答案与我没有重定向的答案相同,这正是您最初要求的。
2021-06-21 08:21:06

尝试:

const isEdge = window.navigator.userAgent.indexOf('Edge') != -1
const isIE = window.navigator.userAgent.indexOf('Trident') != -1 && !isEdge

等等。

每个浏览器都有一个不同的用户代理,您可以检查。

这些当然可以由客户伪造,但在我看来,这是一个更可靠的长期解决方案。

您不能直接使用它,因为导航器必须仅在 DOM 渲染时/之后运行。
2021-05-30 08:21:06

您可以像这样为 IE 编写测试。

<script>
     // Internet Explorer 6-11
          const isIE = document.documentMode;
          if (isIE){
            window.alert(
              "Your MESSAGE here."
            )
          }
</script>