我正在调试一个可视化作曲家插件,在我将WordPress更新为4.5之后破坏了,我无法弄清楚它为什么会抛出TypeError。
控制台中的错误消息:
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
$template
中唯一出现的内容可在以下代码中找到。我明白这不是很多背景,但是,我该如何解决这个错误呢?
/**
* 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();
},
更新
看起来这可能是jQuery的一个问题。 WordPress 4.5包含jQuery 1.12,修复了一个错误,允许某些代码以不正确的语法运行。我假设插件代码必须具有不正确的语法,但直到现在仍然运行。
https://wordpress.org/support/topic/read-this-first-wordpress-45-master-list#post-8271654
答案 0 :(得分:121)
我能够解决这个问题。事实证明我使用的是旧版本的JS作曲家。更新到最新版本会破坏我的网站,因此我追踪错误并将html2element
功能更新为
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()
},
一切都很适合我!希望这有助于其他人。
答案 1 :(得分:33)
我在Ben的回答中尝试修补程序后仍然出现此错误:未捕获的TypeError:无法读取属性' custom'未定义的
所以我修改了composer-view.js中的html2element,如下所示:
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()
},
答案 2 :(得分:18)
@Ben这很完美!
<强>原因:强> 在更新此插件后,管理员没有为js_composer插件加载正确的可视化编辑器。
=============================================== ==
错误:强>
错误:TypeError:$ template.get不是函数 源文件:wp-content / plugins / js_composer_salient / assets / js / dist / backend.min.js?ver = 4.10 行:4047
=============================================== ==
<强>解决方案强> 转到4045行左右的文件/wp-content/plugins/js_composer_salient/assets/js/dist/backend.min.js:
==&GT;替换代码=============================================== ==
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()
},
==&GT;替换为此代码========================================
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()
},
答案 3 :(得分:5)
注意到代码没有被传递到html2element函数,但是在调用它的函数中确实存在(渲染)
以下代码已完全纠正了我的问题,我可以加载页面,添加,克隆,删除等
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;
},
答案 4 :(得分:4)
我正在使用主题Applay(2.1.3,有点过时)。我刚刚将WP和所有插件更新到最新版本(4.5.2),并且也遇到了这个问题。我没有分析这个组件的流程(js_composer),只是这个“破坏”的功能(它并没有真正破坏)。我意识到this.template和$ template正在获得错误的对象类型(它需要另一个验证_.isString(html)
)。我通过添加try&amp; catch块如下:
<强> ORIGINAL 强>
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();
},
<强>改性强>
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();
},
答案 5 :(得分:3)
我正在使用Astra主题。此修复程序的工作率为99.9%。对于某些人来说,这只会停止旋转轮,但一旦页面加载,视觉作曲家就不会。
我对这段代码做了一些改动(到现在为止已经发布了)
这里的原创Astra主题代码(composer-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();
},
有效的代码:
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()
},
主要区别在于此处(与原始代码相比)
}); this.$el.attr
有一个分号而不是原始的逗号:):
}), this.$el.attr
干杯人:)所以
答案 6 :(得分:1)
好吧,我在这个网站找到了解决方案:https://wordpress.org/support/topic/visual-composer-is-not-working
首先:在/wp-content/plugins/js_composer/assets/js/backend/composer-view.js中编辑html2element:....
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()},
第二:但是如果你打开前端编辑器,你就会有这个&#34;修剪&#34; custom_views.js上的问题:101,另一个文件的第467行。我忘记了名字,但我认为它可能是frontend_editor.js。
编辑:\ wp-content \ plugins \ js_composer \ assets \ js \ frontend_editor \
错误代码:
this.$controls = $( _.template( template, data, _.extend( {},
vc.template_options,
{ evaluate: /\{#([\s\S]+?)#}/g } ) ).trim() ).addClass( 'vc_controls' );
固定代码:
this.$controls = $( _.template( template, data, _.extend( {},
vc.template_options,
{ evaluate: /\{#([\s\S]+?)#}/g } ) )().trim() ).addClass( 'vc_controls' );
第三:看黑魔法。
干杯。
答案 7 :(得分:1)
以下代码检查$ template.get的代码不是函数和Uncaught TypeError:无法读取undefined的属性'attributes'。为我工作。
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()
}
答案 8 :(得分:1)
我做了这个修改,适用于我的WP 4.8.1(PHP7)
文件 wp-content / plugins / js_composer / assets / js / backend / composer-view.js
您必须修改呈现方法:
替换此行
this.html2element(_.template($shortcode_template_el.html(), this.model.toJSON()));
通过这一行
this.html2element( $shortcode_template_el.html() );
似乎_.template()函数不能很好地工作并且不会返回好的对象,所以最好给出html代码。
答案 9 :(得分:0)
尝试更新您的主题。转到外观&gt;主题,并检查更新。这在更新时自动解决了我的问题。
当我为运行Nimva主题的WP 4.5更新时出现错误。 您必须更新到Nimva的2.02,它允许自动更新。