首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

掌握 Dojo 富文本编辑器(3)

掌握 Dojo 富文本编辑器(3)

处理事件和实现功能接下来,是让 Find and Replace 按钮真正开始工作的步骤。可以在 setToolbar 方法中进行设置,如清单 11 所示。
清单 11. 处理事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
setToolbar: function(editorToolbar){
    ...
    var tb = this._frToolbar = ...
     
    // Connect methods to the onClick events of the buttons.
    this.connect(tb.findButton, "onClick", "_find");
    this.connect(tb.replaceButton, "onClick", "_replace");
    this.connect(tb.replaceAllButton, "onClick", "_replaceAll");
     
    // Make the ENTER key work for the "Find" text field.
    this.connect(tb.findField, "onKeyDown", function(evt){
        if(evt.keyCode == dojo.keys.ENTER){
            this._find();
            dojo.stopEvent(evt);
        }
    });
     
    ...
}




非常简单。下一步是实现 _find 功能。对于非 IE 浏览器,只需要使用 window.find 即可。对于 IE,事情变得有点复杂。需要编写一个适配器函数来消除浏览器差异,如清单 12 所示。
清单 12. 实现查找功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// An adapter function to make all browsers look the same.
_findText: function(txt, isCaseSensitive, isBackwards){
    if(!txt){ return false; }
    var ed = this.editor, win = ed.window, doc = ed.document;
    var found = false;
    if(win.find){
        found = win.find(txt, isCaseSensitive, isBackwards,
            false, false, false, false);
    }else if(doc.selection){
        /* IE */
        // Focus to restore position/selection,
        // then shift to search from current position.
        ed.focus();
        var txtRg = doc.body.createTextRange();
        var curPos = doc.selection ? doc.selection.createRange() : null;
        if(curPos){
            txtRg.setEndPoint(isBackwards ? "EndToStart" : "StartToEnd",
                curPos);
        }
        var flags = isCaseSensitive ? 4 : 0;
        if(backwards){
            flags = flags | 1;
        }
        found = txtRg.findText(txt, txtRg.text.length, flags);
        if(found){
            txtRg.select();
        }
    }
    return found;
},
_find: function(){
    var tb = this._frToolbar;
    return this._findText(tb.findField.get("value"),
        tb.matchCase.get("value"), tb.backwards.get("value"));
}




再次运行页面,查看效果,如图 5 所示。
图 5. 查找文本现在,您在大多数现代浏览器中具备了有用的 Find 功能。
通过编程方式编辑内容Dojo 富文本编辑器提供了一个统一 API execCommand,可以使用它调用内置命令。有许多命令可用,比如 ndo、Redo、Cut、Copy、Paste、Bold 和 Italic。要获得内置命令的完整列表,请参考 dijit.Editor 文档(参见 参考资料)。
对于示例插件,需要向编辑器插入一些文本来替换选中的文本。当然,有一个内置的命令可以完成这个操作 —inserthtml。您必须执行下面的操作:
  • 检查选中的文本是否匹配                        find 字段中的文本。
  • 如果是的话,调用 editor.execCommand("inserthtml", replaceText);
清单 13 显示了代码。
清单 13. 实现替换功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        _replace: function(){
    var tb = this._frToolbar;
    var txt = tb.findField.get("value");
    if(!txt){ return false; }
     
    var repTxt = tb.replaceField.get("value") || "";
    var isCaseSensitive = tb.caseSensitive.get("value");
    var isBackwards = tb.backwards.get("value");
    var ed = this.editor;
    ed.focus();
     
    //Replace the current selected text if it matches the find field.
    var selected = dojo.withGlobal(ed.window, "getSelectedText",
        dijit._editor.selection, [null]);
    if(selected && (isCaseSensitive ?
        (selected === txt) : (selected.toLowerCase() === txt.toLowerCase()))){
        ed.execCommand("inserthtml", repTxt);
        return true;
    }
    return false;
}




您应该在编辑器中使用浮动框架窗口调用 getSelectedText,而不是在整个页面的窗口。图 6 显示了结果。  
图 6. 替换文本您现在了解了编写编辑器插件的基本细节。也许您可以自己实现一个 Replace All 功能作为练习。
返回列表