У меня есть некоторые 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 ничего не отображается:
Должна ли отображаться некоторая ошибка при доступе к элементу DOM, который не существует?
Нет, потому что то, что делает jQuery, это .show()
все элементы, которые обтекает объект jQuery. Если этого нет, то пусть будет так.
Это точно подобный монаде аспект jQuery, который делает его настолько полезным: представьте код, который вам нужно написать, если все не так:
var $whatever = $(...);
if ($whatever.length) $.doSomething();
Это просто хуже: вам нужно ввести переменную (во избежание отходов) и условную... для чего именно?
Если вы хотите увидеть, что соответствует jQuery, вы можете сделать это очень легко с .length
как указано выше, возможно, также используя .filter
в этом процессе.
show()
(или любой другой)?
Одна из приятных вещей о jQuery заключается в том, что все элементы jQuery возвращают коллекцию, будь то 0, 1 или многие элементы. Это удобно, потому что вам не нужно проверять размер коллекции или обернуть ее в массив самостоятельно, когда вы хотите вызывать методы на нем (each
например, не разбивается на 0-1 элементов).
В то время как то, о чем вы говорите, расстраивает в этом конкретном случае, лучше, чтобы jQuery работал таким образом, чтобы вам не приходилось выполнять эти проверки везде.
Если вы хотите разветкить код на основе существования такого элемента, вы можете сделать это:
var task = $('#task' + task.PrestoTaskType);
if (task[0]) {
task.show();
} else {
// task not found
// take appropriate steps
}
Аксессор [0]
вернет первый элемент DOM в объекте jQuery или undefined
если объект jQuery пуст. Поскольку ваш объект jQuery был сконструирован с помощью селектора идентификаторов, он либо содержит ровно один элемент DOM, либо пуст.
$('selector')
значение "подготовить набор элементов DOM, соответствующих этому селектору". Наборы могут быть пустыми, поэтому пустой набор не является ошибкой. Последующие вызовы, такие как.show()
означают «сделать это для каждого элемента в наборе». Опять же, нет проблем, если это пустой набор. Вы всегда можете явно проверить.length
объекта jQuery, чтобы увидеть, действительно ли он пуст.