Available in the OSS Version
HTML Editor - TypeScript
This sample uses CTP (Community Technical Preview) features. The API and behavior may change when these features are released with full support.
Use the fastest jQuery grid on the market to get more interactivity out of your static HTML tables and data. Our latest iteration offers more line of business features, along with our unrivalled quality and performance.
This sample is designed for a larger screen size.
On mobile, try rotating your screen, view full size, or email to another device.
This sample shows how to use TypeScript for creating HTML Editor with standalone toolbar when a text is being selected.
Code View
Copy to Clipboard
<!DOCTYPE html> <html> <head> <title></title> <!-- Ignite UI for jQuery Required Combined CSS Files --> <link href="http://cdn-na.infragistics.com/igniteui/2024.1/latest/css/themes/infragistics/infragistics.theme.css" rel="stylesheet" /> <link href="http://cdn-na.infragistics.com/igniteui/2024.1/latest/css/structure/infragistics.css" rel="stylesheet" /> <script src="http://ajax.aspnetcdn.com/ajax/modernizr/modernizr-2.8.3.js"></script> <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script> <script src="http://code.jquery.com/ui/1.11.1/jquery-ui.min.js"></script> <!-- Ignite UI for jQuery Required Combined JavaScript Files --> <script src="http://cdn-na.infragistics.com/igniteui/2024.1/latest/js/infragistics.core.js"></script> <script src="http://cdn-na.infragistics.com/igniteui/2024.1/latest/js/infragistics.lob.js"></script> <style type="text/css"> #htmlEditor { margin-bottom: 10px; } #text_collapseButton, #formatting_collapseButton { display: none; } #toolbarHolder { z-index: 99999; } /* Override sample's browser styles */ #htmlEditor h1, #htmlEditor h2, #htmlEditor h3, #htmlEditor h4, #htmlEditor h5, #htmlEditor h6 { margin: 0px; } #htmlEditor h1 { font-size: 1.9em; } #sampleContainer { overflow: visible; } </style> </head> <body> <div id="htmlEditor"> Use the fastest jQuery grid on the market to get more interactivity out of your static HTML tables and data. Our latest iteration offers more line of business features, along with our unrivalled quality and performance. </div> <div id="toolbarHolder"> <div id="text"></div> </div> <script src="/TypeScriptSamples/html-editor/typescript.js"></script> </body> </html>
/// <reference path="/js/typings/jquery.d.ts" /> /// <reference path="/js/typings/jqueryui.d.ts" /> /// <reference path="/js/typings/igniteui.d.ts" /> function getSelectionCoords() { var sel = window.frames[0].document.getSelection(), range; var x = 0, y = 0; if (sel) { if (sel.type != "Control") { range = sel.getRangeAt(0).getClientRects()[0]; x = range.left; y = range.bottom + 2*range.height; } } else if (window.frames[0].document.getSelection()) { var selection = window.frames[0].document.getSelection(); if (selection.rangeCount) { range = selection.getRangeAt(0).cloneRange(); if (range.getClientRects) { range.collapse(true); var rect = range.getClientRects()[0]; if (rect) { x = rect.left; y = rect.top; } } } } return { x: x, y: y + 118 }; } function selectionIs(sel, state) { var range, isState = false; if (window.frames[0].document.getSelection) { if (sel && sel.getRangeAt && sel.rangeCount) { range = sel.getRangeAt(0); sel.removeAllRanges(); sel.addRange(range); } } if (window.frames[0].document.queryCommandState) { isState = window.frames[0].document.queryCommandState(state); } return isState; } $(function () { var $iframe, mouseMoveCoord, $htmlEditor = $("#htmlEditor"), $toolbarHolder = $("#toolbarHolder"), $textToolbar = $("#text"), height = $('html').hasClass('touch') ? 500 : 350; $toolbarHolder.hide(); $htmlEditor.igHtmlEditor({ width: "750px", height: height, inputName: "htmlEditor" }); $textToolbar.igToolbar({ "name": "textToolbar", "displayName": "Toolbar text", "isExpanded": true, "collapseButtonIcon": "ui-igbutton-collapse", "expandButtonIcon": "ui-igbutton-expand", "items": [{ "name": "Bold", "type": "button", "scope": null, "props": { "allowToggling": { "value": true }, "isBold": { "value": false, "action": "_isSelectedAction" }, "boldButtonTooltip": { "value": "Bold", "action": "_tooltipAction" }, "boldButtonIcon": { "value": "ui-igbutton-bold", "action": "_buttonIconAction" } } }, { "name": "Italic", "type": "button", "props": { "isItalic": { "value": false, "action": "_isSelectedAction" }, "italicButtonTooltip": { "value": "Italic", "action": "_tooltipAction" }, "italicButtonIcon": { "value": "ui-igbutton-italic", "action": "_buttonIconAction" } } }, { "name": "Underline", "type": "button", "props": { "isUnderline": { "value": false, "action": "_isSelectedAction" }, "underlineButtonTooltip": { "value": "Underline", "action": "_tooltipAction" }, "underlineButtonIcon": { "value": "ui-igbutton-underline", "action": "_buttonIconAction" } } }] }); $iframe = $('#htmlEditor_editor'); $iframe.contents().find("body").on("mouseup", function (ev) { var userSelection, userSelectionString, $bold = $textToolbar.find("div[id*='Bold']"), $italic = $textToolbar.find("div[id*='Italic']"), $underline = $textToolbar.find("div[id*='Underline']"), coord = getSelectionCoords(); if (window.frames[0].document.getSelection) { userSelection = window.frames[0].document.getSelection(); userSelectionString = userSelection.toString(); } else { userSelection = window.frames[0].document.activeElement; userSelectionString = userSelection.textContent; } if (userSelectionString !== "") { $toolbarHolder.parent().css({ position: 'relative' }); $toolbarHolder.css({ top: coord.y, left: coord.x, position: 'absolute' }); mouseMoveCoord = { x: ev.pageX, y: ev.pageY }; if (selectionIs(userSelection, "bold")) { $bold.igToolbarButton("activate"); } if (selectionIs(userSelection, "italic")) { $italic.igToolbarButton("activate"); } if (selectionIs(userSelection, "underline")) { $underline.igToolbarButton("activate"); } $iframe.contents().find("body").on("mousemove", function (ev) { if (userSelectionString !== "") { if (mouseMoveCoord && ((Math.abs(mouseMoveCoord.x - ev.pageX) > 50) || (Math.abs(mouseMoveCoord.y - ev.pageY) > 50))) { $toolbarHolder.fadeOut(); } else { $toolbarHolder.fadeIn(); } } }); $iframe.contents().find("body").on("keydown", function (ev) { if (ev.keyCode === 66 && ev.ctrlKey) { $bold.igToolbarButton("toggle"); } if (ev.keyCode === 73 && ev.ctrlKey) { $italic.igToolbarButton("toggle"); } if (ev.keyCode === 85 && ev.ctrlKey) { $underline.igToolbarButton("toggle"); } }); $toolbarHolder.fadeIn(); } else { $iframe.contents().find("body").off("mousemove"); $iframe.contents().find("body").off("keydown") $toolbarHolder.hide(); if ($bold.igToolbarButton) { $bold.igToolbarButton("deactivate"); } if ($italic) { $italic.igToolbarButton("deactivate"); } if ($underline) { $underline.igToolbarButton("deactivate"); } } }); $(document).on("igtoolbarbuttonclick", function (ev) { var command = $(ev.target).attr("id").replace($textToolbar.attr("id") + "_item_", ""); $htmlEditor.igHtmlEditor("executeAction", command.toLowerCase()); }); $(document).on("ightmleditoractionexecuting", function (ev, ui) { var $button = $textToolbar.find("div[id*='" + ui.actionName + "']"); if ($button.igToolbarButton) { $textToolbar.find("div[id*='" + ui.actionName + "']").igToolbarButton("toggle"); } }); });