如何加快我的javascript粘贴操作?

时间:2013-03-19 15:45:24

标签: javascript jquery regex

我在我的应用程序中使用了一个NicEdit富文本编辑器(基于内容的可编辑div),用户喜欢从单词粘贴。

所以我想删除任何可能粘贴的垃圾标签。

这是我目前正在做的事情。

//build regex to match junk tags
var unwantedtags = [ "font", "span", "table", "tbody", "div", "td", "tr", "input", "a", 
    "body", "button", "form", "head", "img", "select", "textarea", "tfoot", "th", "iframe", "object" ];     
var unwantedregexstring= "";
$.each(unwantedtags, function(index, value) {
    if(unwantedregexstring!= "") {
        unwantedregexstring += "|";
    }
    unwantedregexstring+= "<" + value + ">";
    unwantedregexstring+= "|";
    unwantedregexstring+= "<" + value + "\\s[^>]*>";
    unwantedregexstring+= "|";
    unwantedregexstring+= "</" + value + ">";
});
var unwantedRegex = new RegExp(unwantedregexstring, "igm");

//replace junk tags with nothing
function CleanMSWordPaste(mswordtext) {
    return  mswordtext.replace(unwantedRegex, "");
}

//Function that gets Executed on Paste event
function ExecutePaste(){

    //preserve user's selected text
    var oldRng = document.selection.createRange();

    //create paste area off screen and paste there
    $('body').append("<div id='paster' contenteditable='true' style='height:1px;width:1px;position:fixed;left:-100px;top:-100px;'></div>");
    $('#paster').focus();
    $('#paster')[0].document.execCommand('paste', null, null);

    //if html contains junk tags
    if(unwantedRegex.test($('#paster').html())) {
        //replace html with cleaned html
        $('#paster').html(CleanMSWordPaste($('#paster').html()));

        //select all content of paste area
        var rng = document.body.createTextRange();
        rng.moveToElementText($('#paster')[0]);
        rng.select();

        //copy cleaned html
        $('#paster')[0].document.execCommand('copy', null, null);
    }

    //remove paste area from dom
    $('#paster').remove();

    //restore user's selected text
    oldRng.select();

    //preserves scroll position, focuses NicEditor and performs doc.execCommand('paste')
    //performance of this alone is fine.
    ExecCommand('paste');
}

我发现这需要相当长的时间(来自单词的前1页)。有什么办法可以加快速度吗?我正在考虑某种正则表达式优化,但我并不知道正则表达式如何工作。

2 个答案:

答案 0 :(得分:1)

你可以做的一件事是保存对$('#paster')的引用,这样你就不必经常重新运行$(),这是一个相当复杂的函数,可能非常繁重。

$paster = $('#paster') //dollar sign in variable name not necessary
                       //I just do it so I know it's a JQuery object.
unwantedRegex.test($paster.html());
$paster.focus();
//etc

另外

$('#paster')[0].document.execCommand('copy', null, null);

不确定你正在使用的是什么$('#paster')[].document你应该能够运行document.execCommand(),不是吗?

答案 1 :(得分:1)

您的unwantedregexstring似乎最终会看起来像这样:

'<font>|<font\s[^>]*>|</font>|<span>|<span\s[^>]*>|</span>|...'

我不是regexp引擎内部的专家,但对我来说这看起来有点过于冗长。如果您更改算法以使unwantedregexstring看起来像这样,该怎么办?

'</?(font|span|...)\s?.*?>'

这将寻找一个<后跟一个可选的/,后跟一个指定的标签,后跟一个可选的空白字符,后跟零或更多,但尽可能少的任何字符,直到遇到了结束>