12
votes

Comment puis-je déclencher le menu contextuel du navigateur sur un élément. (Comme si l'utilisateur a cliqué sur le bouton droit de la souris)

J'ai la nécessité de déclencher l'ouverture du navigateur (c.-à-d. Firefox, safari, etc.) menu contextuel via JavaScript. Le problème que j'essaie de résoudre est quand un élément superposé a cliqué avec le bouton droit de la souris, l'élément ci-dessous indique son menu contextuel. Donc, si l'élément supérieur est une étiquette, lorsque vous cliquez avec le bouton droit de la souris, j'ai besoin d'afficher le menu contextuel de l'élément d'entrée ci-dessous.

Je sais comment conserver le menu contextuel de l'étiquette de l'affichage, mais je ne sais pas comment ouvrir un menu contextuel arbitrairement.

Toute aide est appréciée!


4 commentaires

Si j'étais à votre place, je n'essaierais pas de le pirater de cette façon. Je voudrais probablement comprendre pourquoi le menu contextuel de la boîte d'entrée s'affiche au lieu de l'étiquette. Pouvez-vous fournir plus de détails?


Désolé, il suffit de l'avoir supprimé après avoir lu la question.


Vous pouvez voir mon plugin ici: FuelyourCoding.com/scripts/infield et essayer de cliquer avec le bouton droit de la souris sur la "Contenu" du champ de texte. Si je ne peux pas déclencher le menu contextuel du navigateur, il fait que ce plugin est utilisé quelque peu limité.


... Eh bien, je n'ai pas remarqué un problème, alors ... quelle était la réponse à la fin?


3 Réponses :


17
votes

Désolé d'être le porteur de nouvelles malheureuses, mais cela est impossible à faire avec JavaScript.


2 commentaires

J'espérais que ce n'était pas la réponse. Aller le laisser ouvrir un peu plus longtemps ... Juste au cas où. :)


Oui, je le laisserais ouvert si j'étais toi.



3
votes

Je ne veux pas vous frustrer, au contraire, surtout parce que vous avez répondu à ma propre question :)

Je ne pense pas que le menu contexteur d'un navigateur est accessible via un script ordinaire sur une page Web.

Si ce que vous demandez était réellement faisable, les fabricants de navigateurs considéreraient éventuellement cela un bogue et supprimerais ce comportement. Navigateur croisé, ce comportement est très peu susceptible d'être disponible aujourd'hui.

Pourquoi ne capturez-vous pas les événements de la souris et chaque fois que la souris est directement dans la zone de l'élément ci-dessous que vous souhaitez afficher le menu contextuel pour, appuyez sur l'élément de recouvrement ci-dessous, sinon Retour sur le dessus?

C'est une possibilité que je pouvais penser, révélant / exposant essentiellement l'élément caché en fonction de la position de la souris. Comme couper un trou dans la superposition.

ou pourquoi ne faites-vous pas le champ de texte transparent et placez la superposition sous le champ de texte entièrement?

Si cela ne fonctionne pas techniquement, vous avez au moins un point dans le dépôt des bogues ou des améliorations contre les navigateurs ciblés.

BTW On dirait que le menu contextuel fonctionne réellement si l'utilisateur clique sur le bouton droit de la souris sur la position du caret, il peut donc s'agir d'une autre échappatoire pour que vous envisagez.


1 commentaires

Toutes les très bonnes pensées. Je pense que sur la nouvelle version Je vais ajouter une assistance pour montrer l'étiquette ci-dessous l'élément de saisie, car cela résoudra le problème. Cela signifie simplement que l'élément d'emballage doit fournir la couleur d'arrière-plan de l'élément d'entrée ou de la textarea. Devrait travailler cependant!



2
votes

J'ai une solution possible qui pourrait répondre à vos besoins. Ce n'est pas encore parfait, je n'ai fait que quelques tests rapides dans quelques navigateurs (Fox 3.6, IE7, IE8, Chrome 4, Safari 3 sur XP) Il devra être modifié et amélioré, mais c'est un début. Fondamentalement, l'idée est de supprimer l'étiquette sur le clic droit Mousedown de sorte que le champ souhaité soit touché par l'événement de la MouseUp et incendie donc le menu contextuel sur le champ pertinent.

// Remove the contextmenu from "In-Field" Labels
base.$label.bind("contextmenu",function(e){
    return false;
}); 

// Detect right click on "In-Field" label:
// hide label on mousedown so mouseup will target the field underneath.
base.$label.mousedown(function(e){          
    if ( e.which == 3 ){
        var elLbl = $(this); 
        elLbl.hide();
        var elFid = $(this).attr("for");
        // bind blur event to replace the label when we are done.
        $("#" + elFid ).bind("blur.infieldlabel",function(){                    
            elLbl.show();
            $("#" + elFid ).unbind("blur.infieldlabel");                    
        });             
        return false;
    }
}); 


0 commentaires