2009-07-07 7 views
1

Ich versuche, eine Ajax-Suche \ suggest-Box zu verwenden. Ich benutze jQuery, um mit dem Textfeld umzugehen, das den Fokus verliert. Wenn ich jedoch auf einen Link in der Vorschlagsliste klicke, löst jQuery das Blur-Ereignis aus und die Verknüpfung wird nicht befolgt. Hier ist der jQuery-Code:jQuery Blur Fires Bevor href

$(document).ready(function() { 

    $('#lstxt').click(function() { 
     this.value = ''; 
    }); 
    $('#lstxt').blur(function() { 
     this.value = 'Database Search'; 
     document.getElementById('ls').innerHTML=''; 
     document.getElementById('ls').style.border='0px'; 
    }); 
}); 

Wie bekomme ich es nicht feuern .blur, wenn ein Link in der Vorschlagsliste geklickt wird (id = „ls_table“)?

Antwort

0

versuchen diesen Code:

$(document).ready(function() { 

    $('#lstxt').click(function() { 
     this.value = ''; 
     return true; 
    }); 
    $('#lstxt').blur(function() { 
     this.value = 'Database Search'; 
     $('#ls').html('').css('border',"0px"); 
     return true; 
    }); 
}); 

edit: Unschärfe wird ausgelöst, wenn Sie außerhalb eines Textfeldes klicken. ist lstxt ein Textfeld?

edit2: Sie müssen das Blur-Event lösen und es bedingt neu binden. Ich würde weitere Informationen über das Seitenlayout müssen Sie sagen, wie es zu tun

6
var global_switch = false; 
$('#ls_table').hover (
    function() { global_switch = true; }, 
    function() { global_switch = false; } 
) 
$('#lstxt').blur(function() { 
    if (global_switch) { return; } else { ...}); 

Dies ist nur ein Proof of Concept. Wie immer sind globale Variablen schlecht. Werfen Sie einen Blick auf jQuery data API, um es zu umgehen.

Cheers,

+0

das ist ein guter Vorschlag, dass wir verwendet haben, +1;) – Bozho

3

Die Methode, die ich verwenden, wenn eine leichte Verzögerung meines eigenen setze hinzu:

$('#lstxt').blur(function(){ 
    setTimeout(function(){ 
     // original blur code here 
    }, 250); 
}); 

Auf jeden Fall nicht die beste Lösung (aber in der Regel funktioniert). Aber Boldewyns Lösung sollte funktionieren - vorausgesetzt, dass #ls_table erstellt wurde, bevor Sie versuchen, sie zuzuweisen. Wenn Sie erstellen/zu zerstören #ls_table häufig, können Sie das Ereignis an das übergeordnete Element binden:

// just using the data API for jquery. 
$('#ls').hover(
    function(){ $('#ls').data('autocompleteover', 1); }, 
    function(){ $('#ls').data('autocompleteover', 0); } 
); 
$('#lstxt').blur(function(){ 
    if($('#ls').data('autocompleteover')) 
     return; 
    // original blur code here 
} 
+0

Das ist nicht der richtige Weg. Aber bis jetzt ist das der beste Weg, um zu wissen, wie man arbeitet –

0

Ich schaffe ähnliches Problem (mit einigen benutzerdefinierten Validator auf Unschärfe, die vor, klicken Sie auf Schließen-Schaltfläche gefeuert wurde - aber ich will Dialog (klick) ohne diese Unschärfe Ereignis schließen gefeuert) Code auf Eingang (mit Validator):

 .. 
     $(this).blur({validators: validators}, function(event){ // blur             
     (function($this){ 
     validator_timeout = setTimeout(function(){ // validator_timeout is global 
      $this.validate(event.data.validators); // do some validation 
     }, 50); // delay just minimum of time, but enough to let other event to be fired 
     }($(this))); // passing $(this) to function 
     });... 

und anderen Event-Handler, wie Dialog schließen, wenn wir die Funktion auf nicht nennen wollen validate, lösche einfach validator_timeout, um die Unschärfe zu unterdrücken:

click_function = function(){       
     clearTimeout(validator_timeout); 
     $(this).dialog("close"); 
    } 

Ich hoffe, es wird für jemanden nützlich sein.