2016-04-05 8 views
1

Ich habe einen Geschicklichkeitsinhaltstyp, der das Verhalten plone.app.event.dx.behaviors.IEventBasic enthält.plone/jquery - Wenn ein Formular als Popup-Overlay geöffnet wird, was bewirkt, dass JavaScript nicht funktioniert?

In einer browserview Seite habe ich eine Form, die sich öffnet, wenn ein Link angeklickt wird, jquery in einer Javascript-Datei in meine Ressourcen Ordner mit:

jquery(function($){ 

    .... 
    $(".openCT").prepOverlay(
     { 
      subtype: 'ajax', 
      filter: '#content>*', 
      formselector: '#content-core > form', 
      noform: 'reload', 
      closeselector: '[name="form.buttons.cancel"]', 
     } 
    ); 
    ....  
}); 

Das Formular öffnet, aber alles jquery/javascript Zusammenhang tut nicht arbeiten. Insbesondere funktioniert der ganze Tag nicht, da die "Zeitkomponenten", die Stunden und Minuten anzeigen, nicht ausgeblendet werden, wenn whole_day auf True gesetzt ist. Gibt es etwas, das ich aufnehmen muss, damit jquery/javascript in einem Popup-Overlay funktioniert?

Edit: Meine Form ist ein dexterity.AddForm:

class Add(dexterity.AddForm): 
    grok.name('my.product.tevent') 

    def updateWidgets(self): 
     super(Add,self).updateWidgets() 
     if 'a_param' in self.request.form.keys(): 

      #set default value of start date, which is a tuple built from data obtained from a_param 
      self.widgets['IEventBasic.start'].value = (a_year,a_month,a_day,an_hour,a_min,a_timezone) 
      #start-> hour,min are 0,0/end -> hour, min are 23,59 
+1

Öffnen Sie die Javascript-Konsole in Ihrem Browser und suchen Sie nach Fehlermeldungen. Die Wahrscheinlichkeit ist groß, dass ein JS-Fehler den Ladevorgang abgebrochen hat, bevor der Code überhaupt erreicht wurde. – SteveM

+0

Leider werden in der Konsole keine Fehlermeldungen angezeigt. Ich habe das mit FireFox, Chromium und Web versucht. –

Antwort

4

Jeder Blick auf diese, bitte beachten Sie, dass diese Antwort für Plone 4.3.x. ist Popups werden in Plone 5+ anders gehandhabt.

Ajax-Overlays werden in das DOM eingefügt, wenn auf die Verknüpfung oder Schaltfläche geklickt wird. Die neuen Elemente sind somit nicht mit jQuery-Ereignissen verknüpft (es sei denn, die jQuery-Ereignisse wurden mit "Live" -Mechanismen hinzugefügt, die jedes Mal, wenn das DOM geändert wird, Ereignisse wieder anfügen).

Sie müssen also jeden JS-Initialisierungscode erneut ausführen, um Ereignisse an die neuen DOM-Elemente anzuhängen. Sie können das tun, indem sie ein onLoad Ereignis an die Overlay-Konfiguration hinzu:

$(".openCT").prepOverlay({ 
    subtype: 'ajax', 
    ... 
    config: { 
     onLoad: function() { 
      // js code to attach events to new DOM elements 
    }} 
... 
}); 

Dieses Ereignis wird ausgelöst, nachdem das Overlay geladen und angezeigt wurde. Somit sind die neuen Elemente im DOM verfügbar. Die Elemente, die in "Config" gehen können, sind in der jQueryTools docs dokumentiert.

+0

Entschuldigung für meine späte Antwort. Vielen Dank. Dies löst Probleme mit meinen eigenen Funktionen. Ich muss einen Weg finden, die jQuery anzuhängen, die IEventBasic hat, aber danke für den Schritt in die richtige Richtung. –

+0

Ich habe ein ähnliches Problem, aber ich bin nicht sicher, ob es angebracht wäre, eine neue Frage zu stellen. Ich habe einen Validator in meiner Datei definiert (ein validator.SimpleFieldValidator) und die jQuery, die ich in onLoad platziert, wie zum Beispiel die Werte im Feld minutes von 0-59 zu 0 und 30, bricht, wenn der Benutzer auf die Schaltfläche zum Senden mit ungültigen klickt Eingang. Bei Pausen bedeutet das Minutenfeld wieder 0-59. Der Validator funktioniert trotzdem. Seltsames Klicken auf das Feld im Gegensatz zum Klicken auf den Submit-Button bricht die jQuery nicht, wenn sie wie erwartet validiert wird. –