J'utilise la boîte de dialogue jQuery UI avec modal=true
. Dans Chrome et Safari, cela désactive le défilement via la barre de défilement et les touches du curseur (le défilement avec la molette de la souris et la page vers le haut/le bas fonctionnent toujours).
C'est un problème si la boîte de dialogue est trop grande pour tenir sur une page - les utilisateurs d'un ordinateur portable sont frustrés.
Quelqu'un a soulevé cette question il y a trois mois sur le traqueur de bogues jQuery - http://dev.jqueryui.com/ticket/4671 - il ne semble pas que la correction soit une priorité. :)
Ainsi fait n'importe qui:
J'expérimente mouseover/scrollto sur des morceaux de la forme, mais ce n'est pas une bonne solution :(
EDIT: remerciements à Rowan Beentje (qui n'est pas sur SO afaict) pour trouver une solution à ce problème. L'interface utilisateur de jQuery empêche le défilement en capturant les événements mouseup/mousedown. Donc, le code ci-dessous semble résoudre ce problème:
$("dialogId").dialog({
open: function(event, ui) {
window.setTimeout(function() {
jQuery(document).unbind('mousedown.dialog-overlay')
.unbind('mouseup.dialog-overlay');
}, 100);
},
modal: true
});
À utiliser à mes risques et périls, je ne sais pas ce qu'un autre comportement non modal qui permettrait de lier ces éléments pourrait permettre.
Je suis d'accord avec les affiches précédentes en ce sens que si le dialogue ne fonctionne pas pour vous, il peut être bon de repenser votre conception. Cependant, je peux offrir une suggestion.
Pourriez-vous mettre le contenu de la boîte de dialogue dans un div à défilement? De cette façon, au lieu que toute la page ait besoin de défiler, seul le contenu de la div doit défiler. Cette solution de contournement devrait être assez facile à accomplir aussi.
Vous pouvez utiliser ce code: jquery.ui.dialog.patch.js
Cela a résolu le problème pour moi. J'espère que c'est la solution que vous recherchez.
Je pallie cette situation en désactivant le mode modal de la boîte de dialogue et en affichant la superposition manuellement:
function showPopup()
{
//...
// actionContainer - is a DIV for dialog
if ($.browser.safari == true)
{
// disable modal mode
$("#actionContainer").dialog('option', 'modal', false);
// show overlay div manually
var tempDiv = $("<div id='tempOverlayDiv'></div>");
tempDiv.css("background-color", "#000");
tempDiv.css("opacity", "0.2");
tempDiv.css("position", "absolute");
tempDiv.css("left", 0);
tempDiv.css("top", 0);
tempDiv.css("width", $(document).width());
tempDiv.css("height", $(document).height());
$("body").append(tempDiv);
}
// remove overlay div on dialog close
$("#actionContainer").bind('dialogclose', function(event, ui) {
$("#tempOverlayDiv").remove();
});
//...
}
Bien que je sois d’accord avec le fait que les membres du parti ne font pas un dialogue plus grand que la fenêtre de visualisation, je pense qu’il peut arriver que le défilement soit nécessaire. Une boîte de dialogue peut sembler très belle dans une résolution supérieure à 1024 x 768, mais tout ce qui est moins a l’air craqué. Ou, par exemple, vous ne voulez jamais qu'une boîte de dialogue apparaisse sur l'en-tête de votre site. Dans mon cas, j'ai des annonces qui ont parfois des problèmes d'index z-index, je ne veux donc jamais que les boîtes de dialogue s'affichent au-dessus d'elles. Enfin, il est mauvais en général d’enlever toute sorte de contrôle commun, tel que le défilement, à l’utilisateur. C'est un problème distinct de la taille du dialogue.
Je serais intéressé de savoir pourquoi les événements Mousedown et Mouseup sont là en premier lieu.
J'ai essayé la solution fournie par alexis.kennedy et elle fonctionne sans casser tout ce que je peux voir dans aucun navigateur.
Je pense qu'avoir trop de dialogues va à l'encontre de votre exigence de "bonne expérience de la convivialité". Même si vous n'aviez pas besoin d'une solution de contournement en raison du bogue jQuery UI Dialog, je me débarrasserais de ces gros dialogues. Quoi qu'il en soit, je comprends qu'il peut y avoir des cas "extrêmes" dans lesquels vous devez vous adapter, alors ...
Cela dit, il serait certainement utile d’ajouter une capture d’écran. Vous posez une question sur un dessin, mais nous ne le voyons pas. Mais je comprends que vous ne pourrez peut-être pas/ne voudriez pas en montrer le contenu, alors ça va. Ce sont mes aveugles devinons; espérons que vous les trouverez utiles:
Sans pouvoir voir le design, je suppose que c'est aussi loin que je peux aller.
C'est un bug qui a été corrigé depuis: http://bugs.jqueryui.com/ticket/4671
Il existe une solution de contournement qui dissocie l'événement lié. Ceci ajoute ce qui suit dans l'événement open: de la boîte de dialogue:
$("#longdialog").dialog({
modal:true,
open: function (event, ui) { window.setTimeout(function () {
jQuery(document).unbind('mousedown.dialog-overlay').unbind('mouseup.dialog-overlay'); }, 100);
}
});
Cela fonctionne ... mais c'est moche
--from https://github.com/jquery/jquery-ui/pull/230#issuecomment-3630449
Travaillé comme un charme dans mon cas.
Utilisez le code ci-dessous. Cela fonctionnera bien.
$("dialogId").dialog({
open: function(event, ui) {
window.setTimeout(function() {
jQuery(document).unbind('mousedown.dialog-overlay')
.unbind('mouseup.dialog-overlay');
}, 100);
},
modal: true,
safariBrowser: (function( $, undefined ) {
if ($.ui && $.ui.dialog) {
$.ui.dialog.overlay.events = $.map('focus,keydown,keypress'.split(','), function(event) { return event + '.dialog-overlay'; }).join(' ');
}
}(jQuery))
});
Avez-vous essayé mon extension au dialogue? http://plugins.jquery.com/project/jquery-framedialog