不能对 类 的数组使用 `on` 方法
Can't use the `on` method on an array of classes
问题:
我正在尝试创建一个 WYSIWYG 编辑器,它是模块化的,可重复用于我的博客...不幸的是,我很难让它与多个文本字段一起工作。
工作原理:
编辑器在 Iframe 上启用 document.designMode = 'on'
。
首先我初始化对象:
init: function(){
this.cacheDOM();
this.renderEditor();
this.enableDesignMode();
this.bindEvents();
},
然后缓存DOM
cacheDOM: function(){
this.$editors = $('.editor-toolbar');
this.$iframes = $('.editor-iframe');
},
然后我用我所有的编辑器工具渲染工具栏
renderEditor: function(){
var html = '<div class="text-editor">' +
'<div class="btn-group">' +
'<button class="e_bold btn btn-sm btn-secondary" type="button"><i class="fa fa-bold"></i></button>' +
'<button class="e_italic btn btn-sm btn-secondary" type="button"><i class="fa fa-italic"></i></button>' +
'<button class="e_underline btn btn-sm btn-secondary" type="button"><i class="fa fa-underline"></i></button>' +
'</div>' +
'<div class="btn-group">' +
'<button class="e_align_left btn btn-sm btn-secondary" type="button"><i class="fa fa-align-left"></i></button>' +
'<button class="e_align-center btn btn-sm btn-secondary" type="button"><i class="fa fa-align-center"></i></button>' +
'<button class="e_align-right btn btn-sm btn-secondary" type="button"><i class="fa fa-align-right"></i></button>' +
'</div>' +
'<div class="btn-group">' +
'<button class="e_header_2 btn btn-sm btn-secondary" type="button" value="h2">h2</button>' +
'<button class="e_header_3 btn btn-sm btn-secondary" type="button" value="h3">h3</button>' +
'<button class="e_header_4 btn btn-sm btn-secondary" type="button" value="h4">h4</button>' +
'<button class="e_paragraph btn btn-sm btn-secondary" type="button" value="p">p</button>' +
'</div>' +
'<div class="btn-group">' +
'<button class="e_unordered_list btn btn-sm btn-secondary" type="button"><i class="fa fa-list-ul"></i></button>' +
'<button class="e_ordered_list btn btn-sm btn-secondary" type="button"><i class="fa fa-list-ol"></i></button>' +
'<button class="e_table_separator btn btn-sm btn-secondary" type="button">1 | 2</button>' +
'</div>' +
'<div class="btn-group">' +
'<button class="e_unordered_list btn btn-sm btn-outline-success" type="button"><i class="fa fa-tag"></i></button>' +
'<button class="e_ordered_list btn btn-sm btn-outline-info" type="button"><i class="fa fa-tag"></i></button>' +
'<button class="e_table_separator btn btn-sm btn-outline-secondary" type="button"><i class="fa fa-tag"></i></button>' +
'</div>' +
'</div>';
this.$editors.html(html);
},
接下来我启用 designMode
。我想在一个页面上拥有尽可能多的独立编辑器,因此我遍历每个 Iframe 并在每个 Iframe 上启用设计模式。
enableDesignMode: function(){
for (i = 0; i < this.$iframes.length; i++) {
this.$iframes[i].contentDocument.designMode = 'on';
}
},
困难来了。我正在尝试将 this.$editors[0]
中按钮的点击事件绑定到 this.$iframes[0]
,以便每个工具栏都附加到正确的编辑器 iframe。
bindEvents: function(){
for (i = 0; i < this.$iframes.length; i++) {
this.$editors[0].on('click', 'e_bold', function(){
this.$iframes[i].contentDocument.execCommand('bold', false, null);
});
}
},
问题:
我收到这个错误,我不明白为什么:
TypeError: this.$editors[0].on is not a function
this.$editors
是 类 的数组...所以 .on
函数肯定适用于此。$editors[i]?
这里是fiddle:https://jsfiddle.net/7q30tuxo/1/
你错了,this.$editors
是一个jQuery对象,不是"an array of classes"。当您执行 this.$editors[0]
时,您将获得一个实际的 HTML 元素。
on
是 jQuery 对象而非 DOM 元素的函数。用 jQuery 包裹你的 this.$editors[n]
:$(this.$editors[0])
编辑:正如凯文在下面的评论中提到的,您没有 select 在 this.$editors
中使用多个元素,因此您不需要解包它:this.$editors.on('click', function(){})
需要说明的是,即使 select 编辑了多个元素,您通常也不需要解包。仅当您需要以不同方式对待 selected 元素时,才需要将它们展开。然而,这是一种味道,我建议重构您的 select or 以便它们 select 只有您打算作为一个元素操作的元素。
问题:
我正在尝试创建一个 WYSIWYG 编辑器,它是模块化的,可重复用于我的博客...不幸的是,我很难让它与多个文本字段一起工作。
工作原理:
编辑器在 Iframe 上启用 document.designMode = 'on'
。
首先我初始化对象:
init: function(){
this.cacheDOM();
this.renderEditor();
this.enableDesignMode();
this.bindEvents();
},
然后缓存DOM
cacheDOM: function(){
this.$editors = $('.editor-toolbar');
this.$iframes = $('.editor-iframe');
},
然后我用我所有的编辑器工具渲染工具栏
renderEditor: function(){
var html = '<div class="text-editor">' +
'<div class="btn-group">' +
'<button class="e_bold btn btn-sm btn-secondary" type="button"><i class="fa fa-bold"></i></button>' +
'<button class="e_italic btn btn-sm btn-secondary" type="button"><i class="fa fa-italic"></i></button>' +
'<button class="e_underline btn btn-sm btn-secondary" type="button"><i class="fa fa-underline"></i></button>' +
'</div>' +
'<div class="btn-group">' +
'<button class="e_align_left btn btn-sm btn-secondary" type="button"><i class="fa fa-align-left"></i></button>' +
'<button class="e_align-center btn btn-sm btn-secondary" type="button"><i class="fa fa-align-center"></i></button>' +
'<button class="e_align-right btn btn-sm btn-secondary" type="button"><i class="fa fa-align-right"></i></button>' +
'</div>' +
'<div class="btn-group">' +
'<button class="e_header_2 btn btn-sm btn-secondary" type="button" value="h2">h2</button>' +
'<button class="e_header_3 btn btn-sm btn-secondary" type="button" value="h3">h3</button>' +
'<button class="e_header_4 btn btn-sm btn-secondary" type="button" value="h4">h4</button>' +
'<button class="e_paragraph btn btn-sm btn-secondary" type="button" value="p">p</button>' +
'</div>' +
'<div class="btn-group">' +
'<button class="e_unordered_list btn btn-sm btn-secondary" type="button"><i class="fa fa-list-ul"></i></button>' +
'<button class="e_ordered_list btn btn-sm btn-secondary" type="button"><i class="fa fa-list-ol"></i></button>' +
'<button class="e_table_separator btn btn-sm btn-secondary" type="button">1 | 2</button>' +
'</div>' +
'<div class="btn-group">' +
'<button class="e_unordered_list btn btn-sm btn-outline-success" type="button"><i class="fa fa-tag"></i></button>' +
'<button class="e_ordered_list btn btn-sm btn-outline-info" type="button"><i class="fa fa-tag"></i></button>' +
'<button class="e_table_separator btn btn-sm btn-outline-secondary" type="button"><i class="fa fa-tag"></i></button>' +
'</div>' +
'</div>';
this.$editors.html(html);
},
接下来我启用 designMode
。我想在一个页面上拥有尽可能多的独立编辑器,因此我遍历每个 Iframe 并在每个 Iframe 上启用设计模式。
enableDesignMode: function(){
for (i = 0; i < this.$iframes.length; i++) {
this.$iframes[i].contentDocument.designMode = 'on';
}
},
困难来了。我正在尝试将 this.$editors[0]
中按钮的点击事件绑定到 this.$iframes[0]
,以便每个工具栏都附加到正确的编辑器 iframe。
bindEvents: function(){
for (i = 0; i < this.$iframes.length; i++) {
this.$editors[0].on('click', 'e_bold', function(){
this.$iframes[i].contentDocument.execCommand('bold', false, null);
});
}
},
问题:
我收到这个错误,我不明白为什么:
TypeError: this.$editors[0].on is not a function
this.$editors
是 类 的数组...所以 .on
函数肯定适用于此。$editors[i]?
这里是fiddle:https://jsfiddle.net/7q30tuxo/1/
你错了,this.$editors
是一个jQuery对象,不是"an array of classes"。当您执行 this.$editors[0]
时,您将获得一个实际的 HTML 元素。
on
是 jQuery 对象而非 DOM 元素的函数。用 jQuery 包裹你的 this.$editors[n]
:$(this.$editors[0])
编辑:正如凯文在下面的评论中提到的,您没有 select 在 this.$editors
中使用多个元素,因此您不需要解包它:this.$editors.on('click', function(){})
需要说明的是,即使 select 编辑了多个元素,您通常也不需要解包。仅当您需要以不同方式对待 selected 元素时,才需要将它们展开。然而,这是一种味道,我建议重构您的 select or 以便它们 select 只有您打算作为一个元素操作的元素。