jQuery / javascript: проблема webTit clearTimeout - PullRequest
1 голос
/ 31 марта 2012

В ответ на мой предыдущий вопрос у меня возникли проблемы со следующим кодом в браузерах 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 последний метод clearTimeout на renderHandler не позволяет функции renderNote бытькоторый позволяет мне обрабатывать исключения в событии focusout.Тем не менее, в браузерах webkit renderNote вызывается независимо.

Я попытался вернуть, вернуть ложное значение, protectDefault, stopPropagation, break, но без радости.Кто-нибудь сталкивался с этим раньше?

Вот ссылка: http://www.kryptonite -dove.com / sandbox / animate

Если вы дважды щелкнете по телу, то нажмите натело примечания вы можете увидеть его в действии.

1 Ответ

2 голосов
/ 01 апреля 2012

Примечание, $.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/

...