【问题标题】:WhichBrowser integration error哪个浏览器集成错误
【发布时间】:2014-02-17 07:27:48
【问题描述】:

我正在运行一个集成了WhichBrowser 的html 页面。

如 README 文件中所述,我已将以下代码(在 <head> 部分中):

<script>
    (function(){var p=[],w=window,d=document,e=f=0;p.push('ua='+encodeURIComponent(navigator.userAgent));e|=w.ActiveXObject?1:0;e|=w.opera?2:0;e|=w.chrome?4:0;
    e|='getBoxObjectFor' in d || 'mozInnerScreenX' in w?8:0;e|=('WebKitCSSMatrix' in w||'WebKitPoint' in w||'webkitStorageInfo' in w||'webkitURL' in w)?16:0;
    e|=(e&16&&({}.toString).toString().indexOf("\n")===-1)?32:0;p.push('e='+e);f|='sandbox' in d.createElement('iframe')?1:0;f|='WebSocket' in w?2:0;
    f|=w.Worker?4:0;f|=w.applicationCache?8:0;f|=w.history && history.pushState?16:0;f|=d.documentElement.webkitRequestFullScreen?32:0;f|='FileReader' in w?64:0;
    p.push('f='+f);p.push('r='+Math.random().toString(36).substring(7));p.push('w='+screen.width);p.push('h='+screen.height);var s=d.createElement('script');
    s.src='http://localhost/mysite/libs/whichbrowser/detect.js?' + p.join('&');d.getElementsByTagName('head')[0].appendChild(s);})();
</script>

然后是下面的代码(在&lt;body&gt;):

<script>
Browsers = new WhichBrowser();
alert("You are using " + Browsers);
</script>

我在easyPHP上运行,考虑到.htaccess,所以.js由PHP解释器解析。

在运行页面时(当然是从服务器),我在Browsers = new WhichBrowser(); 行收到以下错误:“未定义哪个浏览器”。

我做错了什么?

【问题讨论】:

  • 不知道,但您永远不需要知道用户正在运行什么浏览器。几乎唯一没问题的情况是对 jsperf 之类的网站进行基准测试...
  • 有 javascript 文件 (detect.js) 由运行底部 sn-p 时加载的代码的 sn-p 加载?
  • @NiettheDarkAbsol:当您没有时间和资源来测试所有浏览器和/或为所有现有浏览器调整 CSS ?
  • @PatrickEvans:我想是的...我将如何测试它,如果没有加载,我该如何等待它被加载?
  • @Oliver 不,但我只是按照标准编码,它似乎在所有主要浏览器中都可以正常工作。除了 Firefox,但即使是那个也进展缓慢。

标签: javascript php html .htaccess browser-detection


【解决方案1】:

我遇到了同样的问题并通过执行以下操作解决了它:

$(window).on('load', function() {
    Browsers = new WhichBrowser();
    // Put rest of browser detection code here
});

问题是在加载detect.js之前调用了脚本。

【讨论】:

  • 如果它适合你,你会接受我的回答吗?谢谢!
  • 我试过了,它似乎有效。但是为什么我不能从其他地方访问浏览器,而不是那个小功能。我的意思是,我有一个稍后调用的 javascript 函数,我想在那里测试我的浏览器,但它说浏览器是未知的,会产生 JS 错误。
  • 这是因为仅在 DOM 准备好时才调用 ready 处理程序,而不必在加载其他资产时调用。浏览器依赖于正在加载的 detect.js 文件。确保首先加载它的唯一方法是在 $(window).on('load') 事件中访问它。那个“小功能”不必那么小。你可以在里面放任何东西,包括以后要调用的js函数。您可以在调用 $(document).ready 后立即打开 $(window).on('load') 并在关闭它之前将其关闭。
  • 好的,但我的意思是,如果我在确定文档已加载(并且 $(window).on('load') 被触发)之后调用了一个 javscript 函数,为什么这个函数不认识浏览器?
  • 您永远不知道加载所有资源需要多长时间。它可能是 500 毫秒或 6 整秒。您可以确定的唯一方法是使用 $(window).on('load') 函数。正在加载的文档/准备好的 DOM 与正在加载的外部资产不同。有很多关于这方面的信息。比如这个就很清楚了:4loc.wordpress.com/2009/04/28/documentready-vs-windowload
【解决方案2】:

那是因为在最后一行代码中,sn-p 链接应该指向 php 脚本而不是 js 脚本,应该是这样的:

s.src='http://localhost/mysite/libs/whichbrowser/detect.php?' + p.join('&');d.getElementsByTagName('head')[0].appendChild(s);})();

编辑: 这意味着由于某种原因附加的 .htaccess 文件没有被执行(例如重写)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    相关资源
    最近更新 更多