2013-03-31 7 views
9

Ich möchte ein bestimmtes jQuery-Skript/Funktion in Desktop-Browsern laden, aber nicht mobile Browser. Im Moment läuft das Skript in mobilen Browsern sehr langsam, funktioniert aber auf Desktop-Browsern gut.Laden Sie jQuery-Skript in Desktop-Browser, aber nicht mobil

Bei der fraglichen Funktion handelt es sich um ein reibungsloses Scrolling-Plugin. Wenn ein Benutzer auf einen Link klickt, scrollt die Seite nahtlos zum Anker auf derselben Seite. Es ist nicht erforderlich, dass es in mobilen Browsern problemlos gescrollt wird - es ist zu langsam und funktioniert oft nicht.

Was müsste ich meinem unten stehenden Code hinzufügen, um sicherzustellen, dass er in Desktop-Browsern weiterhin ausgeführt wird, aber nicht auf Mobilgeräten (insbesondere iPad/iPhone/iPod)?

<script>!window.jQuery && document.write(unescape('%3Cscript src="js/lib/jquery/jquery.js"%3E%3C/script%3E'));</script>  
<script src="js/css_browser_selector.js"></script> 
<script src="js/src/jquery.smooth-scroll.js">  
</script> 
<script src="js/lib/jquery.ba-bbq.js"></script> 
<script> 
$(document).ready(function() { 
    $('a[href*="#"]').live('click', function() { 
    if (this.hash) { 
     $.bbq.pushState('#/' + this.hash.slice(1)); 
     return false; 
    } 
    }); 

    $(window).bind('hashchange', function(event) { 
    var tgt = location.hash.replace(/^#\/?/,''); 
    if (document.getElementById(tgt)) { 
     $.smoothScroll({scrollTarget: '#' + tgt}); 
    } 
    }); 

    $(window).trigger('hashchange'); 
}); 
</script> 
+0

es anstelle von Client auf dem Server zu tun. Suchen Sie nach dem Benutzeragenten und entscheiden Sie, ob Sie ein Skript hinzufügen möchten oder nicht. – SachinGutte

+0

http://stackoverflow.com/questions/11381673/javascript-solution-to-detect-mobile-browser – Klaasvaak

Antwort

11

jsFiddle Demo

Blick für die Existenz von touch, wenn es nicht vorhanden ist, dann ist es mehr als wahrscheinlich, mit einem Desktop zu tun:

bearbeiten: meine ursprüngliche try/catch Ansatz wurde anscheinend veraltet (https://stackoverflow.com/a/4819886/1026459)

$(document).ready(function() { 
var isDesktop = (function() { 
    return !('ontouchstart' in window) // works on most browsers 
    || !('onmsgesturechange' in window); // works on ie10 
})(); 
//edit, if you want to use this variable outside of this closure, or later use this: 
window.isDesktop = isDesktop; 
if(isDesktop){ /* desktop things */ } 
}); 
+0

Travis - danke für deine Antwort! Ich habe nur eine weitere Abfrage. Ich habe den Code eingefügt, in dem du die/* Desktop-Sachen */Kommentar geschrieben hast, aber leider funktioniert es jetzt nicht auf dem Desktop. Gibt es etwas, das ich hinzufügen/weglassen sollte, damit es richtig funktioniert? – rossautomatica

+0

@rossautomatica - Es muss ein anderer Aspekt Ihres Codes sein. Versuchen Sie zu sehen, ob diese jsfiddle für Sie warnt: http://jsfiddle.net/vEdzG/. Wenn ja, hast du den Umfang geändert? Es ist schwer zu wissen, was sich geändert hat, ohne den Code zu sehen. Wenn Sie versuchen, außerhalb der Sperrung darauf zuzugreifen, haben Sie möglicherweise keinen Spielraum für die Variable "isDesktop". Sie können es immer an den globalen Namespace anhängen (siehe Bearbeiten). –

+0

Das alles scheint jetzt gut zu funktionieren - ich habe den $ (document) .ready (function() - Teil des Codes, der in meinem ursprünglichen Skript vorhanden war, nicht hinzugefügt. Ich habe das hinzugefügt, und alles scheint wie beabsichtigt zu funktionieren sowohl Desktop als auch Mobil. Nochmals vielen Dank! – rossautomatica

4

Sie können entweder versuchen, den Benutzeragenten abzurufen, und anhand dieser Informationen entscheiden, ob Sie das Skript für den reibungslosen Scrollvorgang einfügen möchten. Eine andere Lösung wäre, nach der Browserbreite zu suchen und dann zu entscheiden, ob Sie das Skript einfügen möchten oder nicht.

<script> 
(function ($) { 
    if(is_touch_device()) { 
     $.when(
     $.getScript("/mypath/myscript1.js"), 
     $.getScript("/mypath/myscript2.js"), 
     $.getScript("/mypath/myscript3.js"), 
     $.Deferred(function(deferred){ 
      $(deferred.resolve); 
     }) 
    ).done(function(){ 
      //place your code here, the scripts are all loaded 
     }); 
    } 
})(jQuery); 
</script> 

when() Verwendung erfordert jQuery 1,5 oder höher, getScript() in 1.0 aufgenommen.

BEARBEITEN als Travis angegeben, Sie könnten auch nach dem Touch-Ereignis suchen. In diesem Fall sollten Sie verwenden:

function is_touch_device() { 
    return !!('ontouchstart' in window) // works on most browsers 
     || !!('onmsgesturechange' in window); // works on ie10 
}; 

Snippet oben aus dem zweiten SO hier beantworten: What's the best way to detect a 'touch screen' device using JavaScript?

+0

Danke für Ihre Antwort. Würde das auch für mehrere .js-Dateien funktionieren? – rossautomatica

+0

Ja, das würde auch für mehrere .js-Dateien funktionieren. Fügen Sie einfach die JS-Dateien hinzu, die nach Ihrer Bedingung eingefügt werden sollen (touch/browser width/browser agent) ist wahr –

+0

Ich habe meine Antwort aktualisiert, um zu zeigen, wie Sie mehrere Javascript-Dateien hinzufügen können, wenn Sie Javascript nach dem Laden ausführen müssen, setzen Sie es einfach in die done() -Funktion. –

Verwandte Themen