Подтвердить что ты не робот

Текстовая нотация 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'] лучше записывается в точечной нотации.

4b9b3361

Ответ 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 укуса за задание неплохие.