jQuery / javascript:webkit clearTimeout问题

时间:2012-03-31 19:25:38

标签: javascript jquery google-chrome safari webkit

在上一个问题的背面,我在webkit浏览器Safari和Chrome中遇到以下代码时出现问题: -

// Textarea focus out event.
var renderHandler;


$("textarea").live('focusout', function (e) {
   var currentNote = this;
   renderHandler = setTimeout( function(){ renderNote(currentNote); }, 100);
});

// handle exceptions
$('.textEdit').live('focusin', function (e) {
   clearTimeout(renderHandler);

});



function renderNote( note ){
var itemContent = $(note).val();
    itemContent = htmlStrip(itemContent);
    itemContent = itemContent.replace(/\n/g, "<br/>"); // New lines
    //itemContent = itemContent.replace(/\s/g, " &nbsp;"); // Spaces

// Formatting replacements
itemContent = itemContent
    .replace(/\[b\]/gi, "<b>")
    .replace(/\[\/b\]/gi, "</b>")
    .replace(/\[i\]/gi, "<i>")
    .replace(/\[\/i\]/gi, "</i>")
    .replace(/\[s\]/gi, "<s>")
    .replace(/\[\/s\]/gi, "</s>");

$(note).replaceWith("<p class='notes'>"+ itemContent +"</p>");
}

在firefox中,最新的renderHandler上的clearTimeout阻止调用函数'renderNote',这允许我处理focusout事件的异常。但是在webkit浏览器中,无论如何都会调用renderNote。

我已经尝试过return,return false,preventDefault,stopPropagation,break但没有快乐。有没有人遇到过这个?

下面是一个链接:http://www.kryptonite-dove.com/sandbox/animate

如果你双击身体,然后点击你可以看到它的实际注释的正文。

1 个答案:

答案 0 :(得分:2)

注意,$.live()已弃用;应该使用$.on()$.delegate()代替。出于某种原因,正确使用其中任何一个都会继续逃避我,所以我不能建议如何做到这一点,但你应该考虑避免$.live(),因为它最终将被删除,并且,就是说,性能问题。

据我所知,行:

$('.textEdit').live('focusin', function (e) {

永远不会在Chrome中运行。没关系,因为它好像是

$('.textEdit').live('click', function (e) {

应该工作得很好。

我会修改你的方法并使用一个块变量,而不是取消超时。例如:

var renderHandler,
    blockRender = false;

$("textarea").live('focusout', function (e) {
    var currentNote = this;
    renderHandler = setTimeout(function(){ 
        renderNote(currentNote); 
    }, 100);
});

$('.textEdit').live('click', function (e) {
    blockRender = true;
});

然后在renderNote()

function renderNote( note ){
    var itemContent = $(note).val();

    if (blockRender) {
        blockRender = false;
        return false;
    }

    itemContent = htmlStrip(itemContent);
    itemContent = itemContent.replace(/\n/g, "<br/>");

    itemContent = itemContent
        .replace(/\[b\]/gi, "<b>")
        .replace(/\[\/b\]/gi, "</b>")
        .replace(/\[i\]/gi, "<i>")
        .replace(/\[\/i\]/gi, "</i>")
        .replace(/\[s\]/gi, "<s>")
        .replace(/\[\/s\]/gi, "</s>");

    $(note).replaceWith("<p class='notes'>"+ itemContent +"</p>");
}

http://jsfiddle.net/TsuZn/3/