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 01.08.2009, 23:17  
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 Umsetzung von parentNode in jQuery

Hallo Leute,

bisher habe ich meine Javascriptsachen immer händisch gemacht, nun wollte ich für ein neues GUI mal jQuery eine Chance geben. Ich muss sagen das geht sehr fix (nachfolgendes hätte ich in einer Stunde browserübergreifend funktional wohl nicht hinbekommen), die Lernkurve ist auch ok.

Ich moechte zum einen die Implementierung zur Diskussion stellen (nach einer Stunde Erfahrung denke ich schon, dass es noch elegantere Loesungswege gibt), zum anderen eine kurze Frage stellen: Ich würde gern die geclonten langinsert-Divs direkt hinter dem Prototypen einklinken. Bis jetzt passierts nach dem äußeren Div. Lasse ich .offsetParent() weg, landen die "Klone" im Prototypen. Wie gelange ich an den ParentNode des Prototypen?

HTML-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
  <head>
    <style>
      .prototype {
                 background-color:#f00;
                 /* display:none; */
                 
                 }
    </style>
  
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
      
      nullLogic = function () 
        {
        if ('' == $(this).val()) {
          $(this).parent().find('.setNull[type="checkbox"]').attr('checked' , 'checked');
          }
        else {
          $(this).parent().find('.setNull[type="checkbox"]').removeAttr('checked');
          }
        }

      resetLogic = function () 
        {
        if (true == $(this).attr('checked')) {
          $(this).parent().find('.nullBased').val('');
          }
        }

      $(document).ready(function()
        {
        $('.langinsert:first div .nullBased').keyup(nullLogic);
        $('.langinsert:first div .setNull[type="checkbox"]').click(resetLogic);

        
        $('p').click(function () 
          {
          var el = $('.langinsert:first').clone(true);

          el.removeClass('prototype');
          $('.langinsert').offsetParent().append(el); 
          }
          );
        
        });

    </script>
  </head>

  <body>
  <div>
    <div class="langinsert prototype">
      <div>
        <input class="setNull"   type="checkbox" checked="checked" /> ignore
        <input class="nullBased" type="text" />
        <input type="text" value="other stuff" /> 
      </div>
      <div>
        <input    class="setNull"  type="checkbox" checked="checked" /> ignore
        <textarea class="nullBased"></textarea>
      </div>
      
      
    </div>
    <p>+ Add Element</p>
  </div>

  </body>
</html> 
Kurz zur Funktion: Eine Einheit aus Formelementen soll frei klonbar sein (also später beliebig viele Eingaben der selben Art ermoeglichen). Ein Textfeld und eine Textarea sind jeweils an eine korrespondierende Checkbox gebunden, die den NULL-Zustand repräsentiert. Statt einem leeren String erfolgt also später in der DB ein NULL Eintrag, genauso kann über die Checkbox das Feld geloescht werden.

Einfach mal ausprobieren, wenn Ihr jQuery auf dem System habt.

Danke für Hinweise. Vielleicht kennt jemand die Antwort auf die parentNode Geschichte.


PS: Der Prototyp wird später auf unsichtbar geschaltet, damit keine Eingaben geklont werden.
__________________
--
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 01.08.2009, 23:22  
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

Umhhh, die parentNode Frage hat sich schon erledigt. Habe jetzt "parent" statt "parentOffset" benutzt, damit gehts. Hätte man drauf kommen koennen.

Also
HTML-Code:
$('p').click(function () 
          {
          var el = $('.langinsert:first').clone(true);

          el.removeClass('prototype');
          $('.langinsert').parent().append(el); 
          }
          );
Nunja, trotzdem stelle ich den Code zur Diskussion.
__________________
--
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 02.08.2009, 19:06  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Ich denke der Code geht schon in Ordnung so. Persönlich würde ich dem Container "langinsert"-Container bzw. dessen Eltern-Element eine ID verpassen statt dort über die Klasse zu gehen. Das der click-Listener auf "p" liegt ist vermutlich ja nur zu Testzwecken?

Dann würde ich den globalen Namespace nicht unnötig mit nullLogic und resetLogic zumüllen - oder brauchst du die beiden wirklich an anderer Stelle nochmal?
Vielleicht bietet es sich auch an das ganze etwas allgemeiner zu schreiben und dann daraus eine Klasse - bzw. bei jQuery wohl ein Plugin zu machen.
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Alt 02.08.2009, 22:30  
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

Ehrlich gesagt versuche ich mich schon seit Stunden an einem passenden Objekt. Hast Du da einen Plan (Du machst ja mehr in Prototype)? Ich bekomme die Methodenaufrufe nicht hin.
Die Namespacees stoeren mich gar nicht so. Viel mehr, dass die Funktionen voneiander und vor allem von der HTML-gegebenen Elementstruktur abhängig sind. Mir schweb ein Objekt vor, dem ich das Objekt der Checkbox und das des Inputfeldes übergebe und das dann deren Events mit Aktionen auf das andere Element umsetzt.

[edit]

Mal reduziert:
PHP-Code:
...
      $(function()
        {

        function 
meins (cb inp)
          {
          
this.checker cb;
          
this.input   inp;
          
          
this.resetLogic = function () 
            {
            if (
true == this.checker.attr('checked')) {
              
this.input.val('');
              }
            };

          
// this.checker.click(this.resetLogic);  // this.checker is undefined
          
this.checker.click(function () {this.resetLogic ();});  // this.resetLogic is not a function
          
}



        
test = new meins (
                         $(
'.setNull:eq(0)')    ,
                         $(
'.nullBased:eq(0)')
                         );

        
        
        });

    
</script>
  </head>

  <body>

    <input class="nullBased" type="text" value="fdgd" size="60" maxlength="120" />
    <span>
      <input id ="cbSetNull" class="setNull"  type="checkbox" checked="checked" /> 
      <label for="cbSetNull">default</label>
    </span>

  </body>
</html> 
Bei beiden Varianten des Methodenaufrufs IM Objekt gibts nen Fehler beim Klick auf die Checkbox (siehe Kommentar).


[edit2]

Boah, ich gebs auf. Wenn mir jemand sagen kann, wie ich aus einem Objekt ein Event-Binding auf ein Member setzen kann und dabei das Objekt als Parameter mitgeben soll er es mir bitte sagen. Ich raffs nicht. jQuery scheint schon beim Binding den this-Bezug zu wechseln:

PHP-Code:
function myObject (element)
  {
  
this.element element;
  
this.property 23;
  
// mehr properties
  
  
$(this.element).click (...);  // myClickCallback
  // oder $(this.element).bind (...);  // myClickHandler 
  
}

function 
myClickCallback (myObj
  {
  
alert (myObj.property);
  }

function 
myClickHandler (event myObj
  {
  
alert (myObj.property);
  } 
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (03.08.2009 um 00:42 Uhr).
nikosch ist offline   Mit Zitat antworten
Alt 03.08.2009, 01:26  
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

Ging mir letztens mit jQuery ganz ähnlich. Allerdings, wenn du dann einfach mit einer privaten Methode arbeitest, geht es plötzlich.

Zum Ausprobieren:

Code:
        
function meins (cb , inp)
          {
            var self = this;
            this.checker = cb;
            this.input   = inp;

          resetLogic = function ()
            {
            if (true == self.checker.attr('checked')) {
              alert(1);
              self.input.val('');
              }
            };

          this.checker.click(function () {
                resetLogic ();
            });  
          }
grüße

edit:
Werde noch ausprobieren, ob es vielleicht sinniger ist, mit einem Literal-Objekt zu arbeiten. Kann dir Bescheid geben.
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog

Geändert von rudygotya (03.08.2009 um 01:34 Uhr).
rudygotya ist gerade online   Mit Zitat antworten
Alt 03.08.2009, 01:51  
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

Wie geil, es klappt! Tausend Dank! Ergebnis liefere ich nach.

[edit]

PHP-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
  <
head>

  <
style>
    .default {
color:#ccc;}
  
</style>


    <
script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">



$(function()
  {


  function meins (cb , inp)
    {
    var self = this;

    this.checker = cb;
    this.input   = inp;

    // regelt die Aktion nach Checkbox
    resetLogic = function ()
      {
      if (true == self.checker.attr('checked')) {
        self.input.val('');
        self.toggleDefaultDisplay (true);
        }
      else {
        self.toggleDefaultDisplay (false);
        }
      };


    // setzt die Checkbox bei leerem Inputfeld
    nullLogic = function () 
      {
      if ('' == self.input.val()) {
        self.checker.attr('checked' , 'checked');
        }
      else {
        self.checker.removeAttr('checked');
        }
      }


    // Ansicht der Default-Ansicht für Eingabefelder
    this.toggleDefaultDisplay = function (status)
      {
      if (true == status) {
        self.input.addClass('default');
        self.input.val('default');
        }
      else {
        self.input.val('');
        self.input.removeClass('default');
        }
      }


    // regelt das Setzen der Default-Ansicht für Eingabefelder
    nullDisplay = function (event) 
      {
      if (true != self.checker.attr('checked')) {
        if (self.input.hasClass('default'))
          {
          self.toggleDefaultDisplay (true);
          }
        return;
        }

      if (isFinite (event) || 'blur' == event.type) {
        self.toggleDefaultDisplay (true);
        }
      else {
        self.toggleDefaultDisplay (false);
        }
      }


    this.checker.click(resetLogic);  
    this.input.keyup(nullLogic);
    this.input.bind('blur focus' , nullDisplay);
    }


  el = $('#root div');
  $('#root').append (el.clone ());
  $('#root').append (el.clone ());

  new meins ($('.setNull:first') , $('.nullBased:first'));
  new meins ($('.setNull:eq(1)') , $('.nullBased:eq(1)'));

  // zum Beweis: Eine CB kann auch andere Schalten
  new meins ($('.setNull:eq(2)') , $('.nullBased:eq(1)'));
  });




    </script>
  </head>

  <body>
  <div>
    <input class="nullBased" type="text" value="fdgd" size="60" maxlength="120" />
    <span>
      <input class="setNull"  type="checkbox" /> <label>default</label>
    </span>
  </div>
  </body>
</html> 
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (03.08.2009 um 03:06 Uhr).
nikosch ist offline   Mit Zitat antworten
Alt 03.08.2009, 02:06  
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. Sitze auch grad an einer ähnlichen Problematik, daher hab ich deinen Schnipsel zum ausprobieren hergenommen.
Werde dann wohl mit statischen Methoden arbeiten, sieht sauberer aus.

Hier zum ausprobieren:

Code:
        var meins = {
            checker : $('.setNull:eq(0)'),
            input : $('.nullBased:eq(0)'),
            resetLogic : function ()
            {
                if (true == this.checker.attr('checked')) {
                  alert(1);
                  this.input.val('');
                  }
            }
        }
        $('.setNull:eq(0)').click(function () {
                meins.resetLogic();
            });
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist gerade online   Mit Zitat antworten
Alt 03.08.2009, 04:38  
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

Leider zu spät gefunden: Organisation von JavaScripten
__________________
--
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 03.08.2009, 21: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

Netter link V.a.:

Zitat:
Außerhalb des Kontextes bedeutet, dass this nicht mehr wie beschrieben auf das Object zeigt, sondern auf das Elementobjekt, dessen Handler ausgelöst wurde. (Siehe die Bedeutung des this-Schlüsselwortes beim Event-Handling.) In vielen Fällen aber ist im Event-Handler ein Zugriff auf beide Objekte gewünscht, auf das Elementobjekt sowie auf den Object-Container.
Hätte den link auch früher gebrauchen können.. Auf den Trick mit der Referenz auf this bin ich durch das Tutorial von Peter Kropff gekommen.
Allerdings ist das eher oberflächlich und der Wechsel des Bezugs von this wird leider nicht geklärt.

Wirklich umbauen muss ich zum Glück nichts, die literale Schreibweise find ich allerdings wirklich genial.

Zu jQuery: Die Verwendung der Ajax Funktionen von JQuery machen wirklich Spaß, das geht mal richtig einfach und mit wirklich wenig Code. Der DOM- Selector ist auch einfach nur genial.

grüße
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist gerade online   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
JQUERY - divs auf und zuklappen sturmi JavaScript, Ajax und mehr 5 04.06.2009 14:23
JQuery animate klappt in IE nicht richtig mysteryxxx JavaScript, Ajax und mehr 2 29.05.2009 09:17
JQuery + Autocomplete mit htmlentities saduccm JavaScript, Ajax und mehr 4 13.05.2009 09:15
Ajax + PHP + jquery Accordion zusammenführen. gamerphil JavaScript, Ajax und mehr 0 30.04.2009 17:42
[Erledigt] jQuery Dateien nachladen Phoscur JavaScript, Ajax und mehr 7 14.03.2009 13:44
jQuery Plugin - so richtig? stayInside JavaScript, Ajax und mehr 5 23.02.2009 12:34
Koordinaten des Mauszeigers über einer Grafik (Drag&Drop mit jQuery) anbeck JavaScript, Ajax und mehr 5 19.01.2009 16:28
jQuery will nicht pcschröda JavaScript, Ajax und mehr 21 17.01.2009 11:35
For Schleife mit jQuery phpbeginner JavaScript, Ajax und mehr 3 22.11.2008 22:35
jQuery hilfe :x NewbieAlarm JavaScript, Ajax und mehr 2 23.10.2008 13:56
Thickbox Funktionalität in jQuery Plague JavaScript, Ajax und mehr 1 28.07.2008 23:58
OOP Umsetzung cycap PHP-Fortgeschrittene 26 17.06.2008 19:13
jQuery: Parameter an onclick Event ecomeback HTML, Usability und Barrierefreiheit 1 08.04.2008 11:23
Probleme bei der Umsetzung Kein Genie PHP Tipps 2007 3 02.03.2007 15:43
Umsetzung eines Pluginsystems /tmp PHP-Fortgeschrittene 18 14.09.2004 22:58

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
jquery parentnode, jquery parent node, parentnode jquery, jquery parent, parentnode, javascript parentnode, jquery elternelement, jquery get parent node, jquery parent find, jquery this parentnode, jquery parent element, jquery add element, jquery get parent, prototype parentnode, this.parentnode jquery, php parentnode, jquery find parent, jquery parents find, jquery get parent element, prototype auf elternelement zugreifen

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