2010-06-24 4 views
1

Si je fais glisser un objet très lentement, il fait exactement ce que je veux qu'il fasse. Cependant, si je le fais un peu plus vite ou très vite, cela ne fonctionne pas comme prévu. Vous pouvez voir les deux résultats: l'attendu, tout en traînant lentement et l'impeccable, en faisant glisser rapidement. Je suis juste un débutant jquery, si vous voyez d'autres parties stupides du code JS, s'il vous plaît faites le moi savoir. L'objet en mouvement en arrière-plan (tout en faisant glisser l'objet déplaçable) devrait revenir à sa position initiale à chaque fois qu'il est éloigné de 20 mètres du porte-carte. Il ne le fait pas lorsqu'il est déplacé rapidement, il fait, cependant, quand draggin le déclencheur ralentit.jquery dragging object fast problem

L'exemple en direct: http://jsbin.com/egeki3

P.S. directions haut glisser/bas seulement

La partie JS uniquement (en utilisant jQuery UI)

$().ready(function(){ 
// map measurments 
var mapWidth = parseInt($('#map').width()); 
var mapHeight = parseInt($('#map').height()); 

var fragmentH = 20; 
var fragmentW = 20; 

// number of map fragments to use 
var mapBlocksH = Math.ceil(mapHeight/fragmentH)+2; 
var mapBlocksW = Math.ceil(mapWidth/fragmentW)+2; 

// the area size of map fragments displacement 
var mapH = mapBlocksH*fragmentH; 
var mapW = mapBlocksW*fragmentW; 

// calculate the maps fragments wrapper position, dimension 
$('#map div.map, div.drag').css({height: mapH, width: mapW, left: (mapWidth-mapW)/2, top: (mapHeight-mapH)/2}); 

for(i = 0; i < mapBlocksH*mapBlocksW; i++) 
{ 
    $('#map div.map').append('<div></div>'); 
} 

$('#map div.drag').draggable({ 
    revert: true, 
    revertDuration: 0, 
    addClasses: false, 
    start : function(event, ui){ 
    mapOriginalOffset = $('#map div.map').offset(); 
    //mapOriginalOffset2 = $('#map div.map').offset(); 
    }, 
    drag : function(event, ui){ 
    $('#map div.map').offset({top: mapOriginalOffset.top + (ui.originalPosition.top-ui.position.top)}); 

    if(Math.abs($('#map div.map').offset().top-$('#map').offset().top) % fragmentH == 0) 
    { 
    $('#map div.map').offset({top: mapOriginalOffset.top}); 

    return false; 
    //$('#map div.map').offset({top: mapOriginalOffset.top}); 

    //mapOriginalOffset2.top = $('#map div.drag').offset().top; 
    } 
    }, 
    stop : function(event, ui){ 
    } 
}); 
+2

Juste une note de côté, '$(). Ready (function() {' est obsolète, vous devez utiliser '$ (function() {' ou '$ (document) .ready (function() {' :) –

+0

Merci, corrigé dans le code original – Gajus

Répondre

1

Lorsque vous faites glisser un objet, l'objet ne prend pas toute la mesure du possible, mais sauter un certain pixel.

I log la position de .top, et la valeur sont 8, 11, 18, 27, il est rare que la condition

Math.abs($('#map div.map').offset().top-$('#map').offset().top) % fragmentH == 0 

est vrai.

Pour votre cas, il est préférable d'avoir quelque chose comme

Math.abs($('#map div.map').offset().top-$('#map').offset().top) >= fragmentH 

Il ne dépend que de ce que vous voulez faire exactement, mais ne pas utiliser modulo avec traînage arithmétique de pixels &, mauvaise idée!

+0

Je comprends que jquery ne connecte pas toutes les positions lorsque vous faites glisser rapidement, c'est exactement le problème que j'essaie de résoudre et votre solution n'est pas bonne pour moi. Moment EXACT lorsque Math.abs ($ ('# map div.map'). Offset(). Top - $ ('# map'). Offset(). Top)% fragmentH == 0 est VRAI. – Gajus

+0

Essayez d'expliquer pourquoi vous avez besoin de cette condition exacte, et nous allons essayer de trouver une solution –

+0

Je fais un peu un prototype de Google maps.Je en ai besoin pour visualiser des cartes locales et j'en ai besoin pour ru n sur jQuery. Fondamentalement, l'idée est la suivante: lorsque la zone des cases de couleur s'éloigne de plus de 20 pixels (la taille du fragment de la carte), la zone d'affichage de la carte doit revenir à la position primaire et ne modifier que les images d'arrière-plan. – Gajus