如何区分textarea与CKEDITOR?判断lastFocusedInput对象类型的方法
优雅处理不同聚焦对象的粘贴需求
Great question! Instead of writing a bunch of clunky type checks, there are cleaner, more maintainable ways to handle this scenario—let’s break them down:
1. 用特征属性做精准判断(比重复测试更简洁)
Instead of relying on typeof or messy conditional chains, leverage the unique properties/methods each object type exposes:
- 判断CKEDITOR编辑器实例:CKEDITOR编辑器有标志性的
setData()方法(通常还有instanceName属性),可以直接检查这个特征:
如果你确定CKEDITOR已经加载完成,也可以用if (lastFocusedInput && typeof lastFocusedInput.setData === 'function') { // 这是CKEDITOR实例,用setData粘贴内容 lastFocusedInput.setData('要粘贴的内容'); }instanceof做更严格的类型判断:if (lastFocusedInput instanceof CKEDITOR.editor) { // 处理CKEDITOR粘贴逻辑 } - 判断jQuery输入对象(包括textarea/input):jQuery对象自带
jquery属性,还能通过is()方法轻松区分textarea和普通输入框:if (lastFocusedInput && lastFocusedInput.jquery) { // 这是jQuery包装的输入元素 if (lastFocusedInput.is('textarea')) { // 处理textarea粘贴 lastFocusedInput.val('要粘贴的内容'); } else { // 处理普通input粘贴 lastFocusedInput.val('要粘贴的内容'); } }
2. 更巧妙的方案:封装统一的粘贴接口
最优雅的方式是提前抹平不同对象的差异,后续使用时完全不用判断类型。在捕获聚焦元素的同时,给它绑定一个标准的paste方法:
// 处理jQuery输入框(input/textarea) $('input, textarea').on('focusin', function() { lastFocusedInput = $(this); // 添加统一的paste方法 lastFocusedInput.paste = function(content) { this.val(content); }; }); // 处理CKEDITOR编辑器 Object.values(CKEDITOR.instances).forEach(editor => { editor.on('focus', function() { lastFocusedInput = editor; // 添加统一的paste方法 lastFocusedInput.paste = function(content) { this.setData(content); }; }); }); // 后续粘贴时,直接调用统一方法即可! if (lastFocusedInput && typeof lastFocusedInput.paste === 'function') { lastFocusedInput.paste('你的粘贴内容'); }
这种方式把“如何粘贴”的逻辑和对象类型解耦,每次粘贴都不用再写一堆条件判断,代码会清爽很多。
3. 区分textarea和CKEDITOR的小细节
如果确实需要明确区分原生textarea和CKEDITOR实例:
- 对于jQuery包装的textarea:直接用
lastFocusedInput.is('textarea')判断 - 对于CKEDITOR实例:它对应的原生textarea元素可以通过
editor.element.$获取,也可以用editor.element.is('textarea')确认,但用上文的统一粘贴方法后,这种场景其实很少见
内容的提问来源于stack exchange,提问作者Krzysztof Przygoda
相关产品推荐
相关产品推荐

