2016-04-28 1 views
1

Ich arbeite an einem Magento-Shop, der versucht, die Javascript-Ebene eines Widgets mit Hilfe von Prototype js framework zu codieren.Inline-Javascript wird von der AJAX-Antwort von Prototype JS Ajax.Request-Methode abgezogen

In meinem Grid.js Datei Aufruf AJAX ist Setup wie folgt aus:

loadTabContent: function(tab, tabType){ 

     if(tab === undefined || tabType === undefined){ 
      return this; 
     } 

     entityId = tab.id.split('-')[3]; 

     request = new Ajax.Request(
      this.tabContentLoadUrl, 
      { 
       method:'get', 
       onSuccess: this.onTabContentLoad.bind(tab), 
       onFailure: this.ajaxFailure.bind(this), 
       evalJS: true, 
       parameters: { 
        id: entityId, 
        type: tabType 
       } 
      } 
     ); 
    } 

Unten ist der Erfolg Handler:

onTabContentLoad: function(transport){ 

     if(transport && typeof transport.responseText !== undefined){ 
      try{ 
       response = transport.responseText; 
      }catch (e) { 
       console.log('PARSE ERROR', e); 
       response = {}; 
      } 

      entityId = this.id.split('-')[3]; 
      tabType = this.id.split('-')[1]; 

      if(response && $('tab-' + tabType + '-' + entityId + '-contents')){ 
       $('tab-' + tabType + '-' + entityId + '-contents').update(response);  
      } 
     } 
    }, 

Der Inhalt für das div wird immer korrekt durch die AJAX-Aufruf aktualisiert aber es gibt einige Inline-JS in Antwort, die nicht funktioniert. Ich sehe, dass JavaScript-Schnipsel in Registerkarte Elemente (Chrom Entwickler-Tool) kann nicht einmal

Unten ist der Code, der die AJAX-Request auf Serverseite Griffe:

public function renderTabContentAction() 
    { 
     $entityId = Mage::app()->getRequest()->getParam('id'); 
     if(! $entityId){ 

      $this->getResponse()->setHeader('HTTP/1.0', '400', true); 
      $this->getResponse()->setBody('Invalid parameters provided.'); 
     } 

     $tabType = Mage::app()->getRequest()->getParam('type'); 
     if(! $tabType){ 

      $this->getResponse()->setHeader('HTTP/1.0', '400', true); 
      $this->getResponse()->setBody('Invalid parameters provided.'); 
     } 

     Mage::register('current_entity_id', $entityId); 
     Mage::register('current_tab_type', $tabType); 

     $tabHtml = $this->_getTabsHtml($entityId, $tabType);  


     $this->getResponse()->setHeader('HTTP/1.0', '200', true); 
     $this->getResponse()->setBody($tabHtml); 
    } 

Unten finden Sie die Antwort, die bekommt übergeben onTabContentLoad AJAX-Handler:

<div class="vertical-tabs"> 
     <div class="tabs"> 
     <div class="tab" id="tab-vertical-137-2441"> 
      <input type="radio" id="label-vertical-product-tab-137-2441" name="product-tab-group-137"> 
      <label class="tabs-label" for="label-vertical-product-tab-137-2441">PG-10ml</label> 
      <div class="content" id="tab-vertical-137-2441-contents"> 
      </div> 
     </div> 
     <div class="tab" id="tab-vertical-137-2442"> 
      <input type="radio" id="label-vertical-product-tab-137-2442" name="product-tab-group-137"> 
      <label class="tabs-label" for="label-vertical-product-tab-137-2442">PG-15ml</label> 
      <div class="content" id="tab-vertical-137-2442-contents"> 
      </div> 
     </div> 

     </div> 
    </div> 
    <script type="text/javascript"> 
    bulkOrderGrid.initVerticalTabs(); 
    bulkOrderGrid.activateTab('2441', 'VERTICAL'); 
    </script> 

Sie, dass die SCRIPT-Tags in der Antwort gibt es zu sehen. Es ist nur, wenn der Inhalt aktualisiert wird mit Element.update Funktion entfernt es die SCRIPT-Tags. Das kann ich bis jetzt verstehen.

HINWEIS: true und Ajax.Request zusammen mit evalJS: Ich habe auch Ajax.Updater zusammen mit evalScripts verwendet wahrem.

Hier stecken geblieben. Jede Hilfe würde sehr geschätzt werden.

UPDATES:

Da ich Element.update Funktion bin mit dem Abschnitt zu aktualisieren. Die Ursache des Problems ist dieser Teil des Codes in prototype.js um Linie Nr. 2048. Ich kann sehen, dass es in js Debugger ausgeführt wird. Es wertet den JS-Code aus, entfernt aber auch die SCRIPT-Tags aus der Quelle. Kommentieren stripScripts funktioniert gut.

else { 
    element.innerHTML = content.stripScripts(); 
    } 

    content.evalScripts.bind(content).defer(); 
+0

Sie sind korrekt ** Element.update ** Skript-Tag entfernen. Du solltest ** Element.innerHTML ** verwenden –

Antwort

0

Ich denke, Ihr Problem ist, dass die Ajax-Antwort durch String#evalScripts() vergangen ist, aber der Zusammenhang ist nicht der globale Kontext so anstelle des Skripts Block tun dies

<script type="text/javascript"> 
window.bulkOrderGrid.initVerticalTabs(); 
window.bulkOrderGrid.activateTab('2441', 'VERTICAL'); 
</script> 

wenn das tut es beheben - als Sie können transport.responseText.evalScripts() direkt ausführen, aber Sie benötigen immer noch die window. in Ihrem Skriptblock, um den Gültigkeitsbereich der Variablen aufzulösen.

+0

Ich habe deine Vorschläge auch ausprobiert. Aber kein Erfolg. Ich werde diese Frage mit einigen neuen Erkenntnissen aktualisieren. Danke für die Hilfe! – div

0

Sie sind korrekt Element.update() entfernen Skript-Tag. Sie sollten Element verwenden.innerHTML

Verwandte Themen