Использование .length для проверки, существует ли элемент в JQuery с объединенным массивом

0

Используя найденный здесь общий метод "if ID exist", возможно ли еще проверить наличие идентификатора при конкретизации идентификатора с переменной массива, как показано ниже?

for (var i=0; i < lineData.length; i++)
{
    optionData = lineData[i].split(",");
    if ($("#" + optionData[0]).length)
    {
        $("#" + optionData[0]).text(optionData[1]);
    }
}

При выполнении этого при отладке, если $("#" + optionData[0]) идентификатор $("#" + optionData[0]) не существует, он генерирует результат "undefined: undefined" и переходит к:

Sizzle.error = function( msg ) {
throw "Syntax error, unrecognized expression: " + msg;

в коде JQuery.

Правильно ли этот код используется для проверки и установки HTML-идентификатора таким образом? Почему это не работает в популярном методе "существует"? Что я могу сделать, чтобы исправить это и заставить его пропускать идентификатор, который не существует, используя этот тип конкатенации ID со строкой массива?

  • 1
    что такое optionData [0]? кажется, что это не строка и, следовательно, синтаксическая ошибка
  • 0
    optionData [0] - это строка с четырьмя буквами. Извините, я не могу показать слишком много, если не углубляться в код, но в отладчике четыре буквенные строки отображаются как таковые.
Показать ещё 5 комментариев
Теги:
arrays
concat

2 ответа

1

Если вы хотите сохранить этот jQuery-связанный, там больше "синтаксического сахара", который вы не используете:

// check for ID in array
jQuery.each(someArray,
    function(index, value) {
        var the_id = $(value).attr('id');
        if ( the_id !== undefined && the_id !== false ) {
            // This item has an id
        }
});
1

http://jsfiddle.net/P824r/ работает отлично, поэтому проблема не в том, где вы думаете. Упростите код и добавьте некоторые проверки. Вы также не делаете ничего, что требует jQuery, поэтому я не вижу, как это вопрос jQuery, но отлично:

function handler(data, i) {
    var optionData = data.split(","),
        $element;
    if (optionData[0] && optionData[1]) {
      $element = $("#" + optionData[0]);
      if ($element.length > 0) {
        // omitting >0 as 'trick' causes JS coercion from number to boolean.
        // there literally no reason to ever do so: it both slower and
        // hides your intention to others reading your code
        $element.text(optionData[1]);
      }
    } else { console.error("unexpected optionData:", optionData);
}
lineData.forEach(handler);

но мы можем сделать это без jQuery, так как мы на самом деле не используем ничего, что мы не можем сделать с простым JS, в том же количестве вызовов:

function handler(data) {
    var optionData = data.split(",");
    if (optionData.length === 2) {
      var id = optionData[0],
          content = optionData[1],
          element = document.getElementById(id);
          // because remember: ids are unique, we either get 0
          // or 1 result. always. jQuery makes no sense here.
      if (element) {
        element.textContent = content;
      }
    } else { console.error("unexpected input:", optionData);
}
lineData.forEach(handler);

(не-jquery-версия распаковывает optionsData в отдельные переменные для улучшения удобочитаемости, но конечная удобочитаемость заключалась бы в том, чтобы убедиться, что lineData не содержит строк, но для начала содержит только объекты с правильной lineData, поэтому мы можем сделать forEach(function(data) {... use data.id and data.content straight up... }))

  • 0
    Я не вижу, как это «ОТВЕТ» на вопрос. это какое-то предложение или обновление, которое должно идти в качестве комментария.
  • 0
    это также намного дольше, чем позволяет комментарий. Ответы на SO - это не просто «ответы». Они также могут быть предложения, чтобы вы на правильном пути. Проблема была не в том, что Mimjox думал, что это было, и он явно спросил об этикете html / css / etc. Это обеспечивает часть этого вторичного запроса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню