Created
December 6, 2015 10:04
-
-
Save furandon-pig/b00192562399e16b8c0b to your computer and use it in GitHub Desktop.
Office UI Fabric Advent Calendar 2015用のドロップダウンボックスのサンプルプログラムで使用しているヘルパスクリプトです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Office UI Fabric Advent Calendar 2015用のドロップダウンボックスの | |
* サンプルプログラムで使用しているヘルパスクリプト | |
* | |
* 以下のサンプルプログラム(MIT License)のJSコードをサンプル用に一部 | |
* 修正しています。 | |
* Dropdown | |
* http://dev.office.com/fabric/components/dropdown | |
*/ | |
// Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE in the project root for license information. | |
/** | |
* Dropdown Plugin | |
* | |
* Given .ms-Dropdown containers with generic <select> elements inside, this plugin hides the original | |
* dropdown and creates a new "fake" dropdown that can more easily be styled across browsers. | |
* | |
* @param {jQuery Object} One or more .ms-Dropdown containers, each with a dropdown (.ms-Dropdown-select) | |
* @return {jQuery Object} The same containers (allows for chaining) | |
*/ | |
(function ($) { | |
$.fn.Dropdown = function () { | |
/** Go through each dropdown we've been given. */ | |
return this.each(function () { | |
var $dropdownWrapper = $(this), | |
$originalDropdown = $dropdownWrapper.children('.ms-Dropdown-select'), | |
$originalDropdownOptions = $originalDropdown.children('option'), | |
originalDropdownID = this.id, | |
newDropdownTitle = '', | |
newDropdownItems = '', | |
newDropdownSource = ''; | |
/** Go through the options to fill up newDropdownTitle and newDropdownItems. */ | |
$originalDropdownOptions.each(function (index, option) { | |
/** If the option is selected, it should be the new dropdown's title. */ | |
if (option.selected) { | |
newDropdownTitle = option.text; | |
} | |
/** Add this option to the list of items. */ | |
newDropdownItems += '<li class="ms-Dropdown-item' + ( (option.disabled) ? ' is-disabled"' : '"' ) + '>' + option.text + '</li>'; | |
}); | |
/** Insert the replacement dropdown. */ | |
newDropdownSource = '<span class="ms-Dropdown-title">' + newDropdownTitle + '</span><ul class="ms-Dropdown-items">' + newDropdownItems + '</ul>'; | |
$dropdownWrapper.append(newDropdownSource); | |
function _openDropdown(evt) { | |
if (!$dropdownWrapper.hasClass('is-disabled')) { | |
/** First, let's close any open dropdowns on this page. */ | |
$dropdownWrapper.find('.is-open').removeClass('is-open'); | |
/** Stop the click event from propagating, which would just close the dropdown immediately. */ | |
evt.stopPropagation(); | |
/** Before opening, size the items list to match the dropdown. */ | |
var dropdownWidth = $(this).parents(".ms-Dropdown").width(); | |
$(this).next(".ms-Dropdown-items").css('width', dropdownWidth + 'px'); | |
/** Go ahead and open that dropdown. */ | |
$dropdownWrapper.toggleClass('is-open'); | |
$('.ms-Dropdown').each(function(){ | |
if ($(this)[0] !== $dropdownWrapper[0]) { | |
$(this).removeClass('is-open'); | |
} | |
}); | |
/** Temporarily bind an event to the document that will close this dropdown when clicking anywhere. */ | |
$(document).bind("click.dropdown", function(event) { | |
$dropdownWrapper.removeClass('is-open'); | |
$(document).unbind('click.dropdown'); | |
}); | |
} | |
}; | |
/** Toggle open/closed state of the dropdown when clicking its title. */ | |
$dropdownWrapper.on('click', '.ms-Dropdown-title', function(event) { | |
_openDropdown(event); | |
}); | |
/** Keyboard accessibility */ | |
$dropdownWrapper.on('keyup', function(event) { | |
var keyCode = event.keyCode || event.which; | |
// Open dropdown on enter or arrow up or arrow down and focus on first option | |
if (!$(this).hasClass('is-open')) { | |
if (keyCode === 13 || keyCode === 38 || keyCode === 40) { | |
_openDropdown(event); | |
if (!$(this).find('.ms-Dropdown-item').hasClass('is-selected')) { | |
$(this).find('.ms-Dropdown-item:first').addClass('is-selected'); | |
} | |
} | |
} | |
else if ($(this).hasClass('is-open')) { | |
// Up arrow focuses previous option | |
if (keyCode === 38) { | |
if ($(this).find('.ms-Dropdown-item.is-selected').prev().siblings().size() > 0) { | |
$(this).find('.ms-Dropdown-item.is-selected').removeClass('is-selected').prev().addClass('is-selected'); | |
} | |
} | |
// Down arrow focuses next option | |
if (keyCode === 40) { | |
if ($(this).find('.ms-Dropdown-item.is-selected').next().siblings().size() > 0) { | |
$(this).find('.ms-Dropdown-item.is-selected').removeClass('is-selected').next().addClass('is-selected'); | |
} | |
} | |
// Enter to select item | |
if (keyCode === 13) { | |
if (!$dropdownWrapper.hasClass('is-disabled')) { | |
// Item text | |
var selectedItemText = $(this).find('.ms-Dropdown-item.is-selected').text() | |
$(this).find('.ms-Dropdown-title').html(selectedItemText); | |
/** Update the original dropdown. */ | |
$originalDropdown.find("option").each(function(key, value) { | |
if (value.text === selectedItemText) { | |
$(this).prop('selected', true); | |
} else { | |
$(this).prop('selected', false); | |
} | |
}); | |
$originalDropdown.change(); | |
$(this).removeClass('is-open'); | |
} | |
} | |
} | |
// Close dropdown on esc | |
if (keyCode === 27) { | |
$(this).removeClass('is-open'); | |
} | |
}); | |
/** Select an option from the dropdown. */ | |
$dropdownWrapper.on('click', '.ms-Dropdown-item', function () { | |
if (!$dropdownWrapper.hasClass('is-disabled')) { | |
/** Deselect all items and select this one. */ | |
$(this).siblings('.ms-Dropdown-item').removeClass('is-selected') | |
$(this).addClass('is-selected'); | |
/** Update the replacement dropdown's title. */ | |
$(this).parents().siblings('.ms-Dropdown-title').html($(this).text() | |
+ '<i class="ms-Icon ms-Icon--caretDown" aria-hidden="true"></i>'); | |
$(this).parents().siblings('.ms-Dropdown-title').css('vertical-align', 'middle'); | |
/** Update the original dropdown. */ | |
var selectedItemText = $(this).text(); | |
$originalDropdown.find("option").each(function(key, value) { | |
if (value.text === selectedItemText) { | |
$(this).prop('selected', true); | |
} else { | |
$(this).prop('selected', false); | |
} | |
}); | |
$originalDropdown.change(); | |
} | |
}); | |
}); | |
}; | |
})(jQuery); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment