2012-02-25 59 views
0

我正在使用響應式設計技術來主題化一個新網站,而且大多數情況下都使用CSS Media Queries,而且這種方法非常有效。然而,在某些情況下,我需要得到瀏覽器的寬度和我這樣做,通過與這個漂亮位FO JQuery的添加<html>類:抓取一個body類元素並將其變成一個PHP變量

(function($) { 
     //add drupal 7 specific code 
     Drupal.behaviors.getWidthTheme = { 
      attach: function(context, settings) { 
       //end drupal calls 

var w, html = $('html'), _window = $(window); 
_window.resize(onResize); 
function onResize() { 
w = _window.width(); 
if (w >= 310 && w < 480) html.addClass('mobile-320').removeClass('mobile-768').removeClass('desktop').removeClass('mobile-480'); 
else if (w >= 481 && w < 768) html.addClass('mobile-480').removeClass('mobile-768').removeClass('desktop').removeClass('mobile-320'); 
else if (w >= 768 && w < 960) html.addClass('mobile-768').removeClass('mobile-480').removeClass('desktop').removeClass('mobile-320'); 
else html.addClass('desktop').removeClass('mobile-480').removeClass('mobile-768').removeClass('mobile-320'); 
       } 
onResize(); 

      }}})(jQuery); 

上面的代碼注入一個類進<html>元件,例如<html class="mobile-320">等...取決於瀏覽器或設備的寬度。

我想要做的就是抓住這個類並以某種方式將它轉換成一個PHP變量,這樣我就可以關閉一些代碼。理想情況是這樣的:

<?php if ($mobile-320): ?> 
<!--do something--> 
<?php else : ?> 

<?php if ($mobile-480 || $mobile-768 || $desktop): ?> 
<!-- do some other thing --> 
<?php endif; ?> 

理想情況下,這些類是從已呈現的HTML類中抓取的。但是,我不確定這可以工作,因爲PHP需要在服務器上呈現,而我通過JQuery注入HTML類。我基本上對任何這樣做都是開放的,而不是放在我上面的東西上,但希望你能明白。

+0

我不認爲你會找到一個簡單的解決方法,除非使用ajax在頁面加載完成後調用此代碼,或者讓一個登錄頁面有一個設置了JS的cookie,然後轉發之後再到現場。什麼是你想避免運行的代碼? – BenOfTheNorth 2012-02-25 00:17:50

+0

@BenGriffiths - 我有代碼在if - else中的php塊,如果它是一個寬度,我想顯示一個塊,但是如果它是所有其他寬度,我想顯示另一個塊。當然,我可以使用現有的類來簡單地爲一個或另一個塊執行「display:none」,但問題在於所有代碼仍需要加載,我試圖使這種移動設備變得輕量級。我認爲你是正確的,但這並不簡單。 – 2012-02-25 01:35:02

+0

不要忘了PHP是服務器端的,所以除非你的網絡應用速度很慢,否則它對速度的影響應該與最終用戶無關,無論他們是移動客戶端還是臺式機。如果真的有那麼多問題,我會考慮製作一個專門的移動網站,而不是嘗試一種響應式的方法。 – BenOfTheNorth 2012-02-25 09:13:21

回答

1

我不太清楚我的理解,但也許你可以引發另一個Ajax請求,發送剛插入的類的名字。 PHP的響應可能是json-data來控制接下來需要執行的操作,或者直接使用html/javascript。這將有助於看到更多的HTML/JavaScript。

$.getJSON('getDeviceActions.php', 
    { className: $('html').attr('class') }, 
    function(phpResult){ 
    if(phpResult.switchOffA == true) $('.divsel').hide(); //or what not 
    } 
}); 

爲什麼你不能做你的switch語句直接在JavaScript中,不求回報的服務器,它是什麼要與事後的信息呢?

+0

mindandmedia - 我不能用Javascript做開關,因爲有動態PHP需要在if-else內執行。我越想這件事,就越覺得我採取了錯誤的做法。 – 2012-02-25 01:40:24

1

你可以把所有類的數組,並傳遞data該數組:

var classes = $('html').attr('class').match(/\w+/g); 
$.ajax({ 
    type: 'post', 
    url: 'url.php', 
    data: { 
     classes: classes 
    } 
    success: function() { 
     // Blabla 
    } 
}); 

順便說一句,你的代碼的第一塊可以,如果你只有這些類中$('html')減少:

if (w >= 310 && w < 480) { html.removeClass().addClass('mobile-320'); } 
相關問題