2 github 35883572 github_35883572 于 2016.09.08 23:19 提问

JS客户端检测,为什么总是Uncaught ReferenceError 错误?
 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript">
        var client = function () {
            var engine = {
                //内核
                ie: 0,
                gecko: 0,
                webkit: 0,
                khtml:0,
                opera:0,
                //具体版本
                 ver: null
            };
            var browser = {
                //浏览器
                ie: 0,
                firefox: 0,
                safari: 0,
                konq: 0,
                opera: 0,
                chrome: 0,
                //具体的版本
                ver: null
            };
            return {
                engine: engine,
                browser: browser
            };
        }();
        var ua = navigator.userAgent;
        if (window.opener) {
            engine.ver =browser.ver = window.opera.version();
            engine.opera = browser.opera = parseFloat(engine.ver);
        }else if (/AppleWebKit\/(\S+)/.test(ua)) {
            engine.ver = RegExp["$1"];
            engine.webkit = parseFloat(engine.ver);
            //确定是Chrome还是Safari
            if (/Chrome\/(\S+)/.test(ua)) {
                browser.ver = RegExp["$1"];
                browser.chrome = parseFloat(browser.ver);
            }else{
                //近似地确定版本号
                var safariVersion = 1;
                if (engine.webkit < 100) {
                    safariVersion = 1;
                }else if (engine.webkit < 312) {
                    safariVersion = 1.2;
                }else if (engine.webkit < 412) {
                    safariVersion = 1.3;
                }else {
                    safariVersion = 2;
                }
                browser.safari = browser.ver = safariVersion;
            }
        }else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) {
            engine.ver = RegExp["$1"];
            engine.khtml = browser.konq = parseFloat(engine.ver);
        }else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) {
            engine.ver = RegExp["$1"];
            engine.khtml = browser.konq = parseFloat(browser.ver);
            //确定是不是Firefox
            if (/firefox\/(\S+)/.test(ua)) {
                browser.ver = RegExp["$1"];
                browser.firefox = parseFloat(browser.ver);
            }
        }else if (/MSIE ([^;]+)/.test(ua)) {
            engine.ver = browser.ver = RegExp["$1"];
            engine.ie = browser.ie = parseFloat(engine.ver);
        }
        if (client.engine.webkit){
            if(client.browser.chrome){
                alert("使用的浏览器是chrome")
            }else if(client.browser.safari){
                alert("浏览器是safari");
            }else if (client.engine.gecko){
                if (client.browser.firefox){
                    alert("浏览器是fir");
                }else {

                }
            }
        }
    </script>
</head>
<body>

</body>
</html>

总是出现Uncaught ReferenceError: engine is not defined;
为什么变量保存了调用函数后的值 engine 仍然是未定义的?

1个回答

qq_18128329
qq_18128329   2016.09.08 23:41
已采纳

首先,你声明了变量,是一个局部的变量,你让这个方法自调用了,并且 return 了出来,但是 你用一个变量 接住了这个return的值 如果想调用的话 需要 在调用的时候 增加 一个 client 来读取他的属性

修改后的代码 如下:

var client = function () {
var engine = {
//内核
ie: 0,
gecko: 0,
webkit: 0,
khtml:0,
opera:0,
//具体版本
ver: null
};
var browser = {
//浏览器
ie: 0,
firefox: 0,
safari: 0,
konq: 0,
opera: 0,
chrome: 0,
//具体的版本
ver: null
};
return {
engine: engine,
browser: browser
};
}();
var ua = navigator.userAgent;
if (window.opener) {
client.engine.ver =client.browser.ver = window.opera.version();
client.engine.opera = client.browser.opera = parseFloat(client.engine.ver);
}else if (/AppleWebKit\/(\S+)/.test(ua)) {
client.engine.ver = RegExp["$1"];
client.engine.webkit = parseFloat(client.engine.ver);
//确定是Chrome还是Safari
if (/Chrome\/(\S+)/.test(ua)) {
client.browser.ver = RegExp["$1"];
client.browser.chrome = parseFloat(client.browser.ver);
}else{
//近似地确定版本号
var safariVersion = 1;
if (engine.webkit < 100) {
safariVersion = 1;
}else if (engine.webkit < 312) {
safariVersion = 1.2;
}else if (engine.webkit < 412) {
safariVersion = 1.3;
}else {
safariVersion = 2;
}
client.browser.safari = client.browser.ver = safariVersion;
}
}else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) {
client.engine.ver = RegExp["$1"];
client.engine.khtml = client.browser.konq = parseFloat(client.engine.ver);
}else if (/rv:([^)]+)) Gecko\/\d{8}/.test(ua)) {
client.engine.ver = RegExp["$1"];
client.engine.khtml = client.browser.konq = parseFloat(client.browser.ver);
//确定是不是Firefox
if (/firefox\/(\S+)/.test(ua)) {
client.browser.ver = RegExp["$1"];
client.browser.firefox = parseFloat(client.browser.ver);
}
}else if (/MSIE ([^;]+)/.test(ua)) {
client.engine.ver = client.browser.ver = RegExp["$1"];
client.engine.ie = client.browser.ie = parseFloat(client.engine.ver);
}
if (client.engine.webkit){
if(client.browser.chrome){
alert("使用的浏览器是chrome")
}else if(client.browser.safari){
alert("浏览器是safari");
}else if (client.engine.gecko){
if (client.browser.firefox){
alert("浏览器是fir");
}else {

    }
  }
}

github_35883572
github_35883572 非常感谢
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
JavaScript传参时类型错误Uncaught ReferenceError js传递的参数未定义
上次写代码时碰到一个类型错误问题,在数据传参中浏览器报了以下这个错误: 一开始还以为是不能不能传递中文的原因,试验了英文结果也是一样的。 后来发现其实是在传参的过程中字符被当成是变量了,所以才会报出未定义的错误。 做了一个简单版的代码,有需要的朋友可以借鉴下<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">
android webview 加载js的方法时,有时候会报Uncaught ReferenceError的错误
android webview 加载js的方法时,有时候会报Uncaught ReferenceError的错误,但是看看自己的JSdai'a
JS报错 Uncaught ReferenceError: $ is not defined
Uncaught ReferenceError: $ is not defined
Android中和javascript交互报:android Uncaught ReferenceError:
可能原因如下:     1、HTML页面上的javascript写的有问题,可以先在HTML上调试排除语法等问题;     2、使用webView.loadUrl调用的时候字符串要拼写正确,尤其是传入参数时,格式可以如下:            webView.loadUrl("javascript:showData('"+json+"')");       3、调用的时候可能HTML页面
问题:aUl.getElementsByTagName("li")错误“Uncaught ReferenceError: getElementsByTagName is not defined”
element.getElementsByTagName()方法的操作对象是一个确定唯一的元素,一个页面具体元素对象,不允许是数组。
JS报错Uncaught ReferenceError: $ is not defined
在引用weui时遇到这个问题。 JS报错Uncaught ReferenceError: $ is not defined 要么是未导入jquery包,要么是导入的顺序不对。
Android JS桥交互
Android JS桥交互("Uncaught ReferenceError: xxx is not defined or xxx has no method")代码例子
javascript异常:ReferenceError: $ is not defined
在调试网页发现ReferenceError: $ is not defined 错误原因: 页面为引用jquery库文件javascript文件引用顺序不对,要保证库文件在最上方 总结:       html页面中js文件的引用有顺序之分,通常库文件放到最上方,其次以依赖程度排序
sha256.js:3 Uncaught ReferenceError: CryptoJS is not defined(…)
使用crypto-js加密时报错: sha256.js:3 Uncaught ReferenceError: CryptoJS is not defined(…)(anonymous function) @ sha256.js:3(anonymous function) @ sha256.js:179 aes.js:3 Uncaught ReferenceError: CryptoJS is n
js html元素内绑定点击事件 出现 js Uncaught ReferenceError :xxx is not defined
问题: 调用函数报错。原因:传值参数不是字符串,需转义。解决方法: onclick=&quot;yourFunc(\''+ json[i].username +'\')&quot; 附上代码:function() { //增加查看 上线完成            var ids = jQuery(grid_selector).jqGrid('getDataIDs');            for ( var i =...