Ответы пользователя по тегу JavaScript
  • Как заставить IE < 9 парсить XML в jquery объект и работать с ним?

    https://www.dropbox.com/s/ihsj7c2jdr23mmn/xmljsonj...
    //вот либа можно делать из json xml из xml obj/xml string json
    //перегоняй свой xml в json обрабатывай и перегоняй обратно в xml
    Ответ написан
    Комментировать
  • Как получить реальный размер блока на экране для WebKit?

    если я правильно понял используй вот это
    *, *:before, *:after {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    }
    Ответ написан
    Комментировать
  • Почему JQ анимация подвисает при скроллинге?

    как вариант во время скроллинга убирай все hover из css которые могут всплыть во время скролла, а вообще подключи velocity.js работает быстрее
    Ответ написан
    Комментировать
  • Как отменить выполнение функции?

    тригерни событие в этой функции далее по условию возвращай false
    Ответ написан
    Комментировать
  • Как запретить закрытие dropdown меню в Bootstrap, при любом действии, кроме клика по кнопке?

    Замени скрипт дропдауна на вот этот

    +function ($) {
    'use strict';

    /**
    * @DROPDOWN CLASS DEFINITION
    *
    */

    var backdrop = '.dropdown-backdrop'
    var toggle = '[data-toggle=dropdown]'
    var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
    }

    Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
    if ($this.is('.disabled, :disabled')) return

    var $parent = getParent($this)
    var isActive = $parent.hasClass('open')

    clearMenus()

    if (!isActive) {
    if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
    // if mobile we use a backdrop because click events don't delegate
    $('').insertAfter($(this)).on('click', clearMenus)
    }

    var relatedTarget = { relatedTarget: this }
    $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))

    if (e.isDefaultPrevented()) return

    $parent
    .toggleClass('open')
    .trigger('shown.bs.dropdown', relatedTarget)

    $this.focus()
    }
    return false
    }

    Dropdown.prototype.keydown = function (e) {
    if (!/(38|40|27)/.test(e.keyCode)) return

    var $this = $(this)

    e.preventDefault()
    e.stopPropagation()

    if ($this.is('.disabled, :disabled')) return

    var $parent = getParent($this)
    var isActive = $parent.hasClass('open')

    if (!isActive || (isActive && e.keyCode == 27)) {
    if (e.which == 27) $parent.find(toggle).focus()
    return $this.click()
    }

    var desc = ' li:not(.divider):visible a'
    var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)

    if (!$items.length) return

    var index = $items.index($items.filter(':focus'))

    if (e.keyCode == 38 && index > 0) index-- // up
    if (e.keyCode == 40 && index < $items.length - 1) index++ // down
    if (!~index) index = 0

    $items.eq(index).focus()

    }

    function clearMenus(e) {
    try{

    if($(e.target).closest('.dropdown-menu').length && !$(e.target).hasClass('dropdown-closer')){
    var c = true;
    }else if($(e.target).closest('.dropdown-menu').length && $(e.target).hasClass('dropdown-closer')) {
    var c = false
    }else {
    var c = false
    }
    if($(e.target).closest('.autoclose').length ) {
    var b = true
    }
    }catch(e){}
    $(backdrop).remove()
    $(toggle).each(function () {
    var $parent = getParent($(this))
    var relatedTarget = { relatedTarget: this }
    if (!$parent.hasClass('open')) return
    $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
    //console.log($(e.relatedTarget).hasClass('dontDrop'));
    if (e.isDefaultPrevented()) return

    if(!c || b){
    $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    }
    })

    }

    function getParent($this) {
    var selector = $this.attr('data-target')

    if (!selector) {
    selector = $this.attr('href')
    selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    }

    var $parent = selector && $(selector)

    return $parent && $parent.length ? $parent : $this.parent()
    }

    var old = $.fn.dropdown

    $.fn.dropdown = function (option) {
    return this.each(function () {
    var $this = $(this)
    var data = $this.data('bs.dropdown')

    if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
    if (typeof option == 'string') data[option].call($this)
    })
    }

    $.fn.dropdown.Constructor = Dropdown

    $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
    }
    $(document)
    .on('click.bs.dropdown.data-api', clearMenus)
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)

    }(jQuery);

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

    если надо сделать чтобы он работал как раньше
    то добавь класс autoclose на обертку твоего дропдауна как показано ниже

    Dropdown



      если допустим тебе понадобиться чтобы одно из меню дропдауна закрывало его а остальные нет, то надо сделать так

      Dropdown


      • ////// добавив на элемент li класс "dropdown-closer" он будет закрывать дропдаун, остальные 4 элемента - нет
    Ответ написан
    Комментировать