问题描述
我正在调试一个可视化的作曲家插件,在我将 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
最佳解决方案
我能够解决这个问题。原来我使用的是旧版本的 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()
},
一切都为我工作很好!希望这有助于别人。
次佳解决方案
在 Ben 的答案中尝试修补程序后,我仍然收到此错误:未捕获 TypeError:无法读取未定义的属性’custom’
所以我修改了 composer-view.js 中的 html2 元素,如下所示:
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 这个工作完美!
原因:在 updatethis 插件后,管理员没有为 js_composer 插件加载正确的可视化编辑器。
================================================== ===
错误:
错误:TypeError:$ template.get 不是函数源文件:wp-content /plugins /js_composer_salient /assets /js /dist /backend.min.js?ver = 4.10 行:4047
================================================== ===
解决方案转到文件/wp-content/plugins/js_composer_salient/assets/js/dist/backend.min.js 绕行 4045:
======> 替换代码============================================= ======
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()
},
======> 替换此代码======================================
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()
},
第四种方案
注意到代码没有被传递到 html2element 函数中,但是在调用它的函数中存在 (render)
以下代码完全纠正了我的问题,我可以加载页面,添加,克隆,删除等
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;
},
第五种方案
我使用的主题是 Applay(2.1.3,有点过时) 。我刚刚更新了 WP 和所有的插件到最新版本 (4.5.2),也来到这个问题。我没有分析这个组件 (js_composer) 的流程,只是这个”broken” 函数 (这不是真的坏了) 。我意识到 this.template 和 $ template 变得错误的对象类型 (需要另一个验证,除了_.isString(html)
) 。我通过添加一个 try& catch 块如下:
原版的
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();
},
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。