2010-11-04 6 views
1

J'ai déclaré deux variables, COURSE_ID_List et COURSE_ID_timerId. Ils sont ensuite passés en tant que paramètres à la fonction SetFilter à partir de l'événement OnKeyUp.Référence à une variable Javascript dans un problème d'événement OnKeyUp

Si la liste n'est pas définie, elle doit l'initialiser. Le problème est que la liste est toujours indéfinie, donc je suppose que la LISSE_ID_List utilisée dans l'événement OnKeyUp est transmise par valeur et non par référence. Comment puis-je contourner cela?

Merci

<script type="text/javascript"> 

function SetFilter(ddl, value, list, timerId) { 
    if (list == undefined) 
    list = new ListFilter(ddl); 
    clearTimeout(timerId); 
    timerId = setTimeout(function() { list.SetFilter(value);}, 1500); 
} 

var COURSE_ID_List; 
var COURSE_ID_List_timerId; 

</script> 

<input name="Course" type="text" id="COURSE_ID" onKeyUp="SetFilter('COURSE_ID', this.value, COURSE_ID_List, COURSE_ID_List_timerId);" /> 
+0

Notez que le * keyup * événement est pas une bonne façon de détecter l'entrée d'utilisateur. Il existe d'autres événements que vous pouvez utiliser pour attraper d'autres types de données, comme le collage ou le glisser-déposer. Voir http://whattheheadsaid.com/2010/09/effective-detecting-user-input-in-javascript –

Répondre

0

Je pense que c'est peut-être la réponse que vous recherchez.

(function() { 
    var COURSE_ID_List = {}, 
    COURSE_ID_List_timerId = {}; 
    window.setFilter=function(ddl, value) { 
     var list = COURSE_ID_List[ddl]; 
     if (!list) { 
      list = new ListFilter(ddl); 
     } else if(list.getFilter() == value) { 
      return; 
     } 
     var timerId = COURSE_ID_List_timerId[ddl]; 
     if (timerId) { 
      clearTimeout(timerId); 
     } 
     COURSE_ID_List_timerId[ddl] = setTimeout(function() { list.SetFilter(value); }, 1500); 
     COURSE_ID_List[ddl] = list; 
     return; 
    } 
})(); 

et

<input name="Course" type="text" id="COURSE_ID" onkeyup="setFilter('COURSE_ID', this.value);" onblur="setFilter('COURSE_ID', this.value);" /> 
1

Modification ...

function SetFilter(ddl, value) { 
    if (COURSE_ID_List == undefined) 
    COURSE_ID_List = new ListFilter(ddl); 
    clearTimeout(COURSE_ID_List_timerId); 
    COURSE_ID_List_timerId = setTimeout(function() { COURSE_ID_List.SetFilter(value);}, 1500); 
} 

et

onKeyUp="SetFilter('COURSE_ID', this.value);" 

Une approche plus générique utiliserait le prototypage ...

var Lists = { COURSE_ID_List: null, ... }; 

function SetFilter(ddl, value, list) { 
    if (Lists[list] == null) 
    Lists[list] = new ListFilter(ddl); 
    clearTimeout(COURSE_ID_List_timerId); 
    COURSE_ID_List_timerId = setTimeout(function() { Lists[list].SetFilter(value);}, 1500); 
} 
+0

Il pourrait y avoir plus que la liste par ex. COURSE_ID_List et SUBJECT_ID_List. La façon dont cela fonctionne en ce moment est qu'il existe une fonction SetFilter spécifique pour chaque liste, comme vous l'avez fait. J'espérais juste qu'il y aurait un moyen d'avoir une seule fonction générique SetFilter. – user497075

+0

Vous pouvez utiliser le prototypage pour résoudre ce problème. –

1

Passer par référence est gênant en JavaScript. Les objets ont uniquement leur valeur transmise par référence, ainsi réattribuer à un nom de variable entraîne la nouvelle valeur du nom de variable, mais la variable d'origine conserve sa valeur.

J'allais publier une solution similaire à Yves M, mais je vois de vos commentaires que vous avez déjà essayé cela. L'autre solution consiste à utiliser des objets et à manipuler leurs propriétés à la place. Quelque chose comme ce qui suit est ce que je pense que vous essayez d'atteindre,

function SetFilter(ddl, value) { 
    if (Lists[ddl] == undefined) 
    Lists[ddl] = new ListFilter(ddl); 

    clearTimeout(List_timerIds[ddl]); 
    List_timerIds[ddl] = setTimeout(function() { list.SetFilter(value);}, 1500); 
} 

var Lists = {}; 
var List_timerIds = {}; 

Aussi, je voudrais réitérer mon commentaire sur le choix d'un événement alternatif pour le traitement d'entrée. oninput (HTML5) et onpropertychange (Internet Explorer) font un bien meilleur travail de saisie de texte.

Questions connexes