WedX - журнал о программировании и компьютерных науках

Ошибка jQuery, если отсутствует элемент

У меня есть несколько функций jQuery на моем веб-сайте, но не на каждой странице все они требуются. Все они выполняются из одного файла XXX.js, например:

jQuery(function() {
$(".title").slug({
    slug:'slug',
    hide: false
});         });

и если какой-либо из элементов отсутствует, остальные функции не выполняются. Как выполнить, например, эту функцию, только если элемент существует?



Ответы:


1

Вы можете проверить, существует ли элемент следующим образом:

 jQuery(function() {
   if($('.title').length != 0) { 
   $(".title").slug({
      slug:'slug',
      hide: false
    });
    }
 });
26.11.2011
  • Не лучше ли было бы исправить эту проблему в самом плагине (который состоит всего из 20 строк кода), чем кодировать это при каждом использовании и многократно оценивать селектор? 26.11.2011
  • Вам не нужно проверять, что длина является конкретным значением, просто она вообще имеет длину 26.11.2011
  • Да, полностью согласен с вами. Если бы у меня была такая же проблема, я бы попробовал исправить сам код плагина. 26.11.2011
  • Я не знаю, почему за вас проголосовали (я этого не делал), но я предоставил фиксированную версию плагина (в моем ответе ниже), которая обрабатывает нулевую длину в самом плагине. 26.11.2011

  • 2

    Реальный ответ заключается в том, что подключаемый модуль .slug() jQuery написан довольно плохо. Это что-то около 20 строк кода и полно ошибок.

    Правильное место для исправления этой проблемы в этом плагине, поэтому это нужно сделать только один раз, а не везде, где вы его используете. Я бы предложил изменить этот плагин на этот код, который устранил кучу проблем:

    //
    //    jQuery Slug Generation Plugin by Perry Trinier ([email protected])
    //  Licensed under the GPL: https://www.gnu.org/copyleft/gpl.html
    
    jQuery.fn.slug = function(options) {
        var settings = {
            slug: 'slug', // Class used for slug destination input and span. The span is created on $(document).ready() 
            hide: true     // Boolean - By default the slug input field is hidden, set to false to show the input field and hide the span. 
        };
    
        // merge options and settings
        if(options) {
            jQuery.extend(settings, options);
        }
    
        // save jQuery object for later use in callback
        if (this.length > 0) {
            var self$ = this.eq(0);
    
            jQuery(document).ready( function() {
                if (settings.hide) {
                    jQuery('input.' + settings.slug).after("<span class="+settings.slug+"></span>");
                    jQuery('input.' + settings.slug).hide();
                }
                self$.keyup(function() {
                    var slugcontent = jQuery(this).val();
                    var slugcontent_fixed = slugcontent.replace(/\s/g,'-').replace(/[^a-zA-Z0-9\-]/g,'').toLowerCase();
                    jQuery('input.' + settings.slug).val(slugcontent_fixed);
                    jQuery('span.' + settings.slug).text(slugcontent_fixed);
                });
            });
        }
    
        // return our jQuery object so it's chainable
        return this;
    };
    

    Это изменение устраняет следующие проблемы с предыдущим кодом:

    1. Теперь он будет работать правильно, если вы вызовете его для пустого объекта jQuery.
    2. Теперь он будет работать правильно, если будет вызван до того, как документ будет готов.
    3. Больше не нужно делать ненужные вызовы для превращения вещей в объекты jQuery, которые уже являются объектами jQuery.
    4. Если вызывается селектор с более чем одним объектом, он будет работать только с первым элементом в селекторе, чтобы предотвратить проблемы, которые могут возникнуть в противном случае.
    5. Сделал обратный вызов keyup анонимной функцией, а не создал новую переменную.

    Примечание. Этот подключаемый модуль предназначен для работы только с одним полем слага на странице. Таким образом, вам, вероятно, следует использовать его со значением идентификатора, таким как "#title", а не с именем класса, таким как ".title", потому что идентификатор никогда не вернет более одного поля и никогда не вызовет у вас проблем таким образом.

    Я убедился, что этот код работает здесь: https://jsfiddle.net/jfriend00/CJJGz/ .

    26.11.2011
  • Спасибо. Это именно тот пример кода, который я искал при написании своего плагина. 28.02.2012

  • 3

    Вы можете добавить if перед вызовом кода -

    if ($(".title").length)
    
    26.11.2011
  • проверка больше 0 избыточна, вам просто нужно проверить, что она имеет длину, а не то, что длина больше 0 26.11.2011

  • 4

    Вы можете проверить длину возвращаемого объекта jQuery, если он имеет нулевую длину, селектор не был сопоставлен и элемент не был найден, например:

    if ($(".title").length) {
        $(".title").slug({
            slug:'slug',
            hide: false
        }); 
    }
    
    26.11.2011

    5

    Вы можете проверить, существует ли элемент, проверив его размер:

    if ($(selector).length) {
    // Do what you want
    }
    
    26.11.2011

    6

    Вы можете проверить существование элементов, над которыми вы работаете, и if они существуют, выполняя действие/функцию:

    if ($('.title').length){
        $(".title").slug({
            slug:'slug',
            hide: false
        });
    }
    
    26.11.2011
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]