当前位置:  开发笔记 > 编程语言 > 正文

在javascript中嘲笑一个useragent?

如何解决《在javascript中嘲笑一个useragent?》经验,为你挑选了4个好方法。

我正在寻找一种以编程方式动态更改navigator.userAgent的方法.在我尝试获得自动javascript单元测试器失败的尝试中,我放弃并试图开始使用fireunit.我立即猛烈抨击了使用实际浏览器进行javascript测试的一面墙.

具体来说,我需要更改navigator.userAgent来模拟几百个userAgent字符串,以确保对给定函数的正确检测和覆盖.navigator.userAgent只读,所以我好像卡住了!我怎么能模拟navigator.userAgent?用户代理切换器(插件)可以切换FF的useragent,但我可以在javascript中执行吗?



1> Crescent Fre..:

尝试:

navigator.__defineGetter__('userAgent', function(){
    return 'foo' // customized user agent
});

navigator.userAgent; // 'foo'

在FF2和FF3中尝试过.


这个解决方案可以用来设置iframe的用户代理吗?
不推荐使用`__defineGetter__`,而是使用`defineProperty`.检查我的答案如下.

2> maxyfc..:

添加到Crescent Fresh的解决方案,重新定义navigator.userAgentgetter似乎在Safari 5.0.5中不起作用(在Windows 7和Mac OS X 10.6.7上).

需要创建一个从对象继承的新对象,navigator并定义一个新的userAgentgetter来隐藏原始的userAgentgetter navigator:

var __originalNavigator = navigator;
navigator = new Object();
navigator.__proto__ = __originalNavigator;
navigator.__defineGetter__('userAgent', function () { return 'Custom'; });


这也适用于phantomjs ...需要新的Object.我猜它是一个webkit的东西.

3> Joel Richard..:

以下解决方案适用于Chrome,Firefox,Safari,IE9 +以及iframe:

function setUserAgent(window, userAgent) {
    if (window.navigator.userAgent != userAgent) {
        var userAgentProp = { get: function () { return userAgent; } };
        try {
            Object.defineProperty(window.navigator, 'userAgent', userAgentProp);
        } catch (e) {
            window.navigator = Object.create(navigator, {
                userAgent: userAgentProp
            });
        }
    }
}

例子:

setUserAgent(window, 'new user agent');
setUserAgent(document.querySelector('iframe').contentWindow, 'new user agent');



4> Bundyo..:

使用Object.defineProperty应该添加几个浏览器:

if (navigator.__defineGetter__) {
    navigator.__defineGetter__("userAgent", function () { 
        return "ua"; 
    });
} else if (Object.defineProperty) { 
    Object.defineProperty(navigator, "userAgent", { 
        get: function () { 
            return "ua";
        }
    });
}

此代码应该工作(和测试)的火狐1.5 +,Chrome浏览器6+,歌剧10.5+IE9 +.不幸的是,任何平台上的Safari都不允许更改userAgent.

编辑:Safari不允许更改userAgent,但可以替换整个导航器对象,如上面的另一个解决方案所述.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有