2015-01-27 2 views
0

Я использовал этот скрипт раньше, и до тех пор, как мне нужно только один оверлей он работает отлично ... https://gist.github.com/jamesotron/8fa41dd9e9ab2c78e9f0Преобразовать сценарий для нескольких элементов JQuery

Теперь мне нужно вызвать его на несколько интерактивных элементов. Каждый должен открыть другой оверлей. Как я могу реорганизовать его, чтобы передать несколько # div-second, # div-third и т. Д., Когда пользователь нажимает # second-overlay, # third-overlay и т. Д.?

спасибо.

var Overlay, onEndTransition, supportsTransitions, transitionEndEventName; 

transitionEndEventName = function() { 
    var transEndEventNames; 
    transEndEventNames = { 
    WebkitTransition: "webkitTransitionEnd", 
    MozTransition: "transitionend", 
    OTransition: "oTransitionEnd", 
    msTransition: "MSTransitionEnd", 
    transition: "transitionend" 
    }; 
    return transEndEventNames[Modernizr.prefixed("transition")]; 
}; 

supportsTransitions = function() { 
    return Modernizr.csstransitions; 
}; 

onEndTransition = function(ev) { 
    if (supportsTransitions()) { 
    if (ev.propertyName !== "visibility") { 
     return; 
    } 
    this.overlay.off(transitionEndEventName(), onEndTransition); 
    } 
    return this.overlay.removeClass('close'); 
}; 

Overlay = (function() { 
    function Overlay(overlay) { 
    var closeButton; 
    this.overlay = overlay; 
    closeButton = this.overlay.find('button.overlay-close'); 
    if (closeButton.length > 0) { 
     closeButton.click((function(_this) { 
     return function(e) { 
      return _this.toggle(e); 
     }; 
     })(this)); 
    } 
    } 

    Overlay.prototype.isOpen = function() { 
    return this.overlay.hasClass('open'); 
    }; 

    Overlay.prototype.close = function() { 
    this.overlay.removeClass('open'); 
    this.overlay.addClass('close'); 
    if (supportsTransitions()) { 
     return this.overlay.on(transitionEndEventName(), (function(_this) { 
     return function() { 
      return onEndTransition.call(_this); 
     }; 
     })(this)); 
    } else { 
     return onEndTransition.call(this); 
    } 
    }; 

    Overlay.prototype.open = function() { 
    return this.overlay.addClass('open'); 
    }; 

    Overlay.prototype.toggle = function(e) { 
    if (this.isOpen()) { 
     return this.close(); 
    } else { 
     return this.open(); 
    } 
    }; 

    return Overlay; 

})(); 

$(document).ready(function() { 
    var overlay; 
    overlay = new Overlay($('div.first')); 
    return $('#first-overlay').click(function(e) { 
    return overlay.toggle(e); 
    }); 
}); 
+0

Вы хотите иметь разные накладки для разных элементов, но в то же время должен быть только наложенный открытый rt? – Arkantos

+0

точно. Наложения содержат различные пункты меню второго уровня. Мне не нужно открывать сразу несколько надписей. – Milksamsa

ответ

1

Вы можете определить несколько обработчиков нескольких элементов для нескольких элементов. Вам просто нужно немного уточнить свой document.ready(), вам ничего не нужно возвращать.

var mappings = { 
    '#first-overlay' : '#div-first', 
    '#second-overlay' : '#div-second', 
    '#third-overlay' : '#div-third' 
}; 

$(document).ready(function() { 

    $.each(mappings, function(key, val) { 
     /* create a new overlay object and use click handler just to toggle */ 
     var Overlay = new Overlay($(value)); 
     $(key).on('click',function(e) { 
     overlay.toggle(e); 
     }); 

    }); 

}); 
+0

Есть и другой способ справиться с этим. Наличие общего класса означает «модальный» для всех кнопок и отдельный div 'content-div'. Мы можем иметь оверлейный объект, обертывающий 'content-div' и заменяющий html другими вторыми divs, такими как' first-div, second-div & third-div', но вы должны позаботиться о том, чтобы быстро изменить html непосредственно перед открытием наложения , Ну, это занимает некоторое время и некоторое надлежащее тестирование :) – Arkantos

+0

благодарит @arkantos, но, применяя вышеуказанный код, наложения работают частично. Они действительно открываются и закрываются кнопкой закрытия, но когда я пытаюсь открыть одно из наложений снова, они не закрываются. – Milksamsa

+0

У меня ошибка. Я создаю новый объект overlay для этих divs для каждого события click. Обновлен мой ответ. Надеюсь, это должно решить проблему :) – Arkantos

Смежные вопросы