javascript jquery - Plugin di lancio TypeError dopo l'aggiornamento di Wordpress 4.5





loading simple (9)


Bene, ho trovato la soluzione in questo sito: https://wordpress.org/support/topic/visual-composer-is-not-working

primo: modifica html2element: .... in /wp-content/plugins/js_composer/assets/js/backend/composer-view.js

html2element: function(html) {
        var $template, attributes = {},
            template = html;
        $template = $(template(this.model.toJSON()).trim()), _.each($template.get(0).attributes, function(attr) {
            attributes[attr.name] = attr.value
        }), this.$el.attr(attributes).html($template.html()), this.setContent(), this.renderContent()},

secondo: Tuttavia, se apri l'editor di frontend, avrai questo problema "trim" su custom_views.js: 101 e la riga 467 di un altro file. Ho dimenticato il nome, ma penso che potrebbe essere frontend_editor.js.

modifica in: \ wp-content \ plugins \ js_composer \ assets \ js \ frontend_editor \

  • frontend_editor.js
  • custom_views.js

Codice errato:

this.$controls = $( _.template( template, data, _.extend( {},
            vc.template_options,
            { evaluate: /\{#([\s\S]+?)#}/g } ) ).trim() ).addClass( 'vc_controls' );

Codice fisso:

this.$controls = $( _.template( template, data, _.extend( {},
            vc.template_options,
            { evaluate: /\{#([\s\S]+?)#}/g } ) )().trim() ).addClass( 'vc_controls' );

terzo: vedere la magia nera.

Saluti.

Sto eseguendo il debug di un plugin per visual compositore che si è rotto dopo aver aggiornato Wordpress a 4.5 e non riesco a capire perché stia lanciando un errore TypeError.

Il messaggio di errore nella console:

JQMIGRATE: Migrate is installed, version 1.4.0              load-scripts.php?....
Uncaught TypeError:     $template.get is not a function     composer-view.js?ver=4.1.1.1:73

Le uniche occorrenze di $template si trovano nel codice qui sotto. Capisco che questo non è molto contesto da cui partire, ma come posso risolvere questo errore?

/**
 * Convert html into correct element
 * @param html
 */
html2element: function(html) {
  var attributes = {},
    $template;
  if (_.isString(html)) {
    this.template = _.template(html);
    $template = $(this.template(this.model.toJSON()).trim());
  } else {
    this.template = html;
    $template = html;
  }
  _.each($template.get(0).attributes, function(attr) { // **errors on this line**
    attributes[attr.name] = attr.value;
  });
  this.$el.attr(attributes).html($template.html());
  this.setContent();
  this.renderContent();
},


Aggiornare:

Sembra che questo potrebbe essere un problema con jQuery. Wordpress 4.5 include jQuery 1.12 che risolve un bug che permetteva di eseguire determinati codici con sintassi errata. Suppongo che il codice del plugin debba avere una sintassi errata, ma è comunque rimasto in esecuzione fino ad ora.

https://wordpress.org/support/topic/read-this-first-wordpress-45-master-list#post-8271654




Sto usando il tema Astra. Questa soluzione funziona al 99,9%. Per alcuni però, si ferma solo la ruota che gira, ma quando la pagina non carica il compositore visivo no.

Ho apportato una leggera modifica a questo codice (che è pubblicato ovunque ormai)

Codice del tema Astra originale qui (compositore-view.js)

        html2element:function (html) {
        var attributes = {},
            $template;
        if (_.isString(html)) {
            this.template = _.template(html);
            $template = $(this.template(this.model.toJSON()).trim());
        } else {
            this.template = html;
            $template = html;
        }
        _.each($template.get(0).attributes, function (attr) {
            attributes[attr.name] = attr.value;
        });
        this.$el.attr(attributes).html($template.html());
        this.setContent();
        this.renderContent();
    },

Il codice che funziona:

html2element: function(html) {
    var $template, 
    attributes = {},
    template = html;
    $template = $(template(this.model.toJSON()).trim()), 
     _.each($template.get(0).attributes, function(attr) {
    attributes[attr.name] = attr.value
}); this.$el.attr(attributes).html($template.html()), this.setContent(), this.renderContent()

},

La differenza principale si trova qui (rispetto al codice originale)

}); this.$el.attr

C'è un punto e virgola al posto della virgola originale :):

}), this.$el.attr

Gente di applausi :) Quindi




Stavo ancora ricevendo questo errore dopo aver provato la patch nella risposta di Ben: Uncaught TypeError: Impossibile leggere la proprietà 'custom' di undefined

Così ho modificato html2element in composer-view.js come segue:

 html2element: function(html) {
        var $template, attributes = {},
            template = html;

        $template = $(template(this.model.toJSON()).trim());
        if($template.get(0))
        {
            _.each($template.get(0).attributes, function(attr) {
            attributes[attr.name] = attr.value
        })};

        this.$el.attr(attributes).html($template.html()),
        this.setContent(),
        this.renderContent()
    },



Il checkout sotto il codice per entrambi $ template.get non è una funzione e Uncaught TypeError: Impossibile leggere la proprietà 'attributes' di undefined. Ha funzionato per me

html2element: function(html) {
    var $template, attributes = {},
            template = html;

        $template = $(template(this.model.toJSON()).trim());
        if($template.get(0))
        {
            _.each($template.get(0).attributes, function(attr) {
            attributes[attr.name] = attr.value
        })};

        this.$el.attr(attributes).html($template.html()),
        this.setContent(),
        this.renderContent()
}



@ Ben funziona perfettamente!

Causa: l' amministratore non ha caricato l'editor visivo corretto per il plug-in js_composer dopo l'aggiornamento dei plug-in.

================================================== ===

Errore:

Errore: TypeError: $ template.get non è una funzione File sorgente: wp-content / plugins / js_composer_salient / assets / js / dist / backend.min.js? Ver = 4.10 Linea: 4047

================================================== ===

Soluzione Goto file /wp-content/plugins/js_composer_salient/assets/js/dist/backend.min.js intorno alla riga 4045:

======> Sostituisci il codice ======================================== =============

    html2element: function(html) {
        var $template, attributes = {};
        _.isString(html) ? (this.template = _.template(html), $template = $(this.template(this.model.toJSON(), vc.templateOptions["default"]).trim())) : (this.template = html, $template = html), _.each($template.get(0).attributes, function(attr) {
            attributes[attr.name] = attr.value
        }), this.$el.attr(attributes).html($template.html()), this.setContent(), this.renderContent()
    },

======> Sostituisci con questo codice ======================================= =

    html2element: function(html) {
        var $template, attributes = {},
        template = html;
        $template = $(template(this.model.toJSON()).trim()), _.each($template.get(0).attributes, function(attr) {
                attributes[attr.name] = attr.value}), 
                this.$el.attr(attributes).html($template.html()), this.setContent(), 
                this.renderContent()
    },



Ho apportato questa modifica che funziona sul mio WP 4.8.1 (PHP7)

nel file wp-content / plugins / js_composer / assets / js / backend / composit-view.js

è necessario modificare il metodo di rendering :

sostituire questa linea

this.html2element(_.template($shortcode_template_el.html(), this.model.toJSON())); 

da questa linea

this.html2element( $shortcode_template_el.html() );

Sembra che la funzione _.template () non funzioni perfettamente e non restituisca l'oggetto buono, quindi è meglio dare il codice html.




Notò che il codice non veniva passato alla funzione html2element, ma esisteva nella funzione chiamandolo (render)

Il seguente codice ha completamente corretto i miei problemi, posso caricare la pagina, aggiungere, clonare, rimuovere, ecc

render: function () {
			var $shortcode_template_el = $( '#vc_shortcode-template-' + this.model.get( 'shortcode' ) );
			if ( $shortcode_template_el.is( 'script' ) ) {
				var newHtmlCode =  _.template( $shortcode_template_el.html(),
												this.model.toJSON(),
												vc.templateOptions.default );
				if(!_.isString(newHtmlCode)){
					newHtmlCode = $shortcode_template_el.html();
				}
				this.html2element( newHtmlCode );
			} else {
				var params = this.model.get( 'params' );
				$.ajax( {
					type: 'POST',
					url: window.ajaxurl,
					data: {
						action: 'wpb_get_element_backend_html',
						data_element: this.model.get( 'shortcode' ),
						data_width: _.isUndefined( params.width ) ? '1/1' : params.width,
						_vcnonce: window.vcAdminNonce
					},
					dataType: 'html',
					context: this
				} ).done( function ( html ) {
					this.html2element( html );
				} );
			}
			this.model.view = this;
			this.$controls_buttons = this.$el.find( '.vc_controls > :first' );
			return this;
		},




Sto usando il tema Applay (2.1.3, un po 'obsoleto). Ho appena aggiornato WP e tutti i plugin alla versione più recente (4.5.2) e sono arrivato a questo problema. Non ho analizzato il flusso di questo componente (js_composer), solo questa funzione "rotta" (non è veramente rotta). Ho capito che this.template e $ template stanno ottenendo tipi di oggetto errati (ha bisogno di un'altra convalida da parte _.isString(html) ). L'ho risolto aggiungendo un blocco try & catch come segue:

ORIGINALE

    html2element:function (html) {
        var attributes = {}, 
            $template;
        if (_.isString(html)) {
            this.template = _.template(html);
            $template = $(this.template(this.model.toJSON()).trim());
        } else {
            this.template = html;                                                                                                                                            
            $template = html;
        }
        _.each($template.get(0).attributes, function (attr) {
            attributes[attr.name] = attr.value;
        }); 
        this.$el.attr(attributes).html($template.html());
        this.setContent();
        this.renderContent();
    },

MODIFICATA

    html2element:function (html) {
        var attributes = {}, 
            $template;
        if (_.isString(html)) {
            this.template = _.template(html);
        } else {
            try {
                this.template = _.template(html());                                                                                                                          
            } catch (err) {
                this.template = html;
            }   
        }   
        $template = $(this.template(this.model.toJSON()).trim());
        _.each($template.get(0).attributes, function (attr) {
            attributes[attr.name] = attr.value;
        }); 
        this.$el.attr(attributes).html($template.html());
        this.setContent();
        this.renderContent();
    },



Se hai solo bisogno di una stringa che rappresenti l'xml restituito da jquery, imposta il tuo tipo di dati su "testo" anziché cercare di analizzare l'xml nel testo. Quanto segue dovrebbe semplicemente restituirti il ​​testo non elaborato dalla tua chiamata ajax:

$.ajax({
    url: 'document.xml',
    type: 'GET',
    dataType: 'text',
    timeout: 1000,
    error: function(){
        alert('Error loading XML document');
    },
    success: function(xml){
        // do something with xml
    }
});






javascript jquery html wordpress wordpress-plugin