Почему нет ошибки при доступе к элементу DOM, который не существует?

0

У меня есть некоторые div с частичными представлениями в них. Почему ссылка на div, которая не существует, не показывает какую-то ошибку? Например, у меня только одна задачаN div прямо сейчас:

<div id="task1">
    @Html.Partial("~/Views/PartialViews/TaskDosCommand.cshtml")
</div>

Это мой jQuery, чтобы показать div:

$('#task' + task.PrestoTaskType).show();

Когда task.PrestoTaskType равно 1, правильно отображается индикатор task1. Однако, когда task.PrestoTaskType - это ничего, кроме 1, как 2, тогда ничего не отображается (что хорошо), но нет ошибки; на веб-странице не отображается ошибка, и на консоли инструментов разработчика Chrome ничего не отображается:

Изображение 174551

Должна ли отображаться некоторая ошибка при доступе к элементу DOM, который не существует?

  • 1
    Подумайте, означает ли $('selector') значение "подготовить набор элементов DOM, соответствующих этому селектору". Наборы могут быть пустыми, поэтому пустой набор не является ошибкой. Последующие вызовы, такие как .show() означают «сделать это для каждого элемента в наборе». Опять же, нет проблем, если это пустой набор. Вы всегда можете явно проверить .length объекта jQuery, чтобы увидеть, действительно ли он пуст.
Теги:

3 ответа

3
Лучший ответ

Нет, потому что то, что делает jQuery, это .show() все элементы, которые обтекает объект jQuery. Если этого нет, то пусть будет так.

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

var $whatever = $(...);
if ($whatever.length) $.doSomething();

Это просто хуже: вам нужно ввести переменную (во избежание отходов) и условную... для чего именно?

Если вы хотите увидеть, что соответствует jQuery, вы можете сделать это очень легко с .length как указано выше, возможно, также используя .filter в этом процессе.

  • 0
    Конечно, это преимущество, но я всегда предполагал, что причина отсутствия ошибки в том, что jQuery всегда возвращает объект jQuery, у которого есть метод show() (или любой другой)?
  • 0
    @DavidThomas: Да, именно так.
3

Одна из приятных вещей о jQuery заключается в том, что все элементы jQuery возвращают коллекцию, будь то 0, 1 или многие элементы. Это удобно, потому что вам не нужно проверять размер коллекции или обернуть ее в массив самостоятельно, когда вы хотите вызывать методы на нем (each например, не разбивается на 0-1 элементов).

В то время как то, о чем вы говорите, расстраивает в этом конкретном случае, лучше, чтобы jQuery работал таким образом, чтобы вам не приходилось выполнять эти проверки везде.

2

Если вы хотите разветкить код на основе существования такого элемента, вы можете сделать это:

var task = $('#task' + task.PrestoTaskType);

if (task[0]) {
    task.show();
} else {
    // task not found
    // take appropriate steps
}

Аксессор [0] вернет первый элемент DOM в объекте jQuery или undefined если объект jQuery пуст. Поскольку ваш объект jQuery был сконструирован с помощью селектора идентификаторов, он либо содержит ровно один элемент DOM, либо пуст.

Ещё вопросы

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