Текстовая нотация JavaScript
Следующая строка, по-видимому, лучше всего написана в виде точечной нотации. Я пытаюсь очистить свой код JavaScript, чтобы сделать его строгим. Что это значит?
if (ie||ns6)
{
var tipobj=document.all? document.all["dhtmltooltip"] : document.getElementById? document.getElementById("dhtmltooltip") : "";
}
Я добавил некоторый контекст в свою строку кода, если это поможет?
Я ничего не знаю о DOM. Я не пытаюсь поддерживать Internet Explorer 4, это не мой код, и я не смог бы самостоятельно писать JavaScript. Я просто пытаюсь добиться его соответствия, и инструмент JSLint говорит об этой строке:
Проблема символа строки 17: ['dhtmltooltip'] лучше записывается в точечной нотации.
Ответы
Ответ 1
Есть два способа доступа к свойствам объекта в JavaScript.
Точечная нотация
foo.bar.baz
Обозначение квадратной скобки
foo['bar']['baz']
Вы используете последнее в части своего кода.
Дуглас Крокфорд, который написал JSLint (инструмент, который дает это сообщение об ошибке), считает, что, по возможности, лучше использовать точечную нотацию.
Ответ 2
JSLint хочет это:
var tipobj= document.all ? document.all.dhtmltooltip
: document.getElementById
? document.getElementById("dhtmltooltip")
: "";
Но в настоящее время вполне безопасно предположить, что document.getElementById
существует, он был введен на DOM Level Core 2 по состоянию на 2000 год.
document.all
мертв, если вы не пытаетесь поддерживать действительно старые браузеры, такие как IE4 (12 лет!):
var tipobj = document.getElementById("dhtmltooltip");
Два вышеприведенных фрагмента являются хорошим примером стоимости сложности поддержки старых браузеров:
alt text http://ejohn.org/images/cost-benefit.png
Ответ 3
Следующее выглядит более удобным.
var tipobj;
if (document.all)
tipobj = document.all["dhtmltooltip"];
else if (document.getElementById)
tipobj = document.getElementById("dhtmltooltip");
else
tipobj = "";
Ответ 4
Он использует проверку возможностей для извлечения элемента с id dhtmltooltip
и возвращается к пустой String
, если нет возможности для выполнения поиска.
ОБНОВЛЕНИЕ. Как указывали другие, проверка на getElementById
должна быть первой и, вероятно, может быть опущена, поскольку любой браузер, который можно назвать "современным" с прямым лицом, в течение длительного времени.
ОБНОВЛЕНИЕ 2. В новом контексте JSLint жалуется, что это не document.all.dhtmltooltip
. Вероятно, вы должны просто переписать все это как:
var tipobj = document.getElementById("dhtmltooltip");
и выполняться с ним.
Ответ 5
Быстрый поиск в Google говорит, что document.all
используется только для поддержки IE4. Это массив, который позволяет браузеру обращаться к различным частям DOM (см. здесь.)
Сначала вы отправили код, проверяющий, существует ли document.all. Если нет, то устанавливается tipobj
на ""
. Теперь, помимо этого, не стоит расшифровывать выделенную вами линию, если вы действительно не хотите поддержки IE4. Поскольку очень немногие люди по-прежнему используют IE4, и этот фрагмент кода не соответствует любым современным стандартам, я бы просто отбросил эту строку и установил tipobj
в ""
.
Ответ 6
Похоже, что единственными реальными проблемами являются форматирование/синтаксис. Это должно работать точно так же и соответствовать лучшей практике javascript. Основное различие заключается в использовании нотации javascript dot вместо обозначения скобок.
if (ie || ns6) {
var tipobj = document.all ? document.all.dhtmltooltip : document.getElementById ? document.getElementById("dhtmltooltip") : "";
}
Ответ 7
почему бы просто не использовать:
var tipobj = dhtmltooltip.id
Не знаете, почему требуется длинная версия, если нотация точек не работает во всех браузерах?
Ответ 8
Если текстовая нотация является проблемой, вы всегда можете установить параметр /* jslint sub: true */для переопределения.
Ответ 9
Как ответил Quentin оба пути действительны.
Одной из причин, почему я предпочитаю использовать elem.bar
вместо elem['bar']
, является то, что он сохраняет 3 символа. Конечно, это не большое улучшение, но бесплатные 3 укуса за задание неплохие.