php.de

Zurück   php.de > Webentwicklung > JavaScript, Ajax und mehr

JavaScript, Ajax und mehr dynamisches Scripten und Interaktion auf Clientebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.08.2011, 15:46  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard jQuery Context Menu Plugin mit dynamischem Menü

Hi,

ich hab jetzt das dritte Context Menu Plugin für jQuery ausprobiert und scheinbar kann keines dynamische Kontextmenüs:

Sprich, erst wenn ich auf ein Objekt klicke, soll das Kontextmenü erzeugt werden, da es je nach Zustand unterschiedliche Kontextmenüpunkte erzeugen soll. Einfaches Beispiel:

Rechtsklick auf Tabellenzelle (<td>): Kontextmenüpunkt "Markieren" soll CSS-Klasse im <td> setzen. Wenn nun noch einmal die Tabellenzelle angeklickt wird, muss ein andere Kontextmenü erscheinen, dass "Markierung aufheben" anzeigt. Alles in allem ein Live-HTML-Tabelleneditor.

Kann mir da jemand eins empfehlen?
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.08.2011, 02:00  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 2.094
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard

Du könntest, sofern du jqueryui widget core 1.9 einsetzen kannst, mein contextmenu plugin verwenden.
Angescribbelt - nach dem Instanzieren- kannst du dich im before event einklinken:
PHP-Code:
$('td').contextmenubefore = function ( evui ) {
        var 
$this = $( this );
        
// ui.active ist dein menulayer, falls du da drauf zugreifen möchtest
        
if( $this.hasClass'foo' ) ) {
            
$this.contextmenu"option""menu", $( '#menuselector1' ) )
        } else {
            
$this.contextmenu"option""menu", $( '#menuselector2' ) )
        }
    }
}); 
Die Demo/Mini Doku findest du hier. Falls du noch Hilfe brauchst/ irgendwas vermisst, gib Bescheid.

Github link

Grüße


Basti
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog

Geändert von rudygotya (31.08.2011 um 09:36 Uhr). Grund: man, war das spät ;)
rudygotya ist offline   Mit Zitat antworten
Alt 31.08.2011, 12:46  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hi hi,
ich hab mir jetzt selbst eins geschrieben, gibt ja mit bind("contextmenu") schon nen Event dafür.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 31.08.2011, 13:50  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 2.094
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard

kein problem darf man den Code sehen oder ist das closed source? bin neugierig
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist offline   Mit Zitat antworten
Alt 01.09.2011, 11:38  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Gaanz basic, noch nicht konfigurierbar.

Code:
$(function() {
    $.fn.contextMenu = function(config) {
        // config:
        var customConfig = config || {};
        var config = {
            "click": function(node, event, itemList) {
                return itemList;
            }
        };
        $.extend(config, customConfig);
        
        // custom functionality:
        var helper = {
            debug: function() {
                console.log(arguments);
            },
            
            clone: function(source) {
                for (var i in source) {
                    if (typeof source[i] == "source") {
                        this[i] = new helper.clone(source[i]);
                    } else {
                        this[i] = source[i];
                    }
                }
            }
        };
        
        // context menu event:
        $(this).bind("contextmenu", function(event, customEvent) {
            var thisJ = $(this);
            var pageX = event.pageX || customEvent.pageX;
            var pageY = event.pageY || customEvent.pageY;
            var itemList = config.click(this, event, itemList);
            if (typeof itemList != "object" && !itemList) {
                return false;
            }
            $("body > div.context-menu").remove();
            
            var divJ = $("<div><ul></ul></div>");
            divJ.addClass("context-menu");
            divJ.css({
                "position": "absolute",
                "left":     (pageX - 5) + "px",
                "top":      (pageY - 5) + "px"
            });
            var ulJ = divJ.find("ul"), liJ, item, itemCustom;
            ulJ.addClass("context-menu-item-list");
            $.each(itemList, function () {
                var liJ = $("<li></li>");
                liJ.addClass("context-menu-item");
                var item = {
                    "label": "undefined",
                    "click": function(event, node) {
                        debug("context-menu: not yet implemented", event, node);
                    },
                    "disabled": false,
                    "html": false,
                    "css": {}
                };
                itemCustom = this || {};
                $.extend(item, itemCustom);
                
                // item text
                if (item.html) {
                    liJ.html(item.label);
                } else {
                    liJ.text(item.label);
                }
                // item disabled
                if (item.disabled) {
                    liJ.addClass("disabled");
                } else {
                    // item click
                    liJ.bind("click", function(event) {
                        item.click(event, thisJ);
                        //thisJ.trigger("contextmenu", [{pageX: pageX, pageY: pageY}]);
                        divJ.remove();
                        return false;
                    });
                }
                liJ.css(item.css);
                
                ulJ.append(liJ);
            });
            ulJ.find("> li:first").addClass("first");
            ulJ.find("> li:last").addClass("last");
            $("body").append(divJ);
            ulJ.bind("mouseleave", function() {
                setTimeout(function() {
                    divJ.remove();
                }, 500);
            });
            return false;
        });
    };
});
Verbesserungsvorschläge sind aber immer willkommen.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 03.09.2011, 11:14  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 2.094
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard

Hi Chris,


sorry für die späte Antwort. Du solltest auf jeden fall this zurückgeben, da jeder, der das Plugin nicht kennt, erwarten würde, dass er chainen kann.

PHP-Code:
$.fn.contextmenu = function () {
    return 
this.each( function () {});

Die defaults würde ich direkt an die Function $.fn.contextmenu ranhängen, damit sind sie exponiert:
PHP-Code:
$.fn.contextmenu.defaults = {
  
"click": function(nodeeventitemList) { return itemList; }

Damit kannst du jederzeit von außerhalb die Default-Pluginoptions setzen. Du erweiterst dann auf die Art:
PHP-Code:
$.fn.contextmenu = function ( ) {
    
this.options = $.extend( {}, $.fn.contextmenu.defaults)


Aus dem Helper:
PHP-Code:
if (typeof source[i] == "source") { 
Das typeof "source" zurückgibt, wär mir neu (wobei ich nicht gesehen hätte, dass du den Helper instanzierst, von dem her ists wurscht).

Eine Kleinigkeit noch:
Das Kontextmenü des Browsers schließt sich per Klick, aber per mouseover spart man sich immerhin den fakelayer und oldIE-gefummel


Viele Grüße


Basti
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist offline   Mit Zitat antworten
Alt 03.09.2011, 12:49  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hi,

das sind ja gute Ansätze, werde ich umsetzen. Die clone-Funktion hatte ich irgendwoher kopiert, kenne source auch nicht. Ging darum Schleifenvariablen in Callbacks zu integrieren, die wurden immer nur referenziert und eben dann beim nächsten Durchlauf überschrieben. Habe aber $.each() verwendet, damit gings dann.

Was meinst du hiermit?
Zitat:
Eine Kleinigkeit noch:
Das Kontextmenü des Browsers schließt sich per Klick, aber per mouseover spart man sich immerhin den fakelayer und oldIE-gefummel
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 04.09.2011, 04:38  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 2.094
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard

Das native Kontextmenü des Browsers schließt erst nach einem Klick Ich hab deswegen bei mir einen fakelayer über den Browserinhalt gelegt, der, wenn geklickt, das Schließen des Kontextmenüs triggert. Ist eigentlich total popel, allerdings kennt der IE 6 kein position:fixed (den meinte ich mit "oldIE").

Zitat:
Die clone-Funktion hatte ich irgendwoher kopiert, kenne source auch nicht. Ging darum Schleifenvariablen in Callbacks zu integrieren, die wurden immer nur referenziert und eben dann beim nächsten Durchlauf überschrieben.
Um Objekte mit jQuery wirklich dereferenziert zu kopieren, kannst du per $.extend als ersten Parameter true mitgeben. Dann macht er auch den deep copy

Falls dir die api zu stressig/ungenau ist oder du in den Code tauchen möchtest/musst, kannst dir mal den source viewer von james padolsky anschauen. Sehr geiles Tool. Am besten im Chrome verwenden, dann bleiben auch die Kommentare erhalten (liegt an toString).
http://james.padolsey.com/jquery/#v=...=jQuery.extend
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] jQuery Accordion Menu im IE will nicht so richtig hossi86 HTML, Usability und Barrierefreiheit 11 01.08.2011 13:20
[Erledigt] CSS Drop Down Menu mit Zend Framework MLang PHP-Fortgeschrittene 8 22.04.2011 22:12
JQuery beslide Plugin in Funktion aufrufen?! pfump JavaScript, Ajax und mehr 5 21.01.2011 00:10
[Erledigt] jQuery plugin dropShadow Thorus JavaScript, Ajax und mehr 7 13.11.2010 23:28
[Erledigt] jQuery cycle plugin .cycle is not a function Thorus JavaScript, Ajax und mehr 8 27.08.2010 07:58
[Erledigt] Textdatenbank zeilenweise alphabetisch sortieren - Drop Down Menü alphabet UdoDirk PHP Tipps 2010 1 24.07.2010 10:45
Suche Alternative für jQuery prettyPhoto plugIn halskrause JavaScript, Ajax und mehr 0 29.01.2010 02:00
[Erledigt] jQuery Form Plugin verbuggt im IE kn0wledge JavaScript, Ajax und mehr 0 01.01.2010 16:16
3. Ebene bei dynamischem Menu im IE6 philosapiens JavaScript, Ajax und mehr 0 29.11.2009 13:56
Scriptsuche JQuery Plugin für Bildergalarie Creator Scriptbörse 3 22.10.2009 12:27
Plugin Controller Cout PHP-Fortgeschrittene 5 24.06.2009 23:02
jQuery Plugin - so richtig? stayInside JavaScript, Ajax und mehr 5 23.02.2009 12:34
horizontales Menü Fritz73 Scriptbörse 9 26.05.2008 22:26
Hilfe beim umschreiben von dynamischem php Menu Sauer PHP Tipps 2006 7 02.06.2006 16:05
Menü auf php-Seite PHP Tipps 2005 20 01.02.2005 20:24

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
jquery context menu, jquery contextmenu, jquery context menu plugin, context menu jquery, jquery kontextmenü, jquery contextmenu jquery, jquery context menus, jquery rechtsklick, contextmenu jquery, jquery contextmenu plugin, jquery contentmenu, james padolsky jquery source viewer, jquery plugin für kontextmenü, jquery content menu, jquery tabelleneditor, jquery plugin für rechtsklick, jquery menu plugin, jquery context, jquery kontextmenü menu items variable, jquery listen menupunkte alphabetisch sortieren

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:26 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum