Функция Javascript не возвращает элемент

Итак, я работаю с плагином Handsontable для проекта jQuery и написал несколько пользовательских функций для работать с ним.

Функция, с которой у меня сейчас проблемы, - это функция, которую я написал для возврата текущей выбранной ячейки (когда пользователь выбрал только одну, а не несколько, и да, это проверяется).

Вот мой код:

function getCurrentCell(){
    var selection = $('div.current');
    var left = selection.offset().left;
    var right = left + selection.width();
    var top = selection.offset().top;
    var bottom = top + selection.height();
    $('div.active').find('table').find('td').each(function(){
        if($(this).offset().left >= left && $(this).offset().left <= right && $(this).offset().top >= top && $(this).offset().top <= bottom){
            return this;
        }
    });
    return false;
}

Однако всякий раз, когда я вызываю функцию, например:

var cell = getCurrentCell();

А затем попробуйте alert(cell) или console.log(cell), я получаю возвращаемое значение false.

Моя первоначальная мысль заключалась в том, что каким-то образом координаты будут отключены, и поэтому не будет найден ни один элемент, соответствующий критериям, поэтому я попытался проверить, добавив...

$(this).css('background-color', 'black');

...прямо перед строкой return this. Таким образом, если правильная ячейка таблицы будет найдена, она отобразится на экране до фактического возврата в коде. Забавно, правильная ячейка всегда имеет правильный цвет фона. Итак, эта функция находит правильную ячейку и выполняет код в цикле if, но когда я пытаюсь записать возвращаемое значение в переменную, эта переменная всегда оказывается ложной.

Любая помощь будет здорово! Спасибо ТАК!


person Jordan Foreman    schedule 19.07.2012    source источник
comment
Я понимаю, что ваша проблема была связана с этой функцией и что вы нашли решение, почему ваша функция не работала, но я настоятельно рекомендую вам использовать решение, опубликованное @warpech. Не только потому, что Handsontable пытается разделить логику и DOM, но и потому, что это сломается, если на экране будет больше нескольких десятков строк. Виртуальный рендеринг приведет к тому, что выбранная вами ячейка не будет отображаться, а это означает, что даже если у вас выбрана ячейка, вы не сможете использовать DOM для ее поиска. Вместо этого используйте hotInstance.getSelected().   -  person ZekeDroid    schedule 20.09.2015


Ответы (2)


Вы используете .each() с функцией

.each(function(){
    ...
    return this;
});
return false;

Это вернется из обратного вызова (и, возможно, остановит каждый цикл, если this было false), но никогда не вырвется и не вернется из внешней функции getCurrentCell! Итак, этот всегда будет возвращать false.

Быстрая починка:

var result = false;
<...>.each(function(){
    if (<condition>) {
        result = <found element>;
        return false; // break each-loop
    }
});
return result; // still false if nothing found
person Bergi    schedule 19.07.2012
comment
Я только что столкнулся с той же самой проблемой ранее .. Ударил головой в течение добрых 2 часов: P - person wirey00; 20.07.2012

В настоящее время есть лучший способ получить текущий выбор в Handsontable. Просто используйте следующие методы от Handsontable:

handsontable('getSelected') — возвращает индекс выбранных в данный момент ячеек в виде массива [topLeftRow, topLeftCol, bottomRightRow, bottomRightCol]

handsontable('getCell', row, col) - Возвращаемый элемент для заданного row,col

Все методы описаны здесь: https://github.com/warpech/jquery-handsontable

person warpech    schedule 03.08.2012
comment
Это определенно правильный путь. Попытка угадать выбранную ячейку с учетом состояния DOM не является хорошей практикой, поэтому это решение следует использовать при попытке найти выбранную ячейку. - person ZekeDroid; 20.09.2015