2012-03-30 2 views
1

Ich verwende derzeit den folgenden Code, um in einem Textbereich eingegebene Daten in HTML zu ändern, die in einem Absatzelement auf meiner Website eingegeben wurden.jQuery: Hinzufügen von Ausnahmen zum Fokussieren des Ereignisses

Änderungen werden vorgenommen, wenn der Benutzer den Fokus auf das TextArea-Element verliert, ich möchte jedoch Ausnahmen hinzufügen. Im Moment habe ich Code, der ausgewählten Text in das Textfeld in [b] [/ b] (bb-Code-Tags) umschließt. Wenn Sie jedoch auf den Link klicken, der diese Funktion aufruft, verliert der Textbereich den Fokus und wechselt in einen Absatz.

Wie kann ich Ausnahmen zum Fokusout hinzufügen? Wenn also auf ein Element mit der Klasse textEdit geklickt wird, das als Ausnahme betrachtet wird, und der Code zum Ersetzen der TextArea nicht ausgeführt wird?

$("textarea").live('focusout', function (e) { 

var $target = $(event.target); 

if ($target.is(".textEdit")) { 

    } else { 
var itemContent = $(this).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>") 

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

} 

}); 

Danke, wie immer für jede Beratung!

Edit: Sa 31. März 10.30 Uhr BST

ich auch versucht:

if ($("#bold").is(":focus")) 

und immer das aktive Element $ (document.activeElement), die nur BODY zurück, wenn Sie auf etwas. Wirklich wirklich fest mit diesem würde jede Hilfe oder Ratschläge, wie Sie vorgehen, lieben!

Antwort

2

ich es mit Timeouts tun würde ...

var renderHandler; 

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

// handle exceptions 
$('#bold, #other_exception_element, .and_yet_another_exception').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>"); 
} 
+0

Ich werde es mal geben, ich Timeouts dachte, aber es scheint, als ob es eine Möglichkeit sein sollte, das Click-Ereignis eines Elements zu erfassen und verwende das als Ausnahme. Nach 3 Tagen schlug ich meinen Kopf dagegen obwohl ich verzweifelt bin! :) – KryptoniteDove

+1

Sie können nicht wirklich, weil der Fokus vor jedem Ereignis passiert, das auf einem anderen Element geschieht. Es macht Sinn, wenn Sie die Logik der Reihenfolge denken, in der Dinge passieren müssen. Sie können nicht logisch auf etwas klicken während etwas anderes noch den Fokus behält ... –

+0

Ja, das macht Sinn, ich glaube, ich habe es völlig falsch angegangen und es so sehr angeschaut, dass ich das Holz für die Bäume nicht sehen kann! habe gerade deine Lösung getestet und es funktioniert perfekt! ich danke dir sehr! – KryptoniteDove