Необходимо изменить этот код JQuery, чтобы проверить существование элемента до обработки

У меня есть следующий код:

            <script type="text/javascript">
            $(function () {
                $('#js-news').ticker({
                    speed: 0.10,
                    htmlFeed: false,
                    fadeInSpeed: 600,
                    titleText: 'DASHBOARD ALERTS',
                    direction: 'ltr',
                    displayType: 'reveal',
                    controls: false
                });
            });
        </script>

Я хотел бы изменить его так, чтобы он срабатывал только при наличии # js-news. В более старых браузерах IE V10 я получаю сообщение об ошибке: "Элемент не существует в DOM", а на соответствующих страницах нет элемента js-news. Новый браузер, похоже, справляется, но не IE7,8,9.

Мысли об изменении кода оценили.

Спасибо.

Ответы

Ответ 1

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

Как видно из кода здесь, этот плагин либо запускает console.log(), либо alert(), если console не существует, когда нет элемента:

if ($(this).length == 0) {
    if (window.console && window.console.log) {
        window.console.log('Element does not exist in DOM!');
    } else {
        alert('Element does not exist in DOM!');    
    }
    return false;
}

Это довольно плохо. Плагин имеет debugMode, который может быть отключен, но это не поможет, потому что этот флаг здесь не используется. Чтобы изменить источник, вы можете изменить первую строку выше:

if (opts.debugMode && $(this).length == 0) {

И затем обязательно установите debugMode:false в свои настройки.

-

Но как это в конечном счете влияет на IE, это то, что у него нет объекта console, определенного при закрытии инструментов dev (и никогда не в IE6/7), поэтому простым решением было бы убедиться, что объект определен с функцией NO-OP.

if (!window.console) {
    window.console = {
        log: function() {}
    };
}

Теперь он найдет console и вызовет пустую функцию в IE вместо запуска alert().

Существуют и другие методы для объекта console, который также должен быть заполнен, но log() является наиболее распространенным.


Если вы так склонны, возможно, неплохо было бы написать отчет об ошибке с разработчиком. Кажется, что проект не обновлялся за последние 2 года, поэтому я не знаю, поможет ли он, но это не помешает.

Ответ 2

Добавьте условие для проверки длины:

if($('#js-news').length){
  $('#js-news').ticker({
                speed: 0.10,
                htmlFeed: false,
                fadeInSpeed: 600,
                titleText: 'DASHBOARD ALERTS',
                direction: 'ltr',
                displayType: 'reveal',
                controls: false
  });
}