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 29.09.2010, 20:13  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Damit bekomme ich das Eventobjekt selbst.
Das ist der Kern der Problematik. Normalerweise wird an das Callback als erster Parameter das Eventobjekt zugewiesen*). Statt dessen nutzt mein**) Beispiel eine Funktionszuweisung mit Parameter:
PHP-Code:
  Image.onclick = function (Type) { .. } (PieceType); 
Keine Ahnung, wie das in JS-Deutsch heißt.

Das zweite Problem ist die Abarbeitung in der Schleife. Ohne das Closure, das den Parameter statisch bindet
PHP-Code:
return function () {
        
alert (Type);
      }; 
würde an alle Bilder nur der letzte Schleifenwert zugewiesen.

*) Genauer ist das IMHO sogar browserabhängig
**) Der Code ist frei nach Douglas Crockford, dem JS-Guru.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 13.02.2011, 16:42  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 722
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

So, ich habe jetzt wieder ein ähnliches Problem, kann aber die vorhandenen Lösungen nicht anwenden.

Es geht um den Aufbau eines jQuery-jsTree-Contextmenüs.
PHP-Code:
        var Boxarten getBoxarten();
        for(var 
I in Boxarten)
        {
            var 
entry 'create_box_' I;
            var 
boxartId I;
            
items.create_box.submenu[entry] = {
            
"label" Boxarten[i],
            
"action"            : function (obj) {boxart_id boxartIdthis.create(obj); },
            
"_disabled"         false,
            
"separator_before"  false,
            
"separator_after"   true,
            
"icon"              false};
        } 
Der Standardcallback wird so angegeben:
PHP-Code:
function (obj) { this.create(obj); } 
Ich wollte nun zusätzlich eine globale Variable (boxart_id) setzen/ändern, bevor this.create(obj) aufgerufen wird.
PHP-Code:
function (obj) {boxart_id boxartIdthis.create(obj); } 
Das Problem ist jetzt wieder, dass boxart_id immer den letzten Wert der Schleife beinhaltet.
Kann mich vielleicht jemand nochmal unterstützen?
hts ist offline   Mit Zitat antworten
Alt 13.02.2011, 17:28  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.865
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Das ist der Kern der Problematik. Normalerweise wird an das Callback als erster Parameter das Eventobjekt zugewiesen*). Statt dessen nutzt mein**) Beispiel eine Funktionszuweisung mit Parameter:
PHP-Code:
  Image.onclick = function (Type) { .. } (PieceType); 
Keine Ahnung, wie das in JS-Deutsch heißt.

Das zweite Problem ist die Abarbeitung in der Schleife. Ohne das Closure, das den Parameter statisch bindet
PHP-Code:
return function () {
        
alert (Type);
      }; 
würde an alle Bilder nur der letzte Schleifenwert zugewiesen.

*) Genauer ist das IMHO sogar browserabhängig
**) Der Code ist frei nach Douglas Crockford, dem JS-Guru.
php:
PHP-Code:
$me ":D";
$you ":(";

$bla = function($a,$b,$c) use ( $me$you ) {
   if ( 
$me == $you ) echo "we feel the same";
}; 
js:
PHP-Code:
var me ":D";
var 
you ":(";

var 
bla = function(a,b,c) {
   if ( 
me == you alert('we feel the same');
} ( 
meyou ); 
?
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 13.02.2011, 17:48  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Das Problem ist jetzt wieder, dass boxart_id immer den letzten Wert der Schleife beinhaltet.
Kann mich vielleicht jemand nochmal unterstützen?
Logisch. Was soll auch sonst passieren? Was erwartest Du denn sonst?

@tr0y: Wird so nicht funktionieren (falsche Parameter). Zitat ist auch aus dem Zusammenhang gerissen.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 13.02.2011, 18:25  
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

Ich seh da auch paar Sachen, die ich nicht versteh. Ist boxart_id ne global, die du irgendwo brauchst? Woher kommt denn das kleine i auf einmal? Wenn du nicht irgendwo ein globales i hast, ist i in dem Fall undefined (js ist case sensitive).
Wichtig wäre auch zu wissen, was action eigentlich genau macht und wo du dort boxart_id brauchst. Wird so ja noch gar nicht verwendet.

Kann es sein, dass du interne Methoden des plugins aufbohrst? Nur getippt aufgrund des anderen threads, denn das würd ich mir 3 mal überlegen (sonst bist du auf die interne Funktionsweise festgelegt und stehst evtl beim Pluginupdate vor nem Scherbenhaufen).

grüße


Basti
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist offline   Mit Zitat antworten
Alt 13.02.2011, 18:28  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 722
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

@tr0y Das Problem ist dabei, dass obj nicht gesetzt ist.
PHP-Code:
        for(var I in Boxarten)
        {
            var 
entry 'create_box_' I;
            var 
boxartId I;
            
items.create_box.submenu[entry] = {
            
"label" Boxarten[i],
            
"action"            : function (obj) {boxart_id boxartIdthis.create(obj); }(boxartId),
            
"_disabled"         false,
            
"separator_before"  false,
            
"separator_after"   true,
            
"icon"              false};
        } 
Damit bekomme ich den Fehler: this.create is not a function


Wenn ich den Parameter ergänze (Zeile 99)
PHP-Code:
"action"            : function (objboxartID) {boxart_id boxartIdthis.create(obj); }(objboxartId), 
Fehler: obj is not defined
Zeile: 99

Irgendwie ist obj erst zu Laufzeit bekannt

Zitat:
Zitat von nikosch
Logisch. Was soll auch sonst passieren? Was erwartest Du denn sonst?
Ich hatte gehofft, dass wenn die Funktion aufgerufen wird, die globale Variable mit dem richtigen Werten beschrieben wird. Nur ist dem leider nicht so und ich suche eine Lösung.

Geändert von hts (13.02.2011 um 18:45 Uhr).
hts ist offline   Mit Zitat antworten
Alt 13.02.2011, 18:42  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Die Lösung steht schon als erstes Wort im Thread-Titel.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 13.02.2011, 18:44  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 722
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von rudygotya Beitrag anzeigen
Ich seh da auch paar Sachen, die ich nicht versteh. Ist boxart_id ne global, die du irgendwo brauchst? Woher kommt denn das kleine i auf einmal? Wenn du nicht irgendwo ein globales i hast, ist i in dem Fall undefined (js ist case sensitive).
Wichtig wäre auch zu wissen, was action eigentlich genau macht und wo du dort boxart_id brauchst. Wird so ja noch gar nicht verwendet.
* Also boxart_id ist global.
* Das kleine i macht das Board, im Quelltext steht ein großes (wenn du auf zitieren gehst.)

Also action ruft letztendlich diese Funktion auf:
PHP-Code:
    .bind("create.jstree", function (edata)
        $.
post(
        
"lagerortverwaltung_probe_json.php",
        {
        
"operation" "createNode",
        
"parent_id" data.rslt.parent.attr("id").replace("node_",""),
        
"position" data.rslt.position,
        
"title" data.rslt.name,
        
"type" data.rslt.obj.attr("rel"),
        
"boxart_id"boxart_id
        
},
        function (
r) {
            if(
r.status) {
                $(
data.rslt.obj).attr("id""node_" r.id);
            }
            else {
                $.
jstree.rollback(data.rlbk);
            }
        }
        ); 
Ich habe mir eigene Node-Types definiert und im Falle einer Box benötige ich für den AJAX-Request die globale Variable boxart_id.

Ich habe dazu im contextmenu-Plugin angesetzt. Bei den Nodes vom Type "box", soll nun diese Variable gesetzt werde.
Das Menu (Create-Einträge) siehst dann dazu so aus:
Neue Box
-> Child Menü
* Boxart X
* Boxart Y
* usw.
hts ist offline   Mit Zitat antworten
Alt 13.02.2011, 19:27  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 722
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von ChrisB Beitrag anzeigen
Die Lösung steht schon als erstes Wort im Thread-Titel.
Ok, also nächster Versuch
PHP-Code:
        var Boxarten getBoxarten();
        for(var 
I in Boxarten)
        {
            var 
entry 'create_box_' I;
            var 
boxartId I;
            
items.create_box.submenu[entry] = {
            
"label" Boxarten[i],
            
"action"            : function (obj) {var id boxartId; var setBoxart = function(){boxart_id id}; setBoxart(); this.create(obj); },
            
"_disabled"         false,
            
"separator_before"  false,
            
"separator_after"   true,
            
"icon"              false};
        } 
Ergebnis ist wieder, dass immer der letzte Wert des Schleifendurchlaufs benutzt wird.
hts ist offline   Mit Zitat antworten
Alt 13.02.2011, 20:50  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 722
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

So, ich habe einen "Würgaround":
PHP-Code:
        for(var I in Boxarten)
        {
            var 
entry 'create_box_' I;
            
items.create_box.submenu[entry] = {
            
"label" Boxarten[i],
            
"action"            : function (obj) {this.create(obj); },
            
"_disabled"         false,
            
"separator_before"  false,
            
"separator_after"   true,
            
"icon"              false,
            
"boxart_id" I};
        } 
Im Menü ein neues Property "boxart_id" eingeführt und den jsTree-Quelltext ein wenig modifiziert.
Ist zwar gar nicht schön, aber ich brauche eine Lösung.
hts 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
Auswahlwert in Variable speichern sLaps JavaScript, Ajax und mehr 3 20.09.2010 14:20
[Erledigt] inhalt einer while schleife in eine variable speichern ePole PHP Tipps 2010 20 17.07.2010 11:40
MySql Suchergebnis in eine Variable speichern TheSymo PHP Tipps 2010 3 21.05.2010 08:56
[Erledigt] Ergebnis in eine Variable speichern sl0t PHP Tipps 2010 7 10.02.2010 13:04
Wert aus Datenbank in Variable speichern Extremefall PHP Tipps 2009 11 15.12.2009 16:30
[Erledigt] Parameter aus URL speichern dna PHP Tipps 2009 13 18.03.2009 07:22
javascript funktion(ergebnis) in php variable speichern martl666 PHP Tipps 2008 3 29.12.2008 17:13
Werte ein Variable speichern aceras PHP Tipps 2008 3 09.11.2008 12:09
[Erledigt] Variable Anzahl Parameter bie build-in-functions sqrt PHP Tipps 2008 16 25.05.2008 23:00
String aus einer Seite in Variable speichern KimKaye PHP Tipps 2008 10 14.05.2008 09:57
Variable als optionalen Parameter? Mex PHP Tipps 2006 3 20.04.2006 07:05
Auswahl als Variable ausgeben / in DB speichern PHP Tipps 2006 3 14.01.2006 13:08
Feedback von URL-Aufruf in Variable speichern PHP Tipps 2007 3 17.12.2005 18:50
text zwischen xx und xx in variable speichern? md5hash PHP Tipps 2005-2 3 13.09.2005 18:28
[Erledigt] Variable speichern PHP Tipps 2005 9 24.02.2005 14:39

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
javascript closure behält nur letzten wert, jstree contextmenu ändern, \this.create is not a function\, javascript function closure, data.rslt.obj.attr icon, .jstree({, jstree und php, jstree contextmenu speichern, jstree bind, http://www.php.de/javascript-ajax-und-mehr/72305-closure-parameter-variable-speichern-2.html

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:59 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