2013-01-09 42 views
2

業務要求努力設置iframe的用戶代理,以滿足:在iframe中加載的現有頁面,模仿iPhone手機的用戶代理。這需要發生客戶端的原因是,有客戶端腳本它檢測用戶代理並將一些類附加到html元素。基於此,CSS的目標是基於html類的元素,網站的風格將會發生根本性的變化。通過javascript

所以它會採取並把它變成或在我試圖鉻內這裏等

使用window.open作品(如證明這個代碼)解決的情況下。該網站呈現適當的移動樣式。

使用iframe的作品,但只有在FF。

理想情況下,我想有iframe的版本在Chrome和FF工作。

有什麼想法?

<script type="text/javascript"> 


     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 = $('<iframe width="320" height="480"></iframe>'); 
      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(); 
     }); 
    </script> 

回答

2

想通了,適用於FF,Chrome和IE。我對Safari沒有把握,因爲我沒有安裝它。它的概要是做一個ajax請求,獲取html,然後打開iframes文檔。 AFTER你打開它,然後你重寫它的userAgent getter,然後寫你從ajax調用收到的html。

 $(function() { 
     var frame = $('<iframe width="320" height="480"></iframe>'); 
     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(); 
      } 
     }); 
    }); 
0

你不能用iframe做這樣的事情。用戶代理在初始請求時與標題一起發送。

替代品:

使用後端代理。 iframe實際上是從您自己的服務器加載頁面,該服務器通過代理加載遠程頁面。你可以設置任何你想要的標題。這真的只適用於第三方網站不需要登錄的情況,因爲你不想代理用戶的會話。

如果遠程站點支持CORS,你可以做您的頁面的XHR請求,設置用戶代理頭和回來頁的內容。然後,您可以將該代碼添加到iframe中。謹防這種技術存在嚴重的安全問題。

我的建議,拿出行動不同的計劃。

+0

1)我已經實現了一個通過c#webclient請求處理任何UA字符串的代理。然而,這不利於客戶端需求,這需要使用瀏覽器用戶代理。 2)我不能通過xhr(到我自己的代理頁面)來完成,因爲再次,最終的客戶端腳本將針對當前的瀏覽器用戶代理運行。 3)它在FF中工作。我想知道是否有人在Chrome中完成此操作。 – Mike

+0

有趣。你可以設置一個jsfiddle到目前爲止你有什麼?可能確實能夠找到答案。 – Geuis