通过javascript设置iframe的useragent

尝试满足的业务需求:在iframe中加载现有页面,模拟iphone用户代理。 这需要在客户端发生的原因是,有客户端脚本检测用户代理并将一些类附加到html元素上。 基于此,当CSS基于html类定位元素时,网站的样式将发生根本性的变化。

所以它需要把它变成或者在我试图解决的情况下等等。

使用window.open在chrome中工作(如本代码所示)。 该网站使用适当的移动样式呈现。

使用iframe可以工作,但只能在FF中使用。

理想情况下,我希望在Chrome和FF中使用iframe版本。

有什么想法吗?

 navigator.__defineGetter__('userAgent', function () { return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5'; }); var win = window.open('/home/get'); win.navigator.__defineGetter__('userAgent', function () { return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5'; }); win.location.href = '/home/get'; //required $(function () { var frame = $(''); frame.hide(); $('#container').append(frame); (frame[0].contentWindow || frame[0].contentDocument).navigator.__defineGetter__('userAgent', function () { return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5'; }); frame.attr('src', '/home/get'); }); frame.fadeIn(); });  

想出来,适用于FF,Chrome和IE。 我不确定Safari,因为我没有安装它。 它的概要是发出ajax请求,获取html,然后打开iframes文档。 打开它之后,然后覆盖其userAgent getter,然后编写从ajax调用中收到的html。

  $(function () { var frame = $(''); frame.hide(); $('#container').append(frame); var contentWindow = frame[0].contentWindow || frame[0].contentDocument; var setUA = function() { if (Object.defineProperty) { Object.defineProperty(contentWindow.navigator, 'userAgent', { configurable: true, get: function () { return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5'; } }); } else if (Object.prototype.__defineGetter__) { contentWindow.navigator.__defineGetter__('userAgent', function () { return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5'; }); } else { alert('browser not supported'); } }; $.ajax({ cache: false, url: '/home/get', success: function (html) { contentWindow.document.open(); setUA(); contentWindow.document.write(html); contentWindow.document.close(); frame.fadeIn(); } }); }); 

你不能用iframe做这样的事情。 用户代理与初始请求上的标头一起发送。

备择方案:

使用后端代理。 iframe实际上是从您自己的服务器加载页面,该服务器通过代理加载远程页面。 您可以设置您想要的任何标题。 这实际上只有在第三方站点不需要登录时才有效,因为您不想代理用户的会话。

如果远程站点支持CORS,您可以从页面执行XHR请求,该请求设置用户代理标头并获取页面内容。 然后,您可以将该代码添加到iframe中。 请注意此技术的严重安全问题。

我的建议,提出了不同的行动计划。