2010-12-03 30 views
1

jScrollPane est un plugin jQuery génial qui modifie les barres de défilement du navigateur par défaut. Je développe une application de chat qui utilisera jScrollPane. Cela fonctionne très bien jusqu'à présent, sauf que je ne peux pas déterminer la hauteur de défilement maximale. Voici ce que j'essaie de faire:Comment obtenir la hauteur de défilement maximale dans jScrollPane?

$(function() 
{ 
    $('#chatPane').jScrollPane(); 
    var api = $('#chatPane').data('jsp'); 
    setInterval(function() 
    { 
     $.ajax(
     { 
      url: "Home/GetMessage", 
      type: "POST", 
      success: function (response) 
      { 
       // This next line is where the issue occurs. I need to check if the current scroll position is equal to the max scroll position. This is to implement the auto scroll if the user has scrolled to the bottom of the chat. 
       var atBottom = (api.getContentPane().getContentPositionY() == api.getContentPane().getMaxScrollHeight()??????); 
       api.getContentPane().append(response); 
       api.reinitialise(); 
       if (atBottom) 
        api.scrollToBottom(); 
      }, 
      error: function (xhr, textStatus, errorThrown) 
      { 
       alert(textStatus); 
      } 
     }); 
    }, 1000); 
}); 

getMaxScrollHeight n'existe pas. J'ai besoin d'un moyen de déterminer la hauteur de défilement max.

EDIT: Je l'ai eu pour travailler avec les modifications suivantes à la fonction de succès ajax. Mais si quelqu'un connaît un meilleur moyen que de faire défiler vers le bas, obtenir la position actuelle, puis revenir à la position précédente, il serait très apprécié.

  success: function (response) 
      { 
       var currentPosition = api.getContentPositionY(); 
       api.scrollToBottom(); 
       var maxPosition = api.getContentPositionY(); 
       api.scrollToY(currentPosition); 
       var atBottom = (currentPosition == maxPosition); 
       api.getContentPane().append(response); 
       api.reinitialise(); 
       if (atBottom) 
        api.scrollToBottom(); 
      } 

Répondre

1

Une solution que vous pourriez essayer est de simuler un scrollToBottom() puis comparer le résultat getContentPositionY() avec la valeur avant la simulation. Si cela n'a pas changé, alors l'utilisateur était déjà en bas, alors appelez scrollToBottom() "pour de vrai" après avoir ajouté le contenu de la réponse. Pour exécuter la simulation, vous pouvez essayer de cloner l'objet original, puis de le modifier en mémoire. Voir http://api.jquery.com/clone/ pour plus d'informations. Par exemple:

var simulatedPane = $('#chatPane').clone(); 
simulatedPane.jScrollPane(); 
var simulatedApi = simulatedPane.data('jsp'); 

Puis, dans la fonction succès(), utilisez simulatedApi pour la simulation.

+0

Une idée intéressante. Comment pourrais-je simuler un scrollToBottom() cependant, des idées? – Chev

+0

Je peux penser à deux façons: la première consiste à créer une copie Javascript en mémoire qui a les mêmes propriétés que l'objet réel sur la page, et exécuter les commandes sur elle. La seconde méthode consiste à stocker la position de défilement actuelle, à exécuter les commandes sur l'objet en direct, puis à restaurer la position de défilement précédente. Cela peut faire sauter l'interface utilisateur, vous devrez donc la tester pour voir si elle est utilisable. – ChessWhiz

+0

Le deuxième que je peux faire, mais je suis d'accord que cela provoquerait probablement un saut de l'interface utilisateur. Pourriez-vous mettre à jour votre réponse avec un exemple de code pour créer l'objet en mémoire? – Chev

1

Je vois que vous avez déjà une solution. Une autre approche pourrait consister à ajouter un écouteur pour l'événement jsp-scroll-y:

http://jscrollpane.kelvinluck.com/events.html

Cet écouteur est transmis des valeurs booléennes pour isAtTop et isAtBottom. Vous pouvez stocker ceci dans une variable et vérifier l'état de la variable avant de réinitialiser le scrollpane.

À plus long terme, ce serait génial si vous pouviez ajouter une demande de fonctionnalité d'ajouter quelques méthodes supplémentaires à l'API: isAtTop, isAtBottom, isAtLeft et isAtRight - si vous ajoutez cela à la github issues list alors je vais l'ajouter quand je reçois une chance.

+0

Cela a beaucoup plus de sens et n'est pas si «hacky». Je vais ajouter un écouteur pour cet événement. Aussi, je vais ajouter le problème à github comme vous l'avez demandé car ces propriétés seraient de formidables ajouts au plugin. – Chev

+0

On dirait que j'ai sauté l'arme sur celui-ci. Cela semble parfait mais ce n'est pas le cas. C'est très buggy. Chaque fois que vous ajoutez le conteneur que cet événement déclenche. J'ai essayé toutes sortes de choses mais la propriété isAtBottom ne semble pas très fiable. On dirait que je vais devoir rester avec le hack. C'était beaucoup moins de code de toute façon. Merci quand même! – Chev

+0

Désolé - il semble que les paramètres étaient le mauvais ordre dans la documentation! isAtBottom est le quatrième paramètre. S'il vous plaît voir cet exemple de travail - lorsque vous faites défiler vers le bas, il colle au fond: http://www.jsfiddle.net/vitch/NDFy6/ – vitch