Создать JQuery виджет с несколькими селекторами

0

Я создал простой виджет блокировки фона, который создаст затененный div для блокировки всего, кроме необходимого элемента. Я создаю экземпляр из другого виджета, подобного этому:

// this.element is a jquery object
this.blocker = this.element.blocker();

Это добавит "блокирующий блокировку фона" и, изменив индексы z, я держу this.element сверху. Это прекрасно работает, но теперь мне нужно сохранить два элемента сверху. Возможно ли создать один экземпляр виджета с несколькими элементами? Я мог бы добавить дополнительные элементы, используя функцию добавления или в качестве опции, но не знаю, есть ли лучший способ.

Эта скрипка показывает, как она работает в данный момент. Я хочу ссылаться на # unblocked2. (Я знаю, что остальная часть кода не будет обрабатывать несколько элементов)

http://jsfiddle.net/cpj5y/5/

Теги:

1 ответ

1
Лучший ответ

РЕДАКТИРОВАТЬ


Поскольку я неправильно читаю свой собственный код, который бы создавал блокировщик для каждого заблокированного элемента, я представляю другое решение, которое принимает селектор в качестве параметра и, таким образом, позволяет создавать виджет один раз и выводит элементы, которые соответствуют селектор. Основываясь на приведенном выше скрипте, в JS есть только изменения: http://jsfiddle.net/DzEFx/1/

(function ($) {
    $.widget('my.blocker', {
        options: {
            selector: null
        },
        _create: function() {
            var selector = this.options.selector || this.element;
            this.$blocker = $('<div/>', {
                css: {
                    backgroundColor: '#000000',
                    opacity: 0.4,
                    position: 'fixed',
                    top: 0,
                    bottom: 0,
                    left: 0,
                    right: 0,
                    zIndex: 99,
                }
            });

            selector.each(function(index) {
                var element = $(this); // the current element is passed as the this value
                var oldZIndex = element.css("z-index");
                element.data("old-z-index", oldZIndex);
                element.css("z-index", 1000);
            });
            this.$blocker.appendTo($('body'));
            return this._super();
        }
    });

    $('#btnBlock').click(function() {
        var anElement = $('.unblocked');
        $(document.body).blocker({selector: anElement});
    });

})(jQuery);

Вы можете видеть, что теперь у виджета есть объект опций, свойства которого можно переопределить как объект, переданный первому аргументу при создании виджета.

СТАРЫЙ ОТВЕТ


Вам нужно использовать класс для виджетов, которые вы хотите разрешить быть видимыми, и использовать соответствующий селектор. См. Этот скрипт: http://jsfiddle.net/EQsA7/ Обратите внимание, как нужные элементы имеют class="unblocked" на них, и посмотрите на измененный обработчик нажатия кнопки.

HTML:

<div><input type="text" value="blocked"></div>
<div class="unblocked" id="unblocked1"><input type="text" value="unblocked"></div>
<div><input type="text" value="blocked"></div>
<div class="unblocked" id="unblocked2"><input type="text" value="unblocked"></div>
<div><input type="text" value="blocked"></div>

<input type="button" id="btnBlock" value="Block">

JS:

(function ($) {
    $.widget('my.blocker', {

        _create: function() {
            this.$blocker = $('<div/>', {
                css: {
                    backgroundColor: '#000000',
                    opacity: 0.4,
                    position: 'fixed',
                    top: 0,
                    bottom: 0,
                    left: 0,
                    right: 0,
                    zIndex: 99,
                }
            });

            // this.element will refer to unblocked1
            // I want to access unblocked2 aswell

            this.originalZIndex = this.element.css('z-index');
            this.element.css('z-index', 100);
            this.$blocker.appendTo($('body'));
            return this._super();
        }
    });

    $('#btnBlock').click(function() {
        var anElement = $('.unblocked');
        anElement.blocker();
    });

})(jQuery);
  • 0
    Я понимаю, что вы сделали, но это применило «блокировщик» к каждому элементу, так что теперь есть два блока блокировки. Я ищу один блокатор, который имеет ссылки на более чем один элемент, чтобы каждый элемент не был заблокирован.
  • 0
    А ну понятно. Затем вы должны использовать весь содержащий элемент в качестве селектора для виджета (или, возможно, весь document ) и передать все другие элементы в качестве аргумента для вашего виджета. Я отредактирую свой ответ
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню