在上一个问题的背面,我在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, " "); // 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
如果你双击身体,然后点击你可以看到它的实际注释的正文。
答案 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>");
}