Используя найденный здесь общий метод "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 со строкой массива?
Если вы хотите сохранить этот 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
}
});
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... })
)