2016-07-12 3 views
0

Ich versuche hart, dieses Problem zu beheben, aber immer noch nicht die Lösung, versuchte viele Links und Code, aber mit einem kleinen Problem, um dies zu beheben.automatische Suche (Ajax Anruf) funktioniert nicht nach dem Klicken auf die Schaltfläche

PROBLEM:

Ich habe einen Eingabetyp ‚Text‘ die Mitarbeiter Namen zu suchen. Wenn ich anfange, Zeichen wie "WY" einzugeben, werden alle Namen angezeigt, die mit WY beginnen.

enter image description here

Sobald ich die Mitarbeiter ich brauche, kann ich das mit anderen Steuer- und Run PDF-Bericht bewegen (die in einem anderen Tab lädt). Das Problem ist, wenn ich zurück zu der Seite gehe, wo ich anfangen sollte, die Angestellten wieder zu suchen, wird es nicht suchen! wie unten dargestellt:

enter image description here

Hier ist meine Ajax-Code:

$("#EmployeeSearchBox").bind('input propertychange', function() { 
    if ($('#EmployeeSearchBox').val() != '') { 
     $('#EmployeeList').empty(); 

     $.ajax({ 
      type: "GET", 
      url: "SomeSelectionPage.aspx/GetEmployees", 
      data: { 'searchText': "'" + $("#EmployeeSearchBox").val() + "'" }, 
      dataType: 'json', 
      contentType: 'application/json; charset=utf-8', 
      success: function (data) { 
       //alert('success'); 
       if (data.d.length > 0) { 
        $("#EmployeeList").removeClass("hideControl").addClass("showControl"); 
       } 
       else { 
        $("#EmployeeList").removeClass("showControl").addClass("hideControl"); 
        // $('select').multipleSelect(); 
        alert("No data"); 
       } 
       $.each(data.d, function (index, value) { 
        $('#EmployeeList').append($('<option>').text(value.FullName).val(value.EmployeeId)); 

       }); 
      },     
      error: function (XMLHttpRequest, textStatus, errorThrown) { 
       alert("Status: " + textStatus); alert("Error: " + XMLHttpRequest.responseText); 
      } 
     }); 
    } 
    else { 
     $('#EmployeeList').empty(); 
     $("#EmployeeList").addClass("hideControl"); 
    } 
}); 

UI-Steuerung:

<input type="text" id="EmployeeSearchBox" class="search-box" aria-multiselectable="true" /> 

Bitte lassen Sie mich wissen, was soll ich es fest bekommen tun .

+0

Wo ist Ihr "Ajax-Code" definiert und geladen werden? Sie müssen diesen Code bei jedem Laden des ersten Tabs ausführen lassen. – GregL

+0

Meinst du, ich muss die Ajax-Methode noch einmal anrufen? – Manjuboyz

+0

Wie es aussieht, scheint es, wenn Sie die Tabs ändern, das HTML innerhalb der Registerkarte neu geladen wird. Wenn dies möglicherweise der Fall ist, können Sie mehr Code bereitstellen und zeigen, wie die Registerkarten geladen sind und wo/wann das Ereignis 'input propertychanged' gefunden wurde? – fafafooey

Antwort

0

Am upvoting den Vorschlag von „Clement Amarnath“ zur Verfügung gestellt, die mir geholfen, dieses Problem zu lösen.

ich das Update für dieses, statt mit .Bind(), gefunden habe ich .on() innen (document), bin die Antwort zu veröffentlichen, die ich es behoben haben. Danke allen!

$(document).on("input propertychange", "#EmployeeSearchBox", function() { 

    if ($('#EmployeeSearchBox').val() != '')  { 
     $('#EmployeeList').empty(); 

     $.ajax({ 
      type: "GET", 
      url: "SomeSelectionPage.aspx/GetEmployees", 
      data: { 'searchText': "'" + $("#EmployeeSearchBox").val() + "'" }, 
      dataType: 'json', 
      contentType: 'application/json; charset=utf-8', 
      success: function (data) { 
       //alert('success'); 
       if (data.d.length > 0) { 
        $("#EmployeeList").removeClass("hideControl").addClass("showControl"); 
       } 
       else { 
        $("#EmployeeList").removeClass("showControl").addClass("hideControl"); 
        // $('select').multipleSelect(); 
        alert("No data"); 
       } 
       $.each(data.d, function (index, value) { 
        $('#EmployeeList').append($('<option>').text(value.FullName).val(value.EmployeeId)); 

       }); 
      }, 
      //error: function (XMLHttpRequest, textStatus, errorThrown) { 
      // alert(textStatus); 
      //} 
      error: function (XMLHttpRequest, textStatus, errorThrown) { 
       alert("Status: " + textStatus); alert("Error: " + XMLHttpRequest.responseText); 
      } 
     }); 
    } 
    else { 
     $('#EmployeeList').empty(); 
     $("#EmployeeList").addClass("hideControl"); 
    } 
}); 

HINWEIS: unter Leitung funktioniert auch: .live() Methode

$("#EmployeeSearchBox").live('input propertychange', function() {... }); 
+0

Sie sollten Ihre eigene Antwort akzeptieren, damit die Frage als beantwortet gilt. – GregL

+0

Es sagt, Antwort in 2 Tagen zu akzeptieren, wird das nach 2 Tagen tun. – Manjuboyz

1

Dies könnte der Grund für das Problem seiner

Die $("#EmployeeSearchBox").bind('input propertychange', function() { ..}); nicht im DOM zur Verfügung.

Um sicherzustellen, dass der EmployeeSearchBox- und der propertyChange-Handler noch aktiv sind, platzieren Sie eine Warnung in der Eigenschaft propertychange. Wenn die Warnung angezeigt wird, ist das Problem woanders.


$("#EmployeeSearchBox").bind('input propertychange', function() { 
    if ($('#EmployeeSearchBox').val() != '') { 

     alert("Inside Property Change "); // Add this alert 
     $('#EmployeeList').empty(); 

     $.ajax({ 
      type: "GET", 
      url: "SomeSelectionPage.aspx/GetEmployees", 
      data: { 'searchText': "'" + $("#EmployeeSearchBox").val() + "'" }, 
      dataType: 'json', 
      contentType: 'application/json; charset=utf-8', 
      success: function (data) { 
       //alert('success'); 
       if (data.d.length > 0) { 
        $("#EmployeeList").removeClass("hideControl").addClass("showControl"); 
       } 
       else { 
        $("#EmployeeList").removeClass("showControl").addClass("hideControl"); 
        // $('select').multipleSelect(); 
        alert("No data"); 
       } 
       $.each(data.d, function (index, value) { 
        $('#EmployeeList').append($('<option>').text(value.FullName).val(value.EmployeeId)); 

       }); 
      },     
      error: function (XMLHttpRequest, textStatus, errorThrown) { 
       alert("Status: " + textStatus); alert("Error: " + XMLHttpRequest.responseText); 
      } 
     }); 
    } 
    else { 
     $('#EmployeeList').empty(); 
     $("#EmployeeList").addClass("hideControl"); 
    } 
}); 

, was Sie binden meine ich es wieder

Dies ist die Funktion, die die EmployeeSearchBox mit dem DOM verbindlich $("#EmployeeSearchBox").bind('input propertychange', function() {.... und wenn Sie auf die PDF bewegen Tab und wieder zurück zu SearchBox Registerkarte die Bindung dieses Elements ist verloren, es bedeutet, dass das DOM nicht weiß, was zu tun ist, wenn die Änderung der Eigenschaft auf der EmployeeSearchBox ausgelöst wird. Zwei Möglichkeiten, es zu lösen

1) Stellen Sie sicher, dass der Ereignishandler immer im DOM vorhanden ist, auch wenn Sie zwischen den Registerkarten navigieren.

2) Wenn die Option 1 in Ihrem Szenario nicht erreichbar ist, bitten wir Sie, die Ereignisbehandlungsroutinen erneut zu binden, wenn Sie auf die Suchregisterkarte kommen. Aktivieren Sie explizit diese $("#EmployeeSearchBox").bind, wenn Sie auf der Registerkarte Suche sind.

+0

Das erste Mal fange ich an, den Text einzugeben, Alarm zeigt. Beim zweiten Mal wird die Warnung jedoch nicht im Propertychange-Handler ausgelöst. – Manjuboyz

+0

Wenn die neue Warnung nicht zum zweiten Mal angezeigt wird, ist klar, dass die 'EmployeeSearchBox 'nicht bind ist. Bitte binden Sie es erneut und es wird funktionieren. –

+0

Was du sagst, ergibt Sinn, aber was meinst du damit, es wieder zu binden? – Manjuboyz

0

Bitte überprüfen Sie, ob der Ajax-Aufruf für Ihre zweite Suche ausgelöst wurde. Wenn nicht, muss ein Problem im Zustandsprüfbereich oder der Funktionsaufrufmethode vorliegen. Ich benutze immer diese Funktion für die Suche Daten

$("input").change(function(){ 
    ajax call..... 
}) 
+0

Danke, aber es funktioniert nicht. – Manjuboyz