2010-11-10 4 views
0

avec le script, demander au serveur envoie toujours une chaîne vide (même si la valeur est pas emtpty), où la ligne de données est:Pourquoi JQuery .val() renvoie une chaîne vide? ci-dessous

data: "{ 'folderName': '" + $(this).val() + "' }" 

L'élément html à l'étude est la suivante:

<asp:TextBox id="searcher" runat="server" ClientIDMode="Static" CssClass="classificationFolder" /> 

Script est:

<script type="text/javascript"> 
$(document).ready(function() { 
    $(".classificationFolder").each(function() { 
     $(this).autocomplete({ 
      source: function (request, response) { 
       $.ajax({ 
        url: "Services/svcFolder.asmx/SearchFolders", 
        data: "{ 'folderName': '" + $(this).val() + "' }", 
        dataType: "json", 
        type: "POST", 
        contentType: "application/json; charset=utf-8", 
        dataFilter: function (data) { return data; }, 
        success: function (data) { 
         response($.map(data.d, function (item) { 
          return { 
           value: item.Name, 
           label: item.Name + " " + item.Type 
          } 
         })) 
        }, 
        error: function (XMLHttpRequest, textStatus, errorThrown) { 
         alert(XMLHttpRequest.responseText); 
        } 
       }); 
      }, 
      minLength: 2, 
     }); 
    }) 
}); 

rEA fils que je sélectionne les éléments par le sélecteur de classe css ($ (". classementFolder")) est que, ce contrôle est un contrôle utilisateur et utilisé dans la même page plus d'une fois. C'est pourquoi je n'utilise pas $ ("# searcher").

J'ai testé le code dans IE8 et Chrome 8.0.552.28 bêta. Ce problème survient dans les deux navigateurs. D'autre part, la requête est envoyée au serveur, la réponse du client a bien été reçue et la réponse est traitée sur le client.

Alors quelqu'un a une idée de la raison pour laquelle $ (this) .val() renvoie toujours une chaîne vide?

Répondre

7

Je pense qu'il s'agit d'un problème de portée/contexte: this ne se réfère plus à l'élément d'entrée, mais à la saisie semi-automatique.

Try stocker this comme une variable temporaire:

$(".classificationFolder").each(function() { 
     var input_reference = this; 
     $(this).autocomplete({ 
      source: function (request, response) { 
       $.ajax({ 
        url: "Services/svcFolder.asmx/SearchFolders", 
        data: "{ 'folderName': '" + $(input_reference).val() + "' }", 
... 
+2

+1 Pas besoin de conjecture, vous avez raison sur Scope. Mais 'this' dans son cas fait référence à la fermeture la plus proche, probablement les options ajax ou la fonction anonyme dans le paramètre' source'. – Stephen

+0

Qu'est-ce que "la saisie semi-automatique"? – AndreKR

+0

@AnreKR Je veux dire que l'objet est passé à la fonction 'autocomplete', mais @Stephen est probablement plus correct avec son évaluation. –

1

Le rappel source n'a pas été exécuté dans le contexte de l'élément.
this n'est pas ce que vous pensez que c'est.

Vous devez enregistrer une référence à this dans le rappel externe each.

0

Peut-être que this ne pointe pas vers le champ de saisie. Le paramètre request de votre fonction de rappel n'est-il pas la valeur que vous recherchez?

Questions connexes