Ссылка на переменную Javascript в проблеме события OnKeyUp - PullRequest
1 голос
/ 04 ноября 2010

Я объявил две переменные, COURSE_ID_List и COURSE_ID_timerId. Затем они передаются в качестве параметров в функцию SetFilter из события OnKeyUp.

Если список не определен, он должен его инициализировать. Проблема в том, что список всегда неопределен, поэтому я предполагаю, что COURSE_ID_List, используемый в событии OnKeyUp, передается по значению, а не по ссылке. Как я могу обойти это?

Спасибо

<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);" />

Ответы [ 3 ]

1 голос
/ 04 ноября 2010

Передача по ссылке неудобна в JavaScript. Объектам передается только их значение по ссылке, поэтому повторное присвоение имени переменной приводит к тому, что имя переменной имеет новое значение, но исходная переменная сохраняет свое значение.

Я собирался опубликовать аналогичное решение для Ив М , но я вижу из ваших комментариев, что вы уже пробовали это. Другое решение - использовать объекты и манипулировать их свойствами. Я думаю, что вы пытаетесь достичь чего-то вроде следующего:

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 = {};

Кроме того, я хотел бы повторить свой комментарий о выборе альтернативного события для обработки ввода. oninput (HTML5) и onpropertychange (Internet Explorer) значительно лучше справляются с перехватом ввода текста.

1 голос
/ 04 ноября 2010

Изменить на ...

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); 
} 

и

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

Более общий подход будет использовать прототипирование ...

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 голосов
/ 04 ноября 2010

Я думаю, что это может быть ответ, который вы ищете.

(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;
    }
})();

и

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