long-story-library v0.0.23
Long Story Library
Raw javaScript utility library. Useful tools for javaScript developers. This is currently in pre-release. Better documentation will come soon.
Installation
yarn
$ yarn add long-story-librarynpm
$ npm install long-story-libraryThe UMD build is also available on unpkg:
<script src="https://unpkg.com/long-story-library/umd/long-story-library.min.js"></script>If you use the UMD build you can find the library on window._$.
Constructor
_$(arg)
Properties
arg
Argument to initialize certain methods
bool
coerce to boolean and return value. returns true ONLY for "true", true, and "yes". _$(this.arg).bool
slash
returns string with slash appended to the end. _$(this.arg).slash
element
creates new element. _$(this.arg).elememt
Methods
vw(ref)
description
If ref is not supplied, calculates the pixel equivalent of the viewport width. If ref is supplied, treats ref as the viewport. Useful for using viewport units in js code. Returns a Number.
example
// for window viewport
someImage.style.width = _$(50).vw()
// for container element as viewport
someImage.style.width = _$(50).vw(_$("container").id())arguments
- ref \ type: HTMLElement
vh(ref)
description\ Same as vw for viewport height.
vmax(ref)
description\ Same as vw and vh, but determines which is greater and uses the greater option.
vmin(ref)
description\ Same as vw and vh, but determines which is smaller and uses the smaller option.
addListener(els, evt, cb, iterate, options, useCapture)
description
Provides granular control over event listeners. Tests browser for support of an options object and passive support, and uses them by default.
Accepts an array, or array-like object (e.g. - NodeList) or a single element as the first argument and applies the listener(s) to each.
Accepts an array of strings or a single string as the second argument (e.g. - ["scroll", "resize", "load"]), and executes the callback on each event.
arguments
els\ required \ type:
string,arrayor_$.arrayLike\ description: target element or elements.evt\ required \ type:
stringorarray\ description:event.typecb\ required \ type:
function\ description: The object which receives a notification (an object that implements theEventinterface) when an event of the specified type occurs.options\ type:
boolean\ default: { passive: true, capture: true, once: true } \ description: Anobjectwith the following options:capture: A
Booleanindicating that events of this type will be dispatched to the registeredlistenerbefore being dispatched to anyEventTargetbeneath it in the DOM tree.once: A
Booleanindicating that thelistenershould be invoked at most once after being added. Iftrue, thelistenerwould be automatically removed when invoked.passive: A
Booleanwhich, iftrue, indicates that the function specified bylistenerwill never callpreventDefault().
read more on mdn
- useCapture\
type:
boolean\ default: true \ description: ABooleanindicating whether events of this type will be dispatched to the registeredlistenerbefore being dispatched to anyEventTargetbeneath it in the DOM tree.
OBJ(nestedObj, pathArr, defaultValue)
description
A more elegant solution to returning calues from nested objects with possible properties. nestedObj may be supplied as this.arg, as in _$(nestedObj).OBJ(pathArr, def). supply an array of the optional properties down the chain, and optionally a default value.
i.e. - instead of doing this:
var mediumImage = img
&& img._embedded
&& img._embedded["wp:featuredmedia"]
&& img._embedded["wp:featuredmedia"][0]
&& img._embedded["wp:featuredmedia"][0].media_details
&& img._embedded["wp:featuredmedia"][0].media_details.sizes
&& img._embedded["wp:featuredmedia"][0].media_details.sizes.medium_large
&& img._embedded["wp:featuredmedia"][0].media_details.sizes.medium_large.source_urldo this:
var mediumImage = _$(img).OBJ([
"img",
"_embedded",
"wp:featuredmedia",
0,
"media_details",
"sizes",
"medium_large",
"source_url"
], placeHolderImg)arguments
nestedObj\ type:
object\ description: the parentobjectpathArr\ type:
array\ description: array of string representing the properties down the chain.defaultValue\ type: any\ default:
undefined\ description: Default value whennestedObjproperty/sub-property isundefined.
example
var obj = {
lvl1: { isFalse: false, isUndefined: void 0 }
}
console.log(
_$(obj).OBJ(["lvl1", "isFalse"], 1),
_$(obj).OBJ(["lvl1", "isUndefined"], 1),
_$(obj).OBJ(["lvl1", "notDeclared"], 1)
)
// output: false 1 1glideTo(latitude, speed)
description
Scrolls to a specified document latitude (scrollY) at the specified speed.
arguments
latitude\ type:
number\ default: 0scrollDuration\ type:
number\ default: 0.5
arrayLike(obj)
description
Determines if obj is similar to an array (like NodeList). Returns a Boolean.
arguments
- obj: The
Objectto test.
id(selector, parent)
description
Shorthand for <parent>.getElementById(selector). selector may be supplied as this.arg, as in _$(selector).id(parent). parent defaults to document if not supplied.
arguments
- selector: the element
id. - parent: A parent element. defaults to
document
cl(selector, parent)
description
Shorthand for <parent>.getElementsByClassName(selector). selector may be supplied as this.arg, as in _$(selector).cl(parent). parent defaults to document if not supplied.
arguments
- selector: the element
className. - parent: A parent element. defaults to
document
tags(selector, parent)
description
Shorthand for <parent>.getElementsByTagName(selector). selector may be supplied as this.arg, as in _$(selector).tags(parent). parent defaults to document if not supplied.
arguments
- selector: the element
tagName. - parent: A parent element. defaults to
document
qs(selector, parent)
description
Shorthand for <parent>.querySelector(selector). selector may be supplied as this.arg, as in _$(selector).qs(parent). parent defaults to document if not supplied.
arguments
- selector: the element selector.
- parent: A parent element. defaults to
document
qsa(selector, parent)
description
Shorthand for <parent>.querySelectorAll(selector). selector may be supplied as this.arg, as in _$(selector).qsa(parent). parent defaults to document if not supplied.
arguments
- selector: the element selector.
- parent: A parent element. defaults to
document
el(tagname)
description
Creates a new element. Shorthand for document.createElement(tagname). Alternative syntax would be to use the element property, as in _$(tagname).element.
arguments
- tagname: Element
tagName, e.g. -(new _$()).el("span")or_$().el("span").
toggleActive(el)
description
toggles "active" on an elements className. Does not remove existing classnames.
arguments
- el: Target element.
frag(els, _parent)
description
Creates a DocumentFragment, and accepts as the first argument an array of objects that describe elements to append to the fragment. Properties for these objects are as follows:
- type (this is required and represents the
HTMLElementtagName. e.g. - "span") - className
- id
- style (rather than a string, this is an object with javaScript properties for
HTMLElementattributes - e.g.{ width: "100%", zIndex: 999 }) - href
- onclick (function supplied here will use
_$().addlistenerto attach it to the target element) - text
- children (this is an
arrayobjects to append to the current element. The same rules apply to thisarrayas with the top-level array supplied as the first argument.)
The array and it's children up the Virtual DOM tree will append themselves to their parent elements until they have reached the top level DocumentFragment, at which point the DocumentFragment is complete and may be attached to the actual DOM structure.
arguments
- els:
arraycontaining objects describing elements inVirtual DOM - _parent: interal. Used within the
fragfunction to recursively append children to parent elements in theVirtual DOM
example
(function(_$){
var frag = _$.frag([
{
type: "div",
id: "__popUp",
style: {
backgroundColor: "rgba(130, 130, 130, 0.5)",
position: "fixed",
width: "100vw",
height: "100vh",
left: 0,
right: 0,
top: 0,
bottom: 0,
zIndex: 5555
},
children: [
{
type: "div",
className: "popUp",
style: boxStyle,
children: [
type: "span",
className: "btn",
text: confirmText,
style: closeBtnStyle,
onclick: function() {
return _$.remove(_$.id("__popUp"));
}
]
}
]
}
]);
document.body.appendChild(frag);
})(new _$)remove(el)
description
Shorthand to remove an element from DOM.
arguments
- el: element to remove
before(el, newEl)
description
insert newEl before el on the DOM.
arguments
- el: existing element.
- newEl new element to insert
kids(el, findParentBy)
description
Find all of a specified element's children.
arguments
- el:
selectorto be supplied as argument for_$().<method>(selector)(one of:id,cl,tags,qs,qsa) specified infindParentBy. - findParentBy: Method by which to find the parent of the children targeted. if this method returns a
NodeList, only the first element in the list will be used as theparentElement.
vpu(num, type)
description
Emulates viewport units in JavaScript. Returns a Number which represents the viewport unit value converted to pixels. num may be supplied as this.arg, as in _$(num).vpu(type)
arguments
- num: number of the
typeof viewport unit. - type: the type of viewport unit (
"vw","vh","vmax","vmin"). these are detailed in the individual methods above.
changeOnScroll(breakpoint, target, cbTrue, cbFalse, windowObj)
description
Passively listens to the "scroll" event on the windowObj, and executes cbTrue on the target while scrollY is past the breakpoint, and executes cbFalse if scrollY crosses back below the breakpoint. Use case would be changing the size, color, position, etc. of the header on "scroll".
arguments
breakpoint\ type:
number\ description:numberthat represents thescrollYat which the callbacks are executed.target\ type:
HTMLElement\ description: The target on which to execute the callbacks.cbTrue\ type:
function\ description: Callback for whenscrollYpasses thebreakpoint.cbFalse\ type:
function\ description: Callback for whenscrollYpasses back from beyond thebreakpointto below.windowObj\ type:
window,HTMLElement,array, or array-likeobject(e.g.NodeList) ofHTMLElements.\ description: The primary scrolling container. This is almost alwaysWindow, but some frameworks use different container elements as their primary scrolling object, and still others use multiple, or different containers for different states.
example
(function(_$) {
_$.changeOnScroll(
// breakpoint
_$.vpu(50, "vmin"),
// target
_$.qs(".Header"),
// cbTrue
function(header) {
return _$.toggleActive("solid");
},
// cbFalse
function(header) {
return _$.toggleActive("solid");
},
// windowObj
[ window, _$.id("s4-workspace") ]
)
})(new _$)popUp(children, confirmText, btnClick, boxStyle, closeBtnStyle)
description
Internally uses _$.frag to create a simple popup.
arguments
children: This argument is passed to
_$.frag. see above for details.confirmText: text to appear on the button in the popup
btnClick: callback to execute on the
"click"event on the buttonboxStyle: style
objectfor thepopUpcontainer, e.g.{ width: "90%", zIndex: 999, color: "#fff" }.closeBtnStyle: style
objectfor the button to close the popUp.
_count(arr, value)
description
Internal.
Count the number of times value occurs in arr.
arguments
arr:
arrayto iterate.value: the
valueto count.
_relativeUrl(url)
description
Internal.
Given a URL, will return the path from the root as String
arguments
- url: url string to convert
_extractBase(url)
description
Internal.
Given a URL, returns the origin. Useful when browsers don't support window.location.origin
arguments
- url
_absoluteUrl(url, file)
description
Internal.
arguments
- url
- file
_rewriteDotPath(url)
description
Internal.
arguments\
- url
_leadAndTrailSlash(path)
description
Internal.
arguments
- path
frame(path, file, ext, rootnode)
description
Used in conjunction with frameLink and initFrame below, initializes a small framework for rendering html/txt documents that are held in a common directory. These methods may expand and become a separate, more focused library, but will still be available from this library in that event.
There is an example below all three demonstrating how they all tie together
arguments
path\ type:
string\ description: Path to directory. Can accept a full URL if theorigindiffersfile\ type:
string\ description: Name of the file without the extension.
initFrame(path)
description
Initializes frame with the default file (if supplied), and adds appropriate event listeners for state changes.
arguments
- path: Path to directory where text documents are stored. Supplied to
framemethod.
frameLink(path, name, def)
description
Used to create a globally namespaced method that "links" from one document to another. This method could probably be used for that purpose itself, but it's semantically easier for the use (as you'll see below) to create something more intuitive (ex - Link(name)) that is available on the global (window) object.
arguments
path: Path to directory where text documents are stored. Supplied to
framemethod.name: Name of the file to request (without the extension).
def: The default file to fall back on in the event of a failed request.
frame example
This is designed to be set into an existing webpage. So the assumption is that there will be html around frame that will not change from request to request. Part of that html is assumed to be a menu of sorts wherein each menu item has an id that corresponds to the name of the file that will be requested when it is clicked. The other important part of that html is the rootnode. This is the Node into which the response from the network request to the file will populate. As of now, it must be an element with the id "root" (e.g. - _$("root").id()). It should also be empty as anything inside rootnode before the network request will be permanently replaced upon initialization.
// /samplingplan.js
(function(_$) {
// set up arguments
var path = "/lab/samplingplan/Documents/";
var hash = _$.OBJ(location, ["hash"]);
var file = hash ? hash.slice(1) : "Malt";
// menu items that correspond to our text files
var menuItems = [
"Mill",
"HeatEX",
"ADD-Water",
"Ferment",
"ADD-O2-Yeast",
"Whirl",
"ADD-Hops",
"REMOVE-Trub",
"Bottle-CanorKeg",
"Lauter",
"Clarify",
"REMOVE-Grain",
"Condition",
"Kettle",
"Brite",
"Mash",
"ADD-CO2",
"Malt"
];
// globally available method for "linking" our files
// this can be used within the files to link to other files
// used as <div onclick="Link('Ferment')">Ferment</div>
window.Link = function(name) {
_$.frameLink(path, name, "Malt");
};
// this example comes from a particularly unique case
// where there were multiples of some menuItems
// something to do with wanting to have a layout that
// reflects a specific process in which certain steps
// are repeated. so I had to get a little creative with
// adding the event listeners
menuItems.forEach(function(btn) {
if (_$.qsa("#" + btn).length > 1) {
// if more than one, add to each
// addListener method handles NodeList
_$.addListener(
_$.qsa("#" + btn),
"click",
function(e) {
Link(e.target.id);
},
{ once: false, passive: false }
);
}
if (_$.qsa("#" + btn).length === 1) {
// else just apply to the one and use id method
_$.addListener(
_$.id(btn),
"click",
function(e) {
Link(e.target.id);
},
{ once: false, passive: false }
);
}
});
// finally, attach frame initialization to DOMContentLoaded
_$.addListener(document, "DOMContentLoaded", _$.initFrame(path));
})(new $$());<!-- index.html -->
<div class="menu" style="width: 200px; float: left">
<div id="Mill">Mill</div>
<div id="HeatEX">HeatEX</div>
<div id="ADD-Water">ADD-Water</div>
<div id="Ferment">Ferment</div>
<div id="ADD-O2-Yeast">ADD-O2-Yeast</div>
<div id="Whirl">Whirl</div>
<div id="ADD-Hops">ADD-Hops</div>
<div id="REMOVE-Trub">REMOVE-Trub</div>
<div id="Bottle-CanorKeg">Bottle-CanorKeg</div>
<div id="Lauter">Lauter</div>
<div id="Clarify">Clarify</div>
<div id="REMOVE-Grain">REMOVE-Grain</div>
<div id="Condition">Condition</div>
<div id="Kettle">Kettle</div>
<div id="Brite">Brite</div>
<div id="Mash">Mash</div>
<div id="ADD-CO2">ADD-CO2</div>
<div id="Malt">Malt</div>
</div>
<div id="root"></div>
<script type="text/javascript" src="/samplingplan.js"></script>getXML(url, cb)
description
Written alongside parseXML, but really isn't specific to XML. Pretty much just a wrapper around an XMLHttpRequest, but greatly simplified, and cuts out the boilerplate request code. only makes GET requests. provides a callback for the reponse. url may be supplied as this.arg as in _$(url).getXML(cb)
arguments
- url: request url.
- cb: function to execute on the response returned from the request.
parseXML(text, cb)
description
Parses XML (and html) string into a DOM, providing native browser functions for traversing the DOM tree. provides a callback to be executed on the resulting DOM. test may be supplied as this.arg as in _$(url).parseXML(cb)
arguments
- text: string to parse.
- cb: callback to execute on
DOM
example for XML methods above
this incorporates react-gallery-designer's somewhat unique umd build, which wraps a React component in a custom function making it quite portable
(function(_$) {
// get rss XML
_$.getXML(
"https://twitrss.me/twitter_user_to_rss/?user=plantdisease",
function(rss) {
// parse it
_$.parseXML(rss, function(doc) {
// construct our feed segments
var images = Array.from($$.tags("item", doc), function(item, i) {
return {
caption: _$.qs("title", item).innerHTML.slice(0, 100) + " ...",
link: _$.qs("link", item).innerHTML,
style: {
// gives every other item a grey background
backgroundColor: Math.ceil(i % 2) ? "#dcdbdb" : "#fff"
},
target: true
};
});
var settings = {
inview: 2,
auto: true,
playpause: false,
pauseonhover: false,
direction: "left",
animation: "slide",
orientation: "vertical",
speed: 5000,
transitionspeed: 1,
arrows: false,
advance: 1,
showcaptions: true,
linkslides: true,
thumbnails: false,
contain: false,
noImages: true
};
// return custom rotating feed
return __RGD({
images: images,
settings: settings,
captionStyle: { color: "#595956", fontWeight: "bold", lineHeight: 2, fontSize: "1.05rem" },
imgStyle: { padding: "0 1rem" },
style: { height: "9rem" },
domId: "twitterFeed"
});
});
}
);
})(new _$;6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago