Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow plain JS #15

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 134 additions & 0 deletions demo/demo-plain-js.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
<!DOCTYPE html>
<html>
<head>
<title>Rangyinputs plain JS plugin demo</title>
<link href="demo.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="../rangyinputs-jquery-src.js"></script>
<style type="text/css">
p.inputcontainer {
float: left;
background-color: lightsteelblue;
border: solid 1px darkblue;
padding: 0.3125em;
}
</style>
<script>
var bindLoadEvent = function (handler) {
if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', handler);
}
else {
document.attachEvent('onload', handler, false);
}
}

var bindEvent = function (el, eventName, handler) {
if (el.addEventListener) {
el.addEventListener(eventName, handler);
}
else {
el.attachEvent('on' + eventName, handler, false);
}
}

bindLoadEvent(function() {
var ta = document.getElementById("ta");
var startIndex = document.getElementById("startIndex");
var endIndex = document.getElementById("endIndex");

function reportSelection() {
var sel = RangyInputs.getSelection(ta);
startIndex.innerText = sel.start;
endIndex.innerText = sel.end;
}

bindEvent(document, "selectionchange", reportSelection);
bindEvent(ta, "keyup", reportSelection);
bindEvent(ta, "input", reportSelection);
bindEvent(ta, "mouseup", reportSelection);
bindEvent(ta, "textInput", reportSelection);

ta.focus();

reportSelection();

var mouseDownHandler = function(e) {
e.preventDefault();

switch (this.name) {
case "replaceSelectedTextAndCollapse":
RangyInputs.replaceSelectedText(ta, "**Test**", "collapseToEnd");
break;
case "replaceSelectedTextAndSelect":
RangyInputs.replaceSelectedText(ta, "**Test**", "select");
break;
case "deleteText":
RangyInputs.deleteText(ta, +document.getElementById('ta_start').value, +document.getElementById('ta_end').value);
break;
case "deleteSelectedText":
RangyInputs.deleteSelectedText(ta);
break;
case "extractSelectedText":
alert(RangyInputs.extractSelectedText(ta));
break;
case "surroundSelectedText":
RangyInputs.surroundSelectedText(ta, "[Before]", "[After]");
break;
case "collapseToStart":
RangyInputs.collapseSelection(ta, true);
break;
case "collapseToEnd":
RangyInputs.collapseSelection(ta, false);
break;
case "setSelection":
RangyInputs.setSelection(ta, +document.getElementById('ta_start').value, +document.getElementById('ta_end').value);
break;
}
ta.focus();

// For IE, which always shifts the focus onto the button
window.setTimeout(function() {
ta.focus();
}, 0);
};

var inputNodes = document.getElementsByTagName("input");
for(var idx = 0; idx < inputNodes.length; idx++) {
bindEvent(inputNodes[idx], 'mousedown', mouseDownHandler);
}
});
</script>
</head>
<body>
<h1>Rangyinputs plain JS plugin Demo</h1>

<br><br>

<p class="inputcontainer">
<input type="button" class="unselectable" unselectable="on" name="replaceSelectedTextAndCollapse" value="paste test text">
<input type="button" class="unselectable" unselectable="on" name="replaceSelectedTextAndSelect" value="paste test text and select">
<input type="button" class="unselectable" unselectable="on" name="deleteText" value="delete text">
<input type="button" class="unselectable" unselectable="on" name="deleteSelectedText" value="delete selected text">
<br>
<input type="button" class="unselectable" unselectable="on" name="extractSelectedText" value="extract selected text">
<input type="button" class="unselectable" unselectable="on" name="surroundSelectedText" value="surround selected text">
<input type="button" class="unselectable" unselectable="on" name="collapseToStart" value="collapse to start">
<input type="button" class="unselectable" unselectable="on" name="collapseToEnd" value="collapse to end">
<br>
Select/delete text from <input type="text" id="ta_start" size="3" value="5"> to
<input type="text" id="ta_end" size="3" value="7">
<input type="button" class="unselectable" unselectable="on" name="setSelection" value="set selection">

<br>
Selection: <b id="startIndex"></b> to <b id="endIndex"></b>
<br>
<textarea rows="15" cols="80" id="ta">Some test text
That has

Some line breaks, including some trailing ones


</textarea>
</p>
</body>
</html>
2 changes: 1 addition & 1 deletion demo/demo.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<head>
<title>Rangyinputs jQuery plugin demo</title>
<link href="demo.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="../rangyinputs-jquery-src.js"></script>
<style type="text/css">
p.inputcontainer {
Expand Down
53 changes: 40 additions & 13 deletions rangyinputs-jquery-src.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
var UNDEF = "undefined";
var getSelection, setSelection, deleteSelectedText, deleteText, insertText;
var replaceSelectedText, surroundSelectedText, extractSelectedText, collapseSelection;
var isPlainJsMode = $ === undefined;

// Trio of isHost* functions taken from Peter Michaux's article:
// http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting
Expand Down Expand Up @@ -66,7 +67,18 @@
return isHostObject(document, "body") ? document.body : document.getElementsByTagName("body")[0];
}

$(document).ready(function() {
var bindDocumentLoadedEvent = isPlainJsMode
? function (handler) {
if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', handler);
}
else {
document.attachEvent('onload', handler, false);
}
}
: $(document).ready;

bindDocumentLoadedEvent(function() {
var testTextArea = document.createElement("textarea");

getBody().appendChild(testTextArea);
Expand Down Expand Up @@ -302,16 +314,31 @@
};
}

$.fn.extend({
getSelection: jQuerify(getSelection, false),
setSelection: jQuerify(setSelection, true),
collapseSelection: jQuerify(collapseSelection, true),
deleteSelectedText: jQuerify(deleteSelectedText, true),
deleteText: jQuerify(deleteText, true),
extractSelectedText: jQuerify(extractSelectedText, false),
insertText: jQuerify(insertText, true),
replaceSelectedText: jQuerify(replaceSelectedText, true),
surroundSelectedText: jQuerify(surroundSelectedText, true)
});
if (isPlainJsMode) {
window.RangyInputs = {
getSelection: getSelection,
setSelection: setSelection,
collapseSelection: collapseSelection,
deleteSelectedText: deleteSelectedText,
deleteText: deleteText,
extractSelectedText: extractSelectedText,
insertText: insertText,
replaceSelectedText: replaceSelectedText,
surroundSelectedText: surroundSelectedText
};
}
else {
$.fn.extend({
getSelection: jQuerify(getSelection, false),
setSelection: jQuerify(setSelection, true),
collapseSelection: jQuerify(collapseSelection, true),
deleteSelectedText: jQuerify(deleteSelectedText, true),
deleteText: jQuerify(deleteText, true),
extractSelectedText: jQuerify(extractSelectedText, false),
insertText: jQuerify(insertText, true),
replaceSelectedText: jQuerify(replaceSelectedText, true),
surroundSelectedText: jQuerify(surroundSelectedText, true)
});
}
});
})(jQuery);
})(window.jQuery);
2 changes: 1 addition & 1 deletion rangyinputs-jquery.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.