From 7b5723705cc091f47d7bb7c2b1cd45c208585c1a Mon Sep 17 00:00:00 2001 From: Wim Brand Date: Mon, 23 Dec 2019 23:56:57 +0100 Subject: [PATCH] Embed resources into templates --- init/conf/config.go | 6 +- .../img/background_patterns}/checker0.png | Bin .../img/background_patterns}/checker1.png | Bin .../img/background_patterns}/checker10.png | Bin .../img/background_patterns}/checker11.png | Bin .../img/background_patterns}/checker12.png | Bin .../img/background_patterns}/checker13.png | Bin .../img/background_patterns}/checker14.png | Bin .../img/background_patterns}/checker15.png | Bin .../img/background_patterns}/checker16.png | Bin .../img/background_patterns}/checker2.png | Bin .../img/background_patterns}/checker3.png | Bin .../img/background_patterns}/checker4.png | Bin .../img/background_patterns}/checker5.png | Bin .../img/background_patterns}/checker6.png | Bin .../img/background_patterns}/checker7.png | Bin .../img/background_patterns}/checker8.png | Bin .../img/background_patterns}/checker9.png | Bin .../checker_wednesday.png | Bin res/include/img/icons/bat_logo_color.png | Bin 0 -> 3762 bytes res/include/img/icons/brave_lion.png | Bin 0 -> 5448 bytes .../img/icons}/clipboard_small.png | Bin .../img/icons}/floppy_small.png | Bin .../img => include/img/icons}/info_small.png | Bin res/include/img/icons/pixeldrain_icon.png | Bin 0 -> 5467 bytes .../img/icons}/pixeldrain_transparent.png | Bin .../img => include/img/icons}/share_small.png | Bin .../img/icons}/shuffle_small.png | Bin .../img/icons}/social_email.png | Bin .../img/icons}/social_facebook.png | Bin .../img/icons}/social_googleplus.png | Bin .../img/icons}/social_reddit.png | Bin .../img/icons}/social_stumbleupon.png | Bin .../img/icons}/social_tumblr.png | Bin .../img/icons}/social_twitter.png | Bin .../img => include/img/icons}/social_voat.png | Bin .../img/icons}/upload_small.png | Bin .../img/misc => include/img}/loadthink.gif | Bin res/include/img/spinner.svg | 33 + .../script/ListNavigator.js | 4 +- res/{static => include}/script/Toolbar.js | 0 res/{static => include}/script/Viewer.js | 0 res/include/script/compiled/home.js | 385 + .../script/compiled/textupload.js | 0 .../script/embedupload.css | 0 res/{static => include}/script/embedupload.js | 0 res/{static => include}/script/history.js | 0 res/{static => include}/script/openlist.js | 0 res/{static => include}/script/paste.js | 0 res/{static => include}/style/layout.css | 80 +- .../style/listview_embed.css | 0 res/{static => include}/style/viewer.css | 0 .../style/viewer_embed.css | 0 res/static/img/bat_logo_color.png | Bin 6239 -> 0 bytes res/static/img/brave_lion.png | Bin 27406 -> 0 bytes res/static/img/brave_text.png | Bin 15023 -> 0 bytes res/static/misc/Cantarell-Light.otf | Bin 0 -> 141608 bytes res/static/misc/Cantarell-Regular.otf | Bin 0 -> 137812 bytes res/static/misc/Cantarell-Regular.ttf | Bin 0 -> 44792 bytes .../chartjs => script}/Chart.bundle.min.js | 0 .../{misc/chartjs => script}/Chart.min.js | 0 res/static/script/compiled/README | 4 - res/static/script/compiled/home.js | 171 +- res/static/typescript/home/home.ts | 61 +- res/static/typescript/home/tsconfig.json | 3 +- res/static/typescript/lib/jquery.d.ts | 18183 ++++++++++------ res/static/typescript/lib/uploader.ts | 63 +- res/static/yo.html | 1 - res/template/admin.html | 5 +- res/template/file_viewer.html | 51 +- res/template/fragments/advertisement.html | 4 +- res/template/fragments/form.html | 2 +- res/template/fragments/meta_tags.html | 1 - res/template/fragments/user_style.html | 6 +- res/template/history.html | 4 +- res/template/home.html | 10 +- res/template/paste.html | 10 +- res/template/widgets.html | 16 +- webcontroller/admin_panel.go | 22 +- webcontroller/{forms/form.go => forms.go} | 2 +- webcontroller/template_data.go | 77 - webcontroller/template_manager.go | 147 - webcontroller/templates.go | 258 + webcontroller/user_account.go | 94 +- webcontroller/user_settings.go | 35 +- webcontroller/user_style.go | 120 +- webcontroller/web_controller.go | 27 +- 87 files changed, 12669 insertions(+), 7216 deletions(-) rename res/{static/img => include/img/background_patterns}/checker0.png (100%) rename res/{static/img => include/img/background_patterns}/checker1.png (100%) rename res/{static/img => include/img/background_patterns}/checker10.png (100%) rename res/{static/img => include/img/background_patterns}/checker11.png (100%) rename res/{static/img => include/img/background_patterns}/checker12.png (100%) rename res/{static/img => include/img/background_patterns}/checker13.png (100%) rename res/{static/img => include/img/background_patterns}/checker14.png (100%) rename res/{static/img => include/img/background_patterns}/checker15.png (100%) rename res/{static/img => include/img/background_patterns}/checker16.png (100%) rename res/{static/img => include/img/background_patterns}/checker2.png (100%) rename res/{static/img => include/img/background_patterns}/checker3.png (100%) rename res/{static/img => include/img/background_patterns}/checker4.png (100%) rename res/{static/img => include/img/background_patterns}/checker5.png (100%) rename res/{static/img => include/img/background_patterns}/checker6.png (100%) rename res/{static/img => include/img/background_patterns}/checker7.png (100%) rename res/{static/img => include/img/background_patterns}/checker8.png (100%) rename res/{static/img => include/img/background_patterns}/checker9.png (100%) rename res/{static/img => include/img/background_patterns}/checker_wednesday.png (100%) create mode 100644 res/include/img/icons/bat_logo_color.png create mode 100644 res/include/img/icons/brave_lion.png rename res/{static/img => include/img/icons}/clipboard_small.png (100%) rename res/{static/img => include/img/icons}/floppy_small.png (100%) rename res/{static/img => include/img/icons}/info_small.png (100%) create mode 100644 res/include/img/icons/pixeldrain_icon.png rename res/{static/img => include/img/icons}/pixeldrain_transparent.png (100%) rename res/{static/img => include/img/icons}/share_small.png (100%) rename res/{static/img => include/img/icons}/shuffle_small.png (100%) rename res/{static/img => include/img/icons}/social_email.png (100%) rename res/{static/img => include/img/icons}/social_facebook.png (100%) rename res/{static/img => include/img/icons}/social_googleplus.png (100%) rename res/{static/img => include/img/icons}/social_reddit.png (100%) rename res/{static/img => include/img/icons}/social_stumbleupon.png (100%) rename res/{static/img => include/img/icons}/social_tumblr.png (100%) rename res/{static/img => include/img/icons}/social_twitter.png (100%) rename res/{static/img => include/img/icons}/social_voat.png (100%) rename res/{static/img => include/img/icons}/upload_small.png (100%) rename res/{static/img/misc => include/img}/loadthink.gif (100%) create mode 100644 res/include/img/spinner.svg rename res/{static => include}/script/ListNavigator.js (97%) rename res/{static => include}/script/Toolbar.js (100%) rename res/{static => include}/script/Viewer.js (100%) create mode 100644 res/include/script/compiled/home.js rename res/{static => include}/script/compiled/textupload.js (100%) rename res/{static => include}/script/embedupload.css (100%) rename res/{static => include}/script/embedupload.js (100%) rename res/{static => include}/script/history.js (100%) rename res/{static => include}/script/openlist.js (100%) rename res/{static => include}/script/paste.js (100%) rename res/{static => include}/style/layout.css (88%) rename res/{static => include}/style/listview_embed.css (100%) rename res/{static => include}/style/viewer.css (100%) rename res/{static => include}/style/viewer_embed.css (100%) delete mode 100644 res/static/img/bat_logo_color.png delete mode 100644 res/static/img/brave_lion.png delete mode 100644 res/static/img/brave_text.png create mode 100644 res/static/misc/Cantarell-Light.otf create mode 100644 res/static/misc/Cantarell-Regular.otf create mode 100644 res/static/misc/Cantarell-Regular.ttf rename res/static/{misc/chartjs => script}/Chart.bundle.min.js (100%) rename res/static/{misc/chartjs => script}/Chart.min.js (100%) delete mode 100644 res/static/script/compiled/README delete mode 100644 res/static/yo.html rename webcontroller/{forms/form.go => forms.go} (99%) delete mode 100644 webcontroller/template_data.go delete mode 100644 webcontroller/template_manager.go create mode 100644 webcontroller/templates.go diff --git a/init/conf/config.go b/init/conf/config.go index ea9ad29..24f0707 100644 --- a/init/conf/config.go +++ b/init/conf/config.go @@ -4,8 +4,7 @@ type PixelWebConfig struct { APIURLExternal string `toml:"api_url_external"` APIURLInternal string `toml:"api_url_internal"` SessionCookieDomain string `toml:"session_cookie_domain"` - StaticResourceDir string `toml:"static_resource_dir"` - TemplateDir string `toml:"template_dir"` + ResourceDir string `toml:"resource_dir"` DebugMode bool `toml:"debug_mode"` MaintenanceMode bool `toml:"maintenance_mode"` } @@ -15,8 +14,7 @@ const DefaultConfig = `# Pixeldrain Web UI server configuration api_url_external = "/api" # Used in the web browser api_url_internal = "http://127.0.0.1:8080" # Used for internal API requests to the pixeldrain server, not visible to users session_cookie_domain = ".pixeldrain.com" -static_resource_dir = "res/static" -template_dir = "res/template" +resource_dir = "res" debug_mode = false maintenance_mode = false ` diff --git a/res/static/img/checker0.png b/res/include/img/background_patterns/checker0.png similarity index 100% rename from res/static/img/checker0.png rename to res/include/img/background_patterns/checker0.png diff --git a/res/static/img/checker1.png b/res/include/img/background_patterns/checker1.png similarity index 100% rename from res/static/img/checker1.png rename to res/include/img/background_patterns/checker1.png diff --git a/res/static/img/checker10.png b/res/include/img/background_patterns/checker10.png similarity index 100% rename from res/static/img/checker10.png rename to res/include/img/background_patterns/checker10.png diff --git a/res/static/img/checker11.png b/res/include/img/background_patterns/checker11.png similarity index 100% rename from res/static/img/checker11.png rename to res/include/img/background_patterns/checker11.png diff --git a/res/static/img/checker12.png b/res/include/img/background_patterns/checker12.png similarity index 100% rename from res/static/img/checker12.png rename to res/include/img/background_patterns/checker12.png diff --git a/res/static/img/checker13.png b/res/include/img/background_patterns/checker13.png similarity index 100% rename from res/static/img/checker13.png rename to res/include/img/background_patterns/checker13.png diff --git a/res/static/img/checker14.png b/res/include/img/background_patterns/checker14.png similarity index 100% rename from res/static/img/checker14.png rename to res/include/img/background_patterns/checker14.png diff --git a/res/static/img/checker15.png b/res/include/img/background_patterns/checker15.png similarity index 100% rename from res/static/img/checker15.png rename to res/include/img/background_patterns/checker15.png diff --git a/res/static/img/checker16.png b/res/include/img/background_patterns/checker16.png similarity index 100% rename from res/static/img/checker16.png rename to res/include/img/background_patterns/checker16.png diff --git a/res/static/img/checker2.png b/res/include/img/background_patterns/checker2.png similarity index 100% rename from res/static/img/checker2.png rename to res/include/img/background_patterns/checker2.png diff --git a/res/static/img/checker3.png b/res/include/img/background_patterns/checker3.png similarity index 100% rename from res/static/img/checker3.png rename to res/include/img/background_patterns/checker3.png diff --git a/res/static/img/checker4.png b/res/include/img/background_patterns/checker4.png similarity index 100% rename from res/static/img/checker4.png rename to res/include/img/background_patterns/checker4.png diff --git a/res/static/img/checker5.png b/res/include/img/background_patterns/checker5.png similarity index 100% rename from res/static/img/checker5.png rename to res/include/img/background_patterns/checker5.png diff --git a/res/static/img/checker6.png b/res/include/img/background_patterns/checker6.png similarity index 100% rename from res/static/img/checker6.png rename to res/include/img/background_patterns/checker6.png diff --git a/res/static/img/checker7.png b/res/include/img/background_patterns/checker7.png similarity index 100% rename from res/static/img/checker7.png rename to res/include/img/background_patterns/checker7.png diff --git a/res/static/img/checker8.png b/res/include/img/background_patterns/checker8.png similarity index 100% rename from res/static/img/checker8.png rename to res/include/img/background_patterns/checker8.png diff --git a/res/static/img/checker9.png b/res/include/img/background_patterns/checker9.png similarity index 100% rename from res/static/img/checker9.png rename to res/include/img/background_patterns/checker9.png diff --git a/res/static/img/checker_wednesday.png b/res/include/img/background_patterns/checker_wednesday.png similarity index 100% rename from res/static/img/checker_wednesday.png rename to res/include/img/background_patterns/checker_wednesday.png diff --git a/res/include/img/icons/bat_logo_color.png b/res/include/img/icons/bat_logo_color.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b01c33b0dff3983507968c1f7e016d4150ba0c GIT binary patch literal 3762 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 literal 0 HcmV?d00001 diff --git a/res/include/img/icons/brave_lion.png b/res/include/img/icons/brave_lion.png new file mode 100644 index 0000000000000000000000000000000000000000..aaa017d7e906cd080837ba4a63189a1e71618da9 GIT binary patch literal 5448 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 R=VAZ=002ovPDHLkV1nv;ep~ + + + + diff --git a/res/static/script/ListNavigator.js b/res/include/script/ListNavigator.js similarity index 97% rename from res/static/script/ListNavigator.js rename to res/include/script/ListNavigator.js index 1f33591..e95b65e 100644 --- a/res/static/script/ListNavigator.js +++ b/res/include/script/ListNavigator.js @@ -182,7 +182,7 @@ var ListNavigator = { btnDownloadList.setAttribute("onClick", "Toolbar.downloadList();"); var btnDownloadListImg = document.createElement("img"); - btnDownloadListImg.setAttribute("src", "/res/img/floppy_small.png"); + btnDownloadListImg.setAttribute("src", "{{template `floppy_small.png`}}"); btnDownloadListImg.setAttribute("alt", "Download List"); var btnDownloadListText = document.createElement("span"); @@ -199,7 +199,7 @@ var ListNavigator = { btnShuffle.setAttribute("onClick", "ListNavigator.toggleShuffle();"); var btnShuffleImg = document.createElement("img"); - btnShuffleImg.setAttribute("src", "/res/img/shuffle_small.png"); + btnShuffleImg.setAttribute("src", "{{template `shuffle_small.png`}}"); btnShuffleImg.setAttribute("alt", "Shuffle playback order"); var btnShuffleText = document.createElement("span"); diff --git a/res/static/script/Toolbar.js b/res/include/script/Toolbar.js similarity index 100% rename from res/static/script/Toolbar.js rename to res/include/script/Toolbar.js diff --git a/res/static/script/Viewer.js b/res/include/script/Viewer.js similarity index 100% rename from res/static/script/Viewer.js rename to res/include/script/Viewer.js diff --git a/res/include/script/compiled/home.js b/res/include/script/compiled/home.js new file mode 100644 index 0000000..217b588 --- /dev/null +++ b/res/include/script/compiled/home.js @@ -0,0 +1,385 @@ +var FinishedUpload = /** @class */ (function () { + function FinishedUpload() { + } + return FinishedUpload; +}()); +var uploader = null; +var finishedUploads = new Array(); +var totalUploads = 0; +var queueDiv = document.getElementById("uploads_queue"); +var UploadProgressBar = /** @class */ (function () { + function UploadProgressBar(file) { + this.file = file; + this.name = file.name; + this.queueNum = totalUploads; + this.uploadDiv = document.createElement("a"); + totalUploads++; + this.uploadDiv.classList.add("file_button"); + this.uploadDiv.style.opacity = "0"; + this.uploadDiv.innerText = "Queued\n" + this.file.name; + queueDiv.appendChild(this.uploadDiv); + // Browsers don't render the transition if the opacity is set and + // updated in the same frame. So we have to wait a frame (or more) + // before changing the opacity to make sure the transition triggers + var d = this.uploadDiv; // `this` stops working after constructor ends + window.setTimeout(function () { d.style.opacity = "1"; }, 100); + } + UploadProgressBar.prototype.onProgress = function (progress) { + this.uploadDiv.innerText = "Uploading... " + Math.round(progress * 1000) / 10 + "%\n" + this.file.name; + this.uploadDiv.style.background = 'linear-gradient(' + + 'to right, ' + + 'var(--file_background_color) 0%, ' + + 'var(--highlight_color) ' + ((progress * 100)) + '%, ' + + 'var(--file_background_color) ' + ((progress * 100) + 1) + '%)'; + }; + UploadProgressBar.prototype.onFinished = function (id) { + finishedUploads[this.queueNum] = { + id: id, + name: this.file.name + }; + this.uploadDiv.style.background = 'var(--file_background_color)'; + this.uploadDiv.href = '/u/' + id; + this.uploadDiv.target = "_blank"; + var fileImg = document.createElement("img"); + fileImg.src = apiEndpoint + '/file/' + id + '/thumbnail'; + fileImg.alt = this.file.name; + var linkSpan = document.createElement("span"); + linkSpan.style.color = "var(--highlight_color)"; + linkSpan.innerText = window.location.hostname + "/u/" + id; + this.uploadDiv.innerHTML = ""; // Remove uploading progress + this.uploadDiv.appendChild(fileImg); + this.uploadDiv.appendChild(document.createTextNode(this.file.name)); + this.uploadDiv.appendChild(document.createElement("br")); + this.uploadDiv.appendChild(linkSpan); + }; + UploadProgressBar.prototype.onFailure = function (error) { + this.uploadDiv.innerHTML = ""; // Remove uploading progress + this.uploadDiv.style.background = 'var(--danger_color)'; + this.uploadDiv.appendChild(document.createTextNode(this.file.name)); + this.uploadDiv.appendChild(document.createElement("br")); + this.uploadDiv.appendChild(document.createTextNode("Upload failed after three tries:")); + this.uploadDiv.appendChild(document.createElement("br")); + this.uploadDiv.appendChild(document.createTextNode(error)); + }; + return UploadProgressBar; +}()); +function handleUploads(files) { + if (uploader === null) { + uploader = new UploadManager(); + } + for (var i = 0; i < files.length; i++) { + uploader.uploadFile(new UploadProgressBar(files.item(i))); + } +} +// List creation +function createList(title, anonymous) { + if (uploader.uploading()) { + var cont = confirm("Some files have not finished uploading yet. Creating a list now " + + "will exclude those files.\n\nContinue?"); + if (!cont) { + return; + } + } + var postData = { + "title": title, + "anonymous": anonymous, + "files": new Array() + }; + for (var i = 0; i < finishedUploads.length; i++) { + postData.files.push({ + "id": finishedUploads[i].id + }); + } + var xhr = new XMLHttpRequest(); + xhr.open("POST", apiEndpoint + "/list"); + xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8"); + xhr.onreadystatechange = function () { + if (xhr.readyState !== 4) { + return; + } + var resp = JSON.parse(xhr.response); + if (xhr.status < 400) { + // Request is a success + var div = document.createElement("div"); + div.className = "file_button"; + div.innerHTML = '' + + "List creation finished!
" + + title + "
" + + '' + window.location.hostname + '/l/' + resp.id + ''; + document.getElementById("uploads_queue").appendChild(div); + window.open('/l/' + resp.id, '_blank'); + } + else { + console.log("status: " + xhr.status + " response: " + xhr.response); + var div = document.createElement("div"); + div.className = "file_button"; + div.innerHTML = "List creation failed
" + + "The server responded with:
" + + resp.message; + document.getElementById("uploads_queue").append(div); + } + }; + xhr.send(JSON.stringify(postData)); +} +// Form upload handlers +// Relay click event to hidden file field +document.getElementById("select_file_button").onclick = function () { + document.getElementById("file_input_field").click(); +}; +document.getElementById("file_input_field").onchange = function (evt) { + handleUploads(evt.target.files); + // This resets the file input field + document.getElementById("file_input_field").nodeValue = ""; +}; +/* + * Drag 'n Drop upload handlers + */ +document.ondragover = function (e) { + e.preventDefault(); + e.stopPropagation(); +}; +document.ondragenter = function (e) { + e.preventDefault(); + e.stopPropagation(); +}; +document.addEventListener('drop', function (e) { + if (e.dataTransfer && e.dataTransfer.files.length > 0) { + e.preventDefault(); + e.stopPropagation(); + handleUploads(e.dataTransfer.files); + } +}); +function copyText(text) { + // Create a textarea to copy the text from + var ta = document.createElement("textarea"); + ta.setAttribute("readonly", "readonly"); + ta.style.position = "absolute"; + ta.style.left = "-9999px"; + ta.value = text; // Put the text in the textarea + // Add the textarea to the DOM so it can be seleted by the user + document.body.appendChild(ta); + ta.select(); // Select the contents of the textarea + var success = document.execCommand("copy"); // Copy the selected text + document.body.removeChild(ta); // Remove the textarea + return success; +} +// Create list button +document.getElementById("btn_create_list").addEventListener("click", function (evt) { + var title = prompt("You are creating a list containing " + finishedUploads.length + " files.\n" + + "What do you want to call it?", "My New Album"); + if (title === null) { + return; + } + createList(title, false); +}); +var btnCopyLinks = document.getElementById("btn_copy_links"); +btnCopyLinks.addEventListener("click", function () { + var text = ""; + // Add the text to the textarea + for (var i = 0; i < finishedUploads.length; i++) { + // Example: https://pixeldrain.com/u/abcd1234: Some_file.png + text += window.location.protocol + "//" + window.location.hostname + "/u/" + finishedUploads[i].id + + " " + finishedUploads[i].name + "\n"; + } + var defaultButtonText = btnCopyLinks.innerHTML; + // Copy the selected text + if (copyText(text)) { + btnCopyLinks.classList.add("button_highlight"); + btnCopyLinks.innerHTML = "Links copied to clipboard!"; + // Return to normal + setTimeout(function () { + btnCopyLinks.innerHTML = defaultButtonText; + btnCopyLinks.classList.remove("button_highlight"); + }, 60000); + } + else { + btnCopyLinks.classList.add("button_red"); + btnCopyLinks.innerHTML = "Copying links failed"; + setTimeout(function () { + btnCopyLinks.innerHTML = defaultButtonText; + btnCopyLinks.classList.remove("button_red"); + }, 60000); + } +}); +var btnCopyBBCode = document.getElementById("btn_copy_bbcode"); +btnCopyBBCode.addEventListener("click", function () { + var text = ""; + // Add the text to the textarea + for (var i = 0; i < finishedUploads.length; i++) { + // Example: [url=https://pixeldrain.com/u/abcd1234]Some_file.png[/url] + text += "[url=" + window.location.protocol + "//" + window.location.hostname + + "/u/" + finishedUploads[i].id + "]" + + finishedUploads[i].name + "[/url]\n"; + } + var defaultButtonText = btnCopyBBCode.innerHTML; + // Copy the selected text + if (copyText(text)) { + btnCopyBBCode.classList.add("button_highlight"); + btnCopyBBCode.innerHTML = "BBCode copied to clipboard!"; + // Return to normal + setTimeout(function () { + btnCopyBBCode.innerHTML = defaultButtonText; + btnCopyBBCode.classList.remove("button_highlight"); + }, 60000); + } + else { + btnCopyBBCode.classList.add("button_red"); + btnCopyBBCode.innerHTML = "Copying links failed"; + setTimeout(function () { + btnCopyBBCode.innerHTML = defaultButtonText; + btnCopyBBCode.classList.remove("button_red"); + }, 60000); + } +}); +var Cookie; +(function (Cookie) { + function read(name) { + var result = new RegExp('(?:^|; )' + encodeURIComponent(name) + '=([^;]*)').exec(document.cookie); + return result ? result[1] : null; + } + Cookie.read = read; + function write(name, value, days) { + if (!days) { + days = 365 * 20; + } + var date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + var expires = "; expires=" + date.toUTCString(); + document.cookie = name + "=" + value + expires + "; path=/"; + } + Cookie.write = write; + function remove(name) { + write(name, "", -1); + } + Cookie.remove = remove; +})(Cookie || (Cookie = {})); +var UploadManager = /** @class */ (function () { + function UploadManager() { + this.uploadQueue = new Array(); + this.uploadThreads = new Array(); + this.maxThreads = 3; + } + UploadManager.prototype.uploadFile = function (file) { + console.debug("Adding upload to queue"); + this.uploadQueue.push(file); + if (this.uploadThreads.length < this.maxThreads) { + console.debug("Starting upload thread"); + var thread_1 = new UploadWorker(this); + this.uploadThreads.push(thread_1); + setTimeout(function () { thread_1.start(); }, 0); // Start a new upload thread + } + else { + for (var i = 0; i < this.uploadThreads.length; i++) { + this.uploadThreads[i].start(); + } + } + }; + UploadManager.prototype.uploading = function () { + for (var i = 0; i < this.uploadThreads.length; i++) { + if (this.uploadThreads[i].isUploading()) { + return true; + } + } + return false; + }; + UploadManager.prototype.grabFile = function () { + if (this.uploadQueue.length > 0) { + return this.uploadQueue.shift(); + } + else { + return undefined; + } + }; + return UploadManager; +}()); +var UploadWorker = /** @class */ (function () { + function UploadWorker(manager) { + this.tries = 0; + this.uploading = false; + this.manager = manager; + } + UploadWorker.prototype.isUploading = function () { return this.uploading; }; + UploadWorker.prototype.start = function () { + if (!this.uploading) { + this.newFile(); + } + }; + UploadWorker.prototype.newFile = function () { + var file = this.manager.grabFile(); + if (file === undefined) { // No more files in the queue. We're finished + this.uploading = false; + console.debug("No files left in queue"); + return; // Stop the thread + } + this.uploading = true; + this.tries = 0; + this.upload(file); + }; + UploadWorker.prototype.upload = function (file) { + console.debug("Starting upload of " + file.name); + var that = this; // jquery changes the definiton of "this" + var formData = new FormData(); + formData.append("name", file.name); + formData.append('file', file.file); + var xhr = new XMLHttpRequest(); + xhr.open("POST", apiEndpoint + "/file"); + xhr.timeout = 21600000; // 6 hours, to account for slow connections + // Update progess bar on progress + xhr.upload.addEventListener("progress", function (evt) { + if (evt.lengthComputable) { + file.onProgress(evt.loaded / evt.total); + } + }); + xhr.onreadystatechange = function () { + if (xhr.readyState !== 4) { + return; + } + console.log("status: " + xhr.status); + if (xhr.status >= 100 && xhr.status < 400) { + var resp = JSON.parse(xhr.response); + // Request is a success + file.onFinished(resp.id); + that.setHistoryCookie(resp.id); + that.newFile(); // Continue uploading on this thread + } + else { + var value, message; + if (xhr.status >= 400) { + var resp = JSON.parse(xhr.response); + value = resp.value; + message = resp.message; + } + console.log("Upload error. status: " + xhr.status + " response: " + xhr.response); + if (that.tries === 3) { + file.onFailure(value, message); + setTimeout(function () { that.newFile(); }, 2000); // Try to continue + return; // Upload failed + } + // Try again + that.tries++; + setTimeout(function () { that.upload(file); }, that.tries * 5000); + } + }; + xhr.send(formData); + }; + UploadWorker.prototype.setHistoryCookie = function (id) { + // Make sure the user is not logged in, for privacy. This keeps the + // files uploaded while logged in and anonymously uploaded files + // separated + if (Cookie.read("pd_auth_key") !== null) { + return; + } + var uc = Cookie.read("pduploads"); + // First upload in this browser + if (uc === null) { + Cookie.write("pduploads", id + ".", undefined); + return; + } + if (uc.length > 2000) { + // Cookie is becoming too long, drop the oldest two files + uc = uc.substring(uc.indexOf(".") + 1).substring(uc.indexOf(".") + 1); + } + Cookie.write("pduploads", uc + id + ".", undefined); + }; + return UploadWorker; +}()); diff --git a/res/static/script/compiled/textupload.js b/res/include/script/compiled/textupload.js similarity index 100% rename from res/static/script/compiled/textupload.js rename to res/include/script/compiled/textupload.js diff --git a/res/static/script/embedupload.css b/res/include/script/embedupload.css similarity index 100% rename from res/static/script/embedupload.css rename to res/include/script/embedupload.css diff --git a/res/static/script/embedupload.js b/res/include/script/embedupload.js similarity index 100% rename from res/static/script/embedupload.js rename to res/include/script/embedupload.js diff --git a/res/static/script/history.js b/res/include/script/history.js similarity index 100% rename from res/static/script/history.js rename to res/include/script/history.js diff --git a/res/static/script/openlist.js b/res/include/script/openlist.js similarity index 100% rename from res/static/script/openlist.js rename to res/include/script/openlist.js diff --git a/res/static/script/paste.js b/res/include/script/paste.js similarity index 100% rename from res/static/script/paste.js rename to res/include/script/paste.js diff --git a/res/static/style/layout.css b/res/include/style/layout.css similarity index 88% rename from res/static/style/layout.css rename to res/include/style/layout.css index abc24a2..9e6aad2 100644 --- a/res/static/style/layout.css +++ b/res/include/style/layout.css @@ -10,44 +10,29 @@ /* Fonts */ @font-face { - font-family: 'Ubuntu'; + font-family: 'default'; + font-display: fallback; font-style: normal; - font-weight: 400; - font-display: fallback; - text-rendering: optimizeLegibility; + font-weight: normal; + text-rendering: optimizeLegibility; src: - local('Ubuntu'), - local('Ubuntu Regular'), - local('Ubuntu, Regular'), - local('Ubuntu-Regular'), - url(/res/misc/Ubuntu-R.ttf) format('truetype'); + local('Cantarell'), + local('Cantarell Regular'), + local('Cantarell, Regular'), + local('Cantarell-Regular'), + url("/res/misc/Cantarell-Regular.otf") format("opentype"); } @font-face { - font-family: 'Lato Thin'; + font-family: 'light'; font-display: fallback; - font-style: normal; - font-weight: normal; - text-rendering: optimizeLegibility; + font-style: normal; + font-weight: normal; + text-rendering: optimizeLegibility; src: - local('Lato Thin'), - local('Lato, Thin'), - local('Lato-Thin'), - local('Lato Hairline'), - local('Lato, Hairline'), - local('Lato-Hairline'), - url(/res/misc/LatoLatin-Thin.ttf) format('truetype'); -} -@font-face { - font-family: 'Lato'; - font-display: fallback; - font-style: normal; - font-weight: normal; - text-rendering: optimizeLegibility; - src: - local('Lato Regular'), - local('Lato, Regular'), - local('Lato-Regular'), - url(/res/misc/Lato-Regular.ttf) format('truetype'); + local('Cantarell Light'), + local('Cantarell, Light'), + local('Cantarell-Light'), + url("/res/misc/Cantarell-Light.otf") format("opentype"); } /* Page rendering configuration */ @@ -58,7 +43,7 @@ body{ background-color: #0d0d0d; /* Fallback */ background-color: var(--body_color); background-repeat: repeat; - font-family: 'Ubuntu'; + font-family: "default"; margin: 0; line-height: 1.5em; color: #bfbfbf; /* Fallback */ @@ -174,11 +159,10 @@ body{ color: #bfbfbf; /* Fallback */ color: var(--text_color); text-align: center; - padding: 4px 6px; + padding: 6px 6px; margin: 0.3em 15px 0.3em 15px; - font-family: "Lato Thin", sans-serif; - font-weight: bold; - font-size: 1.5em; + font-family: "light"; + font-size: 1.6em; overflow: hidden; text-overflow: ellipsis; transition: background-color 0.5s; @@ -197,6 +181,9 @@ body{ text-shadow: 0 0 20px #000000; padding: 30px 10px 30px 10px; } +body, .checkers { + background-image: url("{{bgPattern}}"); +} .highlight_dark, .highlight_middle, @@ -255,12 +242,12 @@ h1, h2, h3, h4, h5, h6 { margin-left: 10px; margin-right: 10px; } -h1{font-size: 2em; font-family: "Lato Thin";} -h2{font-size: 1.75em; font-family: "Lato Thin";} -h3{font-size: 1.5em; font-family: "Lato Thin";} -h4{font-size: 1.25em; font-family: "Lato";} -h5{font-size: 1em; font-family: "Lato";} -h6{font-size: .75em; font-family: "Lato";} +h1{font-size: 2em; font-family: "light"; font-weight: normal;} +h2{font-size: 1.75em; font-family: "light"; font-weight: normal;} +h3{font-size: 1.5em; font-family: "light"; font-weight: normal;} +h4{font-size: 1.25em; font-family: "default"; font-weight: normal;} +h5{font-size: 1em; font-family: "default"; font-weight: normal;} +h6{font-size: .75em; font-family: "default"; font-weight: normal;} h3, h2{border-bottom: 1px var(--layer_3_color_border) solid;} /* Differentiate it a bit, else it just looks like bold text */ p, .indent { @@ -325,7 +312,6 @@ pre{ margin: 10px !important; border-radius: 5px; font-size: 1.8em; - font-weight: normal; } .progress_bar{ @@ -403,7 +389,7 @@ button, input[type="submit"], input[type="button"], input[type="color"], -select{ +select { display: inline-block; box-sizing: border-box; border-radius: 2px; @@ -416,7 +402,6 @@ select{ line-height: 1em; overflow: hidden; text-decoration: none; - font-family: inherit; color: #bfbfbf; /* Fallback */ color: var(--input_text_color); outline: 0; @@ -435,7 +420,7 @@ button:focus, input[type="submit"]:focus, input[type="button"]:focus, input[type="color"]:focus, -select:focus{ +select:focus { color: #bfbfbf; /* Fallback */ color: var(--input_text_color); text-decoration: none; @@ -479,7 +464,6 @@ input[type="number"]{ padding: 3px 5px; color: var(--input_text_color); height: 26px; - font-family: 'Ubuntu', sans-serif; font-size: 1em; vertical-align: middle; outline: 0; diff --git a/res/static/style/listview_embed.css b/res/include/style/listview_embed.css similarity index 100% rename from res/static/style/listview_embed.css rename to res/include/style/listview_embed.css diff --git a/res/static/style/viewer.css b/res/include/style/viewer.css similarity index 100% rename from res/static/style/viewer.css rename to res/include/style/viewer.css diff --git a/res/static/style/viewer_embed.css b/res/include/style/viewer_embed.css similarity index 100% rename from res/static/style/viewer_embed.css rename to res/include/style/viewer_embed.css diff --git a/res/static/img/bat_logo_color.png b/res/static/img/bat_logo_color.png deleted file mode 100644 index 46fb7291184ecc04dddcf32379f7b345f81c5d35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6239 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 JPDHLkV1hU{#}@zq diff --git a/res/static/img/brave_lion.png b/res/static/img/brave_lion.png deleted file mode 100644 index 5081a78ea6140ebfaa434f2ff21e846643763e34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27406 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 diff --git a/res/static/img/brave_text.png b/res/static/img/brave_text.png deleted file mode 100644 index 8860dbac8b45ecd8007319a8303036dc22d74106..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15023 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 literal 0 HcmV?d00001 diff --git a/res/static/misc/Cantarell-Regular.otf b/res/static/misc/Cantarell-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..e668e6efec466c6ce380b88a8e05a78e43ade5b5 GIT binary patch literal 137812 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 O*`RruO6FkZx<3Hou%jjb literal 0 HcmV?d00001 diff --git a/res/static/misc/Cantarell-Regular.ttf b/res/static/misc/Cantarell-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ceb9275122fca2d33a23bf4fe664f9b1d10cf73b GIT binary patch literal 44792 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 X11k0bm6`yRdI0fI0ah2d18e*X^Z|wj literal 0 HcmV?d00001 diff --git a/res/static/misc/chartjs/Chart.bundle.min.js b/res/static/script/Chart.bundle.min.js similarity index 100% rename from res/static/misc/chartjs/Chart.bundle.min.js rename to res/static/script/Chart.bundle.min.js diff --git a/res/static/misc/chartjs/Chart.min.js b/res/static/script/Chart.min.js similarity index 100% rename from res/static/misc/chartjs/Chart.min.js rename to res/static/script/Chart.min.js diff --git a/res/static/script/compiled/README b/res/static/script/compiled/README deleted file mode 100644 index e1286db..0000000 --- a/res/static/script/compiled/README +++ /dev/null @@ -1,4 +0,0 @@ -All files in this directory are compiled typescript files. You can find the -sources in /res/typescript. - -Have fun typing! \ No newline at end of file diff --git a/res/static/script/compiled/home.js b/res/static/script/compiled/home.js index 2bca7a1..ff7a12e 100644 --- a/res/static/script/compiled/home.js +++ b/res/static/script/compiled/home.js @@ -89,39 +89,68 @@ function createList(title, anonymous) { "id": finishedUploads[i].id }); } - $.ajax({ - url: "/api/list", - contentType: "application/json", - method: "POST", - data: JSON.stringify(postData), - dataType: "json", - success: function (response) { + var xhr = new XMLHttpRequest(); + xhr.open("POST", apiEndpoint + "/list"); + xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8"); + xhr.onreadystatechange = function () { + if (xhr.readyState !== 4) { + return; + } + if (xhr.status == 200 || xhr.status == 0) { + // Request is a success var resultString = "

"; - $('#uploads_queue').append($(resultString).hide().fadeIn('slow').css("display", "")); - $("#uploads_queue").animate({ - scrollTop: $("#uploads_queue").prop("scrollHeight") - }, 1000); - window.open('/l/' + response.id, '_blank'); - }, - error: function (xhr, status, error) { - console.log("xhr:"); - console.log(xhr); - console.log("status:"); - console.log(status); - console.log("error:"); - console.log(error); + document.getElementById("uploads_queue").append(resultString); + window.open('/l/' + xhr.response.id, '_blank'); + } + else { + console.log("status: " + xhr.status + " response: " + xhr.response); var resultString = "
List creation failed
" + "The server responded with this:
" - + xhr.responseJSON.message + + xhr.response.message + "
"; - $('#uploads_queue').append($(resultString).hide().fadeIn('slow').css("display", "")); + document.getElementById("uploads_queue").append(resultString); } - }); + }; + xhr.send(JSON.stringify(postData)); + // $.ajax({ + // url: "/api/list", + // contentType: "application/json", + // method: "POST", + // data: JSON.stringify(postData), + // dataType: "json", + // success: function(response) { + // var resultString = "
" + // + '' + // + "List creation finished!
" + // + title + "
" + // + ""+window.location.hostname+"/l/" + response.id + "" + // + "
"; + // $('#uploads_queue').append( + // $(resultString).hide().fadeIn('slow').css("display", "") + // ); + // window.open('/l/'+response.id, '_blank'); + // }, + // error: function(xhr, status, error) { + // console.log("xhr:"); + // console.log(xhr); + // console.log("status:"); + // console.log(status); + // console.log("error:"); + // console.log(error); + // var resultString = "
List creation failed
" + // + "The server responded with this:
" + // + xhr.responseJSON.message + // + "
"; + // $('#uploads_queue').append( + // $(resultString).hide().fadeIn('slow').css("display", "") + // ); + // } + // }); } // Form upload handlers // Relay click event to hidden file field @@ -319,39 +348,35 @@ var UploadWorker = /** @class */ (function () { }; UploadWorker.prototype.upload = function (file) { console.debug("Starting upload of " + file.name); + var that = this; // jquery changes the definiton of "this" var formData = new FormData(); formData.append("name", file.name); formData.append('file', file.file); - var that = this; // jquery changes the definiton of "this" - $.ajax({ - type: 'POST', - url: apiEndpoint + "/file", - data: formData, - timeout: 21600000, - cache: false, - async: true, - crossDomain: false, - contentType: false, - processData: false, - xhr: function () { - var xhr = new XMLHttpRequest(); - xhr.upload.addEventListener("progress", function (evt) { - if (evt.lengthComputable) { - file.onProgress(evt.loaded / evt.total); - } - }, false); - return xhr; - }, - success: function (data) { - file.onFinished(data.id); - that.setHistoryCookie(data.id); - console.log("Done: " + data.id); + var xhr = new XMLHttpRequest(); + xhr.open("POST", apiEndpoint + "/file"); + xhr.timeout = 21600000; // 6 hours, to account for slow connections + xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + // Update progess bar on progress + xhr.onprogress = function (evt) { + if (evt.lengthComputable) { + file.onProgress(evt.loaded / evt.total); + } + }; + xhr.onreadystatechange = function () { + if (xhr.readyState !== 4) { + return; + } + if (xhr.status == 200 || xhr.status == 0) { + // Request is a success + file.onFinished(xhr.response.id); + that.setHistoryCookie(xhr.response.id); + console.log("Done: " + xhr.response.id); that.newFile(); // Continue uploading on this thread - }, - error: function (xhr, status, error) { - console.log("status: " + status + " error: " + error); + } + else { + console.log("status: " + xhr.status + " response: " + xhr.response); if (that.tries === 3) { - file.onFailure(status, error); + file.onFailure(xhr.response.value, xhr.response.message); setTimeout(function () { that.newFile(); }, 2000); // Try to continue return; // Upload failed } @@ -359,7 +384,45 @@ var UploadWorker = /** @class */ (function () { that.tries++; setTimeout(function () { that.upload(file); }, that.tries * 3000); } - }); + }; + xhr.send(formData); + // $.ajax({ + // type: 'POST', + // url: apiEndpoint+"/file", + // data: formData, + // timeout: 21600000, // 6 hours, to account for slow connections + // cache: false, + // async: true, + // crossDomain: false, + // contentType: false, + // processData: false, + // xhr: function () { + // var xhr = new XMLHttpRequest(); + // xhr.upload.addEventListener("progress", function (evt) { + // if (evt.lengthComputable) { + // file.onProgress(evt.loaded / evt.total) + // } + // }, false); + // return xhr; + // }, + // success: function (data) { + // file.onFinished(data.id) + // that.setHistoryCookie(data.id) + // console.log("Done: " + data.id) + // that.newFile() // Continue uploading on this thread + // }, + // error: function (xhr, status, error){ + // console.log("status: "+status+" error: "+error) + // if (that.tries === 3) { + // file.onFailure(status, error) + // setTimeout(function(){that.newFile()}, 2000) // Try to continue + // return; // Upload failed + // } + // // Try again + // that.tries++ + // setTimeout(function(){that.upload(file)}, that.tries*3000) + // } + // }); }; UploadWorker.prototype.setHistoryCookie = function (id) { // Make sure the user is not logged in, for privacy. This keeps the diff --git a/res/static/typescript/home/home.ts b/res/static/typescript/home/home.ts index 8b556e3..a89294c 100644 --- a/res/static/typescript/home/home.ts +++ b/res/static/typescript/home/home.ts @@ -68,6 +68,7 @@ class UploadProgressBar implements FileUpload { this.uploadDiv.appendChild(linkSpan) } public onFailure(error: string) { + this.uploadDiv.innerHTML = "" // Remove uploading progress this.uploadDiv.style.background = 'var(--danger_color)' this.uploadDiv.appendChild(document.createTextNode(this.file.name)) this.uploadDiv.appendChild(document.createElement("br")) @@ -109,43 +110,35 @@ function createList(title: string, anonymous: boolean){ }); } - $.ajax({ - url: "/api/list", - contentType: "application/json", - method: "POST", - data: JSON.stringify(postData), - dataType: "json", - success: function(response) { - var resultString = "
" - + '' + var xhr = new XMLHttpRequest() + xhr.open("POST", apiEndpoint+"/list") + xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8") + xhr.onreadystatechange = function(){ + if (xhr.readyState !== 4) {return;} + var resp = JSON.parse(xhr.response); + + if (xhr.status < 400) { + // Request is a success + var div = document.createElement("div") + div.className = "file_button"; + div.innerHTML = '' + "List creation finished!
" + title + "
" - + ""+window.location.hostname+"/l/" + response.id + "" - + "
"; - $('#uploads_queue').append( - $(resultString).hide().fadeIn('slow').css("display", "") - ); - $("#uploads_queue").animate({ - scrollTop: $("#uploads_queue").prop("scrollHeight") - }, 1000); - window.open('/l/'+response.id, '_blank'); - }, - error: function(xhr, status, error) { - console.log("xhr:"); - console.log(xhr); - console.log("status:"); - console.log(status); - console.log("error:"); - console.log(error); - var resultString = "
List creation failed
" - + "The server responded with this:
" - + xhr.responseJSON.message - + "
"; - $('#uploads_queue').append( - $(resultString).hide().fadeIn('slow').css("display", "") - ); + + ''+window.location.hostname+'/l/'+resp.id+''; + document.getElementById("uploads_queue").appendChild(div); + window.open('/l/'+resp.id, '_blank'); + } else { + console.log("status: "+xhr.status+" response: "+xhr.response) + var div = document.createElement("div") + div.className = "file_button"; + div.innerHTML = "List creation failed
" + + "The server responded with:
" + + resp.message; + document.getElementById("uploads_queue").append(div); } - }); + } + + xhr.send(JSON.stringify(postData)); } // Form upload handlers diff --git a/res/static/typescript/home/tsconfig.json b/res/static/typescript/home/tsconfig.json index 3d95f26..074f4dd 100644 --- a/res/static/typescript/home/tsconfig.json +++ b/res/static/typescript/home/tsconfig.json @@ -1,11 +1,10 @@ { "compilerOptions": { - "outFile": "../../script/compiled/home.js" + "outFile": "../../../include/script/compiled/home.js" }, "files": [ "home.ts", "../lib/cookie.ts", - "../lib/jquery.d.ts", "../lib/uploader.ts" ] } diff --git a/res/static/typescript/lib/jquery.d.ts b/res/static/typescript/lib/jquery.d.ts index c4abf6d..ed0147a 100644 --- a/res/static/typescript/lib/jquery.d.ts +++ b/res/static/typescript/lib/jquery.d.ts @@ -1,3098 +1,640 @@ -// Type definitions for jquery 3.2 -// Project: https://jquery.com -// Definitions by: Leonard Thieu -// Boris Yankov -// Christian Hoffmeister -// Steve Fenton -// Diullei Gomes -// Tass Iliopoulos -// Jason Swearingen -// Sean Hill -// Guus Goossens -// Kelly Summerlin -// Basarat Ali Syed -// Nicholas Wolverson -// Derek Cicerone -// Andrew Gaspar -// Seikichi Kondo -// Benjamin Jackman -// Poul Sorensen -// Josh Strobl -// John Reilly -// Dick van den Brink -// Thomas Schulz -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -// TypeScript Version: 2.3 +// tslint:disable:jsdoc-format +// tslint:disable:max-line-length +// tslint:disable:no-irregular-whitespace -declare module 'jquery' { - export = jQuery; -} - -declare module 'jquery/dist/jquery.slim' { - export = jQuery; -} - -declare const jQuery: JQueryStatic; -declare const $: JQueryStatic; - -// Used by JQuery.Event -type _Event = Event; -// Used by JQuery.Promise3 and JQuery.Promise -type _Promise = Promise; - -interface JQueryStatic { - /** - * @see {@link http://api.jquery.com/jquery.ajax/#jQuery-ajax1} - * @deprecated Use jQuery.ajaxSetup(options) - */ - ajaxSettings: JQuery.AjaxSettings; - /** - * A factory function that returns a chainable utility object with methods to register multiple - * callbacks into callback queues, invoke callback queues, and relay the success or failure state of - * any synchronous or asynchronous function. - * - * @param beforeStart A function that is called just before the constructor returns. - * @see {@link https://api.jquery.com/jQuery.Deferred/} - * @since 1.5 - */ - Deferred: JQuery.DeferredStatic; - Event: JQuery.EventStatic; - /** - * Hook directly into jQuery to override how particular CSS properties are retrieved or set, normalize - * CSS property naming, or create custom properties. - * - * @see {@link https://api.jquery.com/jQuery.cssHooks/} - * @since 1.4.3 - */ - cssHooks: JQuery.PlainObject>; - /** - * An object containing all CSS properties that may be used without a unit. The .css() method uses this - * object to see if it may append px to unitless values. - * - * @see {@link https://api.jquery.com/jQuery.cssNumber/} - * @since 1.4.3 - */ - cssNumber: JQuery.PlainObject; - readonly fn: JQuery; - fx: { - /** - * The rate (in milliseconds) at which animations fire. - * - * @see {@link https://api.jquery.com/jQuery.fx.interval/} - * @since 1.4.3 - * @deprecated 3.0 - */ - interval: number; - /** - * Globally disable all animations. - * - * @see {@link https://api.jquery.com/jQuery.fx.off/} - * @since 1.3 - */ - off: boolean; - step: JQuery.PlainObject>; - }; - /** - * A Promise-like object (or "thenable") that resolves when the document is ready. - * - * @see {@link https://api.jquery.com/jQuery.ready/} - * @since 1.8 - */ - ready: JQuery.Thenable>; - /** - * A collection of properties that represent the presence of different browser features or bugs. - * Intended for jQuery's internal use; specific properties may be removed when they are no longer - * needed internally to improve page startup performance. For your own project's feature-detection - * needs, we strongly recommend the use of an external library such as Modernizr instead of dependency - * on properties in jQuery.support. - * - * @see {@link https://api.jquery.com/jQuery.support/} - * @since 1.3 - * @deprecated 1.9 - */ - support: JQuery.PlainObject; - valHooks: JQuery.PlainObject>; - /** - * Creates DOM elements on the fly from the provided string of raw HTML. - * - * @param html A string of HTML to create on the fly. Note that this parses HTML, not XML. - * A string defining a single, standalone, HTML element (e.g.
or
). - * @param ownerDocument_attributes A document in which the new elements will be created. - * An object of attributes, events, and methods to call on the newly-created element. - * @see {@link https://api.jquery.com/jQuery/} - * @since 1.0 - * @since 1.4 - */ - (html: JQuery.htmlString, ownerDocument_attributes: Document | JQuery.PlainObject): JQuery; - /** - * Accepts a string containing a CSS selector which is then used to match a set of elements. - * - * @param selector A string containing a selector expression - * @param context A DOM Element, Document, or jQuery to use as context - * @see {@link https://api.jquery.com/jQuery/} - * @since 1.0 - */ - (selector: JQuery.Selector, context: Element | Document | JQuery | undefined): JQuery; - // HACK: This is the factory function returned when importing jQuery without a DOM. Declaring it separately breaks using the type parameter on JQueryStatic. - // HACK: The discriminator parameter handles the edge case of passing a Window object to JQueryStatic. It doesn't actually exist on the factory function. - (window: Window, discriminator: boolean): JQueryStatic; - /** - * Creates DOM elements on the fly from the provided string of raw HTML. - * - * Binds a function to be executed when the DOM has finished loading. - * - * @param selector_object_callback A string containing a selector expression - * A DOM element to wrap in a jQuery object. - * An array containing a set of DOM elements to wrap in a jQuery object. - * A plain object to wrap in a jQuery object. - * An existing jQuery object to clone. - * The function to execute when the DOM is ready. - * @see {@link https://api.jquery.com/jQuery/} - * @since 1.0 - * @since 1.4 - */ - (selector_object_callback?: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery | - JQuery.PlainObject | - ((this: Document, $: JQueryStatic) => void)): JQuery; - /** - * A multi-purpose callbacks list object that provides a powerful way to manage callback lists. - * - * @param flags An optional list of space-separated flags that change how the callback list behaves. - * @see {@link https://api.jquery.com/jQuery.Callbacks/} - * @since 1.7 - */ - Callbacks(flags?: string): JQuery.Callbacks; - /** - * Perform an asynchronous HTTP (Ajax) request. - * - * @param url A string containing the URL to which the request is sent. - * @param settings A set of key/value pairs that configure the Ajax request. All settings are optional. A default can - * be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) below for a complete list of all settings. - * @see {@link https://api.jquery.com/jQuery.ajax/} - * @since 1.5 - */ - ajax(url: string, settings?: JQuery.AjaxSettings): JQuery.jqXHR; - /** - * Perform an asynchronous HTTP (Ajax) request. - * - * @param settings A set of key/value pairs that configure the Ajax request. All settings are optional. A default can - * be set for any option with $.ajaxSetup(). - * @see {@link https://api.jquery.com/jQuery.ajax/} - * @since 1.0 - */ - ajax(settings?: JQuery.AjaxSettings): JQuery.jqXHR; - /** - * Handle custom Ajax options or modify existing options before each request is sent and before they - * are processed by $.ajax(). - * - * @param dataTypes An optional string containing one or more space-separated dataTypes - * @param handler A handler to set default values for future Ajax requests. - * @see {@link https://api.jquery.com/jQuery.ajaxPrefilter/} - * @since 1.5 - */ - ajaxPrefilter(dataTypes: string, - handler: (options: JQuery.AjaxSettings, originalOptions: JQuery.AjaxSettings, jqXHR: JQuery.jqXHR) => string | void): void; - /** - * Handle custom Ajax options or modify existing options before each request is sent and before they - * are processed by $.ajax(). - * - * @param handler A handler to set default values for future Ajax requests. - * @see {@link https://api.jquery.com/jQuery.ajaxPrefilter/} - * @since 1.5 - */ - ajaxPrefilter(handler: (options: JQuery.AjaxSettings, originalOptions: JQuery.AjaxSettings, jqXHR: JQuery.jqXHR) => string | void): void; - /** - * Set default values for future Ajax requests. Its use is not recommended. - * - * @param options A set of key/value pairs that configure the default Ajax request. All options are optional. - * @see {@link https://api.jquery.com/jQuery.ajaxSetup/} - * @since 1.1 - */ - ajaxSetup(options: JQuery.AjaxSettings): JQuery.AjaxSettings; - /** - * Creates an object that handles the actual transmission of Ajax data. - * - * @param dataType A string identifying the data type to use - * @param handler A handler to return the new transport object to use with the data type provided in the first argument. - * @see {@link https://api.jquery.com/jQuery.ajaxTransport/} - * @since 1.5 - */ - ajaxTransport(dataType: string, - handler: (options: JQuery.AjaxSettings, originalOptions: JQuery.AjaxSettings, jqXHR: JQuery.jqXHR) => JQuery.Transport | void): void; - /** - * Check to see if a DOM element is a descendant of another DOM element. - * - * @param container The DOM element that may contain the other element. - * @param contained The DOM element that may be contained by (a descendant of) the other element. - * @see {@link https://api.jquery.com/jQuery.contains/} - * @since 1.4 - */ - contains(container: Element, contained: Element): boolean; - css(elem: Element, unknown: any): any; - /** - * Returns value at named data store for the element, as set by jQuery.data(element, name, value), or - * the full data store for the element. - * - * @param element The DOM element to query for the data. - * @param key Name of the data stored. - * @see {@link https://api.jquery.com/jQuery.data/} - * @since 1.2.3 - */ - data(element: Element, key: string, undefined: undefined): any; // tslint:disable-line:unified-signatures - /** - * Store arbitrary data associated with the specified element. Returns the value that was set. - * - * @param element The DOM element to associate with the data. - * @param key A string naming the piece of data to set. - * @param value The new data value; this can be any Javascript type except undefined. - * @see {@link https://api.jquery.com/jQuery.data/} - * @since 1.2.3 - */ - data(element: Element, key: string, value: T): T; - /** - * Returns value at named data store for the element, as set by jQuery.data(element, name, value), or - * the full data store for the element. - * - * @param element The DOM element to query for the data. - * @param key Name of the data stored. - * @see {@link https://api.jquery.com/jQuery.data/} - * @since 1.2.3 - * @since 1.4 - */ - data(element: Element, key?: string): any; - /** - * Execute the next function on the queue for the matched element. - * - * @param element A DOM element from which to remove and execute a queued function. - * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. - * @see {@link https://api.jquery.com/jQuery.dequeue/} - * @since 1.3 - */ - dequeue(element: Element, queueName?: string): void; - /** - * A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. - * Arrays and array-like objects with a length property (such as a function's arguments object) are - * iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties. - * - * @param array The array to iterate over. - * @param callback The function that will be executed on every object. - * @see {@link https://api.jquery.com/jQuery.each/} - * @since 1.0 - */ - each(array: ArrayLike, callback: (this: T, indexInArray: number, value: T) => false | any): ArrayLike; - /** - * A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. - * Arrays and array-like objects with a length property (such as a function's arguments object) are - * iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties. - * - * @param obj The object to iterate over. - * @param callback The function that will be executed on every object. - * @see {@link https://api.jquery.com/jQuery.each/} - * @since 1.0 - */ - each(obj: T, callback: (this: T[K], propertyName: K, valueOfProperty: T[K]) => false | any): T; - /** - * Takes a string and throws an exception containing it. - * - * @param message The message to send out. - * @see {@link https://api.jquery.com/jQuery.error/} - * @since 1.4.1 - */ - error(message: string): any; - /** - * Escapes any character that has a special meaning in a CSS selector. - * - * @param selector A string containing a selector expression to escape. - * @see {@link https://api.jquery.com/jQuery.escapeSelector/} - * @since 3.0 - */ - escapeSelector(selector: JQuery.Selector): JQuery.Selector; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. - * @param target The object to extend. It will receive the new properties. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.1.4 - */ - extend(deep: true, target: T, object1: U, object2: V, object3: W, object4: X, object5: Y, object6: Z): T & U & V & W & X & Y & Z; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. - * @param target The object to extend. It will receive the new properties. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.1.4 - */ - extend(deep: true, target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. - * @param target The object to extend. It will receive the new properties. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.1.4 - */ - extend(deep: true, target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. - * @param target The object to extend. It will receive the new properties. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.1.4 - */ - extend(deep: true, target: T, object1: U, object2: V, object3: W): T & U & V & W; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. - * @param target The object to extend. It will receive the new properties. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.1.4 - */ - extend(deep: true, target: T, object1: U, object2: V): T & U & V; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. - * @param target The object to extend. It will receive the new properties. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.1.4 - */ - extend(deep: true, target: T, object1: U): T & U; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param deep If true, the merge becomes recursive (aka. deep copy). Passing false for this argument is not supported. - * @param target The object to extend. It will receive the new properties. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.1.4 - */ - extend(deep: true, target: any, object1: any, ...objects: any[]): any; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param target An object that will receive the new properties if additional objects are passed in or that will - * extend the jQuery namespace if it is the sole argument. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.0 - */ - extend(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y, object6: Z): T & U & V & W & X & Y & Z; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param target An object that will receive the new properties if additional objects are passed in or that will - * extend the jQuery namespace if it is the sole argument. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.0 - */ - extend(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param target An object that will receive the new properties if additional objects are passed in or that will - * extend the jQuery namespace if it is the sole argument. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.0 - */ - extend(target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param target An object that will receive the new properties if additional objects are passed in or that will - * extend the jQuery namespace if it is the sole argument. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.0 - */ - extend(target: T, object1: U, object2: V, object3: W): T & U & V & W; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param target An object that will receive the new properties if additional objects are passed in or that will - * extend the jQuery namespace if it is the sole argument. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.0 - */ - extend(target: T, object1: U, object2: V): T & U & V; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param target An object that will receive the new properties if additional objects are passed in or that will - * extend the jQuery namespace if it is the sole argument. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.0 - */ - extend(target: T, object1: U): T & U; - /** - * Merge the contents of two or more objects together into the first object. - * - * @param target An object that will receive the new properties if additional objects are passed in or that will - * extend the jQuery namespace if it is the sole argument. - * @see {@link https://api.jquery.com/jQuery.extend/} - * @since 1.0 - */ - extend(target: any, object1: any, ...objects: any[]): any; - /** - * Load data from the server using a HTTP GET request. - * - * @param url A string containing the URL to which the request is sent. - * @param data A plain object or string that is sent to the server with the request. - * @param success A callback function that is executed if the request succeeds. Required if dataType is provided, but - * you can use null or jQuery.noop as a placeholder. - * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). - * @see {@link https://api.jquery.com/jQuery.get/} - * @since 1.0 - */ - get(url: string, - data: JQuery.PlainObject | string, - success: JQuery.jqXHR.DoneCallback | null, - dataType?: string): JQuery.jqXHR; - /** - * Load data from the server using a HTTP GET request. - * - * @param url A string containing the URL to which the request is sent. - * @param success A callback function that is executed if the request succeeds. Required if dataType is provided, but - * you can use null or jQuery.noop as a placeholder. - * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). - * @see {@link https://api.jquery.com/jQuery.get/} - * @since 1.0 - */ - get(url: string, - success: JQuery.jqXHR.DoneCallback | null, - dataType: string): JQuery.jqXHR; - /** - * Load data from the server using a HTTP GET request. - * - * @param url A string containing the URL to which the request is sent. - * @param success_data A callback function that is executed if the request succeeds. Required if dataType is provided, but - * you can use null or jQuery.noop as a placeholder. - * A plain object or string that is sent to the server with the request. - * @see {@link https://api.jquery.com/jQuery.get/} - * @since 1.0 - */ - get(url: string, - success_data: JQuery.jqXHR.DoneCallback | JQuery.PlainObject | string): JQuery.jqXHR; - /** - * Load data from the server using a HTTP GET request. - * - * @param url_settings A string containing the URL to which the request is sent. - * A set of key/value pairs that configure the Ajax request. All properties except for url are - * optional. A default can be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) for a - * complete list of all settings. The type option will automatically be set to GET. - * @see {@link https://api.jquery.com/jQuery.get/} - * @since 1.0 - * @since 1.12 - * @since 2.2 - */ - get(url_settings?: string | JQuery.UrlAjaxSettings): JQuery.jqXHR; - /** - * Load JSON-encoded data from the server using a GET HTTP request. - * - * @param url A string containing the URL to which the request is sent. - * @param data A plain object or string that is sent to the server with the request. - * @param success A callback function that is executed if the request succeeds. - * @see {@link https://api.jquery.com/jQuery.getJSON/} - * @since 1.0 - */ - getJSON(url: string, - data: JQuery.PlainObject | string, - success: JQuery.jqXHR.DoneCallback): JQuery.jqXHR; - /** - * Load JSON-encoded data from the server using a GET HTTP request. - * - * @param url A string containing the URL to which the request is sent. - * @param success_data A callback function that is executed if the request succeeds. - * A plain object or string that is sent to the server with the request. - * @see {@link https://api.jquery.com/jQuery.getJSON/} - * @since 1.0 - */ - getJSON(url: string, - success_data?: JQuery.jqXHR.DoneCallback | JQuery.PlainObject | string): JQuery.jqXHR; - /** - * Load a JavaScript file from the server using a GET HTTP request, then execute it. - * - * @param url A string containing the URL to which the request is sent. - * @param success A callback function that is executed if the request succeeds. - * @see {@link https://api.jquery.com/jQuery.getScript/} - * @since 1.0 - */ - getScript(url: string, - success?: JQuery.jqXHR.DoneCallback): JQuery.jqXHR; - /** - * Execute some JavaScript code globally. - * - * @param code The JavaScript code to execute. - * @see {@link https://api.jquery.com/jQuery.globalEval/} - * @since 1.0.4 - */ - globalEval(code: string): void; - /** - * Finds the elements of an array which satisfy a filter function. The original array is not affected. - * - * @param array The array-like object to search through. - * @param fn The function to process each item against. The first argument to the function is the item, and the - * second argument is the index. The function should return a Boolean value. this will be the global window object. - * @param invert If "invert" is false, or not provided, then the function returns an array consisting of all elements - * for which "callback" returns true. If "invert" is true, then the function returns an array - * consisting of all elements for which "callback" returns false. - * @see {@link https://api.jquery.com/jQuery.grep/} - * @since 1.0 - */ - grep(array: ArrayLike, - fn: (elementOfArray: T, indexInArray: number) => boolean, - invert?: boolean): T[]; - /** - * Determine whether an element has any jQuery data associated with it. - * - * @param element A DOM element to be checked for data. - * @see {@link https://api.jquery.com/jQuery.hasData/} - * @since 1.5 - */ - hasData(element: Element): boolean; - /** - * Holds or releases the execution of jQuery's ready event. - * - * @param hold Indicates whether the ready hold is being requested or released - * @see {@link https://api.jquery.com/jQuery.holdReady/} - * @since 1.6 - * @deprecated 3.2 - */ - holdReady(hold: boolean): void; - /** - * Modify and filter HTML strings passed through jQuery manipulation methods. - * - * @param html The HTML string on which to operate. - * @see {@link https://api.jquery.com/jQuery.htmlPrefilter/} - * @since 1.12/2.2 - */ - htmlPrefilter(html: JQuery.htmlString): JQuery.htmlString; - /** - * Search for a specified value within an array and return its index (or -1 if not found). - * - * @param value The value to search for. - * @param array An array through which to search. - * @param fromIndex The index of the array at which to begin the search. The default is 0, which will search the whole array. - * @see {@link https://api.jquery.com/jQuery.inArray/} - * @since 1.2 - */ - inArray(value: T, array: T[], fromIndex?: number): number; - /** - * Determine whether the argument is an array. - * - * @param obj Object to test whether or not it is an array. - * @see {@link https://api.jquery.com/jQuery.isArray/} - * @since 1.3 - * @deprecated 3.2 - */ - isArray(obj: any): obj is any[]; - /** - * Check to see if an object is empty (contains no enumerable properties). - * - * @param obj The object that will be checked to see if it's empty. - * @see {@link https://api.jquery.com/jQuery.isEmptyObject/} - * @since 1.4 - */ - isEmptyObject(obj: any): boolean; - /** - * Determine if the argument passed is a JavaScript function object. - * - * @param obj Object to test whether or not it is a function. - * @see {@link https://api.jquery.com/jQuery.isFunction/} - * @since 1.2 - */ - isFunction(obj: any): obj is Function; - /** - * Determines whether its argument represents a JavaScript number. - * - * @param value The value to be tested. - * @see {@link https://api.jquery.com/jQuery.isNumeric/} - * @since 1.7 - */ - isNumeric(value: any): value is number; - /** - * Check to see if an object is a plain object (created using "{}" or "new Object"). - * - * @param obj The object that will be checked to see if it's a plain object. - * @see {@link https://api.jquery.com/jQuery.isPlainObject/} - * @since 1.4 - */ - isPlainObject(obj: any): obj is JQuery.PlainObject; - /** - * Determine whether the argument is a window. - * - * @param obj Object to test whether or not it is a window. - * @see {@link https://api.jquery.com/jQuery.isWindow/} - * @since 1.4.3 - */ - isWindow(obj: any): obj is Window; - /** - * Check to see if a DOM node is within an XML document (or is an XML document). - * - * @param node The DOM node that will be checked to see if it's in an XML document. - * @see {@link https://api.jquery.com/jQuery.isXMLDoc/} - * @since 1.1.4 - */ - isXMLDoc(node: Node): boolean; - /** - * Convert an array-like object into a true JavaScript array. - * - * @param obj Any object to turn into a native Array. - * @see {@link https://api.jquery.com/jQuery.makeArray/} - * @since 1.2 - */ - makeArray(obj: ArrayLike): T[]; - /** - * Translate all items in an array or object to new array of items. - * - * @param array The Array to translate. - * @param callback The function to process each item against. The first argument to the function is the array item, the - * second argument is the index in array The function can return any value. A returned array will be - * flattened into the resulting array. Within the function, this refers to the global (window) object. - * @see {@link https://api.jquery.com/jQuery.map/} - * @since 1.0 - */ - map(array: T[], callback: (elementOfArray: T, indexInArray: number) => R): R[]; - /** - * Translate all items in an array or object to new array of items. - * - * @param obj The Object to translate. - * @param callback The function to process each item against. The first argument to the function is the value; the - * second argument is the key of the object property. The function can return any value to add to the - * array. A returned array will be flattened into the resulting array. Within the function, this refers - * to the global (window) object. - * @see {@link https://api.jquery.com/jQuery.map/} - * @since 1.6 - */ - map(obj: T, callback: (propertyOfObject: T[K], key: K) => R): R[]; - /** - * Merge the contents of two arrays together into the first array. - * - * @param first The first array-like object to merge, the elements of second added. - * @param second The second array-like object to merge into the first, unaltered. - * @see {@link https://api.jquery.com/jQuery.merge/} - * @since 1.0 - */ - merge(first: ArrayLike, second: ArrayLike): Array; - /** - * Relinquish jQuery's control of the $ variable. - * - * @param removeAll A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself). - * @see {@link https://api.jquery.com/jQuery.noConflict/} - * @since 1.0 - */ - noConflict(removeAll?: boolean): this; - /** - * An empty function. - * - * @see {@link https://api.jquery.com/jQuery.noop/} - * @since 1.4 - */ - noop(): undefined; - /** - * Return a number representing the current time. - * - * @see {@link https://api.jquery.com/jQuery.now/} - * @since 1.4.3 - */ - now(): number; - /** - * Create a serialized representation of an array, a plain object, or a jQuery object suitable for use - * in a URL query string or Ajax request. In case a jQuery object is passed, it should contain input - * elements with name/value properties. - * - * @param obj An array, a plain object, or a jQuery object to serialize. - * @param traditional A Boolean indicating whether to perform a traditional "shallow" serialization. - * @see {@link https://api.jquery.com/jQuery.param/} - * @since 1.2 - * @since 1.4 - */ - param(obj: any[] | JQuery.PlainObject | JQuery, traditional?: boolean): string; - /** - * Parses a string into an array of DOM nodes. - * - * @param data HTML string to be parsed - * @param context Document element to serve as the context in which the HTML fragment will be created - * @param keepScripts A Boolean indicating whether to include scripts passed in the HTML string - * @see {@link https://api.jquery.com/jQuery.parseHTML/} - * @since 1.8 - */ - parseHTML(data: string, context: Document | null | undefined, keepScripts: boolean): JQuery.Node[]; - /** - * Parses a string into an array of DOM nodes. - * - * @param data HTML string to be parsed - * @param context_keepScripts Document element to serve as the context in which the HTML fragment will be created - * A Boolean indicating whether to include scripts passed in the HTML string - * @see {@link https://api.jquery.com/jQuery.parseHTML/} - * @since 1.8 - */ - parseHTML(data: string, context_keepScripts?: Document | null | boolean): JQuery.Node[]; - /** - * Takes a well-formed JSON string and returns the resulting JavaScript value. - * - * @param json The JSON string to parse. - * @see {@link https://api.jquery.com/jQuery.parseJSON/} - * @since 1.4.1 - * @deprecated 3.0 - */ - parseJSON(json: string): any; - /** - * Parses a string into an XML document. - * - * @param data a well-formed XML string to be parsed - * @see {@link https://api.jquery.com/jQuery.parseXML/} - * @since 1.5 - */ - parseXML(data: string): XMLDocument; - /** - * Load data from the server using a HTTP POST request. - * - * @param url A string containing the URL to which the request is sent. - * @param data A plain object or string that is sent to the server with the request. - * @param success A callback function that is executed if the request succeeds. Required if dataType is provided, but - * can be null in that case. - * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). - * @see {@link https://api.jquery.com/jQuery.post/} - * @since 1.0 - */ - post(url: string, - data: JQuery.PlainObject | string, - success: JQuery.jqXHR.DoneCallback | null, - dataType?: string): JQuery.jqXHR; - /** - * Load data from the server using a HTTP POST request. - * - * @param url A string containing the URL to which the request is sent. - * @param success A callback function that is executed if the request succeeds. Required if dataType is provided, but - * can be null in that case. - * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). - * @see {@link https://api.jquery.com/jQuery.post/} - * @since 1.0 - */ - post(url: string, - success: JQuery.jqXHR.DoneCallback | null, - dataType: string): JQuery.jqXHR; - /** - * Load data from the server using a HTTP POST request. - * - * @param url A string containing the URL to which the request is sent. - * @param success_data A callback function that is executed if the request succeeds. Required if dataType is provided, but - * can be null in that case. - * A plain object or string that is sent to the server with the request. - * @see {@link https://api.jquery.com/jQuery.post/} - * @since 1.0 - */ - post(url: string, - success_data: JQuery.jqXHR.DoneCallback | JQuery.PlainObject | string): JQuery.jqXHR; - /** - * Load data from the server using a HTTP POST request. - * - * @param url_settings A string containing the URL to which the request is sent. - * A set of key/value pairs that configure the Ajax request. All properties except for url are - * optional. A default can be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) for a - * complete list of all settings. Type will automatically be set to POST. - * @see {@link https://api.jquery.com/jQuery.post/} - * @since 1.0 - * @since 1.12 - * @since 2.2 - */ - post(url_settings?: string | JQuery.UrlAjaxSettings): JQuery.jqXHR; - - // region proxy - - // region (fn, null | undefined) - - // region 0 to 7 arguments - - // region 0 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): () => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F): () => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E): () => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D): () => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C) => TReturn, - context: null | undefined, - a: A, b: B, c: C): () => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B) => TReturn, - context: null | undefined, - a: A, b: B): () => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4` - * @since 1.6 - */ - proxy(fn: (a: A) => TReturn, - context: null | undefined, - a: A): () => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: () => TReturn, - context: null | undefined): () => TReturn; - - // endregion - - // region 1 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F): (t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E): (t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D): (t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, - t: T) => TReturn, - context: null | undefined, - a: A, b: B, c: C): (t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, - t: T) => TReturn, - context: null | undefined, - a: A, b: B): (t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, - t: T) => TReturn, - context: null | undefined, - a: A): (t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (t: T) => TReturn, - context: null | undefined): (t: T) => TReturn; - - // endregion - - // region 2 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E): (t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D): (t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U) => TReturn, - context: null | undefined, - a: A, b: B, c: C): (t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, - t: T, u: U) => TReturn, - context: null | undefined, - a: A, b: B): (t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, - t: T, u: U) => TReturn, - context: null | undefined, - a: A): (t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (t: T, u: U) => TReturn, - context: null | undefined): (t: T, u: U) => TReturn; - - // endregion - - // region 3 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U, v: V) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U, v: V) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U, v: V) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U, v: V) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D): (t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U, v: V) => TReturn, - context: null | undefined, - a: A, b: B, c: C): (t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, - t: T, u: U, v: V) => TReturn, - context: null | undefined, - a: A, b: B): (t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, - t: T, u: U, v: V) => TReturn, - context: null | undefined, - a: A): (t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (t: T, u: U, v: V) => TReturn, - context: null | undefined): (t: T, u: U, v: V) => TReturn; - - // endregion - - // region 4 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U, v: V, w: W) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U, v: V, w: W) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U, v: V, w: W) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U, v: V, w: W) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U, v: V, w: W) => TReturn, - context: null | undefined, - a: A, b: B, c: C): (t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, - t: T, u: U, v: V, w: W) => TReturn, - context: null | undefined, - a: A, b: B): (t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, - t: T, u: U, v: V, w: W) => TReturn, - context: null | undefined, - a: A): (t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (t: T, u: U, v: V, w: W) => TReturn, - context: null | undefined): (t: T, u: U, v: V, w: W) => TReturn; - - // endregion - - // region 5 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: null | undefined, - a: A, b: B, c: C): (t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: null | undefined, - a: A, b: B): (t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: null | undefined, - a: A): (t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (t: T, u: U, v: V, w: W, x: X) => TReturn, - context: null | undefined): (t: T, u: U, v: V, w: W, x: X) => TReturn; - - // endregion - - // region 6 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: null | undefined, - a: A, b: B, c: C): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: null | undefined, - a: A, b: B): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: null | undefined, - a: A): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: null | undefined): (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - - // endregion - - // region 7+ parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E, f: F): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D, e: E): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: null | undefined, - a: A, b: B, c: C, d: D): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: null | undefined, - a: A, b: B, c: C): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, b: B, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: null | undefined, - a: A, b: B): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (a: A, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: null | undefined, - a: A): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: null | undefined): (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - - // endregion - - // endregion - - // region 8+ arguments - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @param additionalArguments Any number of arguments to be passed to the function referenced in the function argument. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.9 - */ - proxy(fn: (...args: any[]) => TReturn, - context: null | undefined, - ...additionalArguments: any[]): (...args: any[]) => TReturn; - - // endregion - - // endregion - - // region (fn, context) - - // region 0 to 7 arguments - - // region 0 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (this: TContext) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F): (this: TContext) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E): (this: TContext) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D): (this: TContext) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C) => TReturn, - context: TContext, - a: A, b: B, c: C): (this: TContext) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B) => TReturn, - context: TContext, - a: A, b: B): (this: TContext) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4` - * @since 1.6 - */ - proxy(fn: (a: A) => TReturn, - context: TContext, - a: A): (this: TContext) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: () => TReturn, - context: TContext): (this: TContext) => TReturn; - - // endregion - - // region 1 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (this: TContext, t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F): (this: TContext, t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E): (this: TContext, t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D): (this: TContext, t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, - t: T) => TReturn, - context: TContext, - a: A, b: B, c: C): (this: TContext, t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, - t: T) => TReturn, - context: TContext, - a: A, b: B): (this: TContext, t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, - t: T) => TReturn, - context: TContext, - a: A): (this: TContext, t: T) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (t: T) => TReturn, - context: TContext): (this: TContext, t: T) => TReturn; - - // endregion - - // region 2 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (this: TContext, t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F): (this: TContext, t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E): (this: TContext, t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D): (this: TContext, t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U) => TReturn, - context: TContext, - a: A, b: B, c: C): (this: TContext, t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, - t: T, u: U) => TReturn, - context: TContext, - a: A, b: B): (this: TContext, t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, - t: T, u: U) => TReturn, - context: TContext, - a: A): (this: TContext, t: T, u: U) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (t: T, u: U) => TReturn, - context: TContext): (this: TContext, t: T, u: U) => TReturn; - - // endregion - - // region 3 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U, v: V) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (this: TContext, t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U, v: V) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F): (this: TContext, t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U, v: V) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E): (this: TContext, t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U, v: V) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D): (this: TContext, t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U, v: V) => TReturn, - context: TContext, - a: A, b: B, c: C): (this: TContext, t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, - t: T, u: U, v: V) => TReturn, - context: TContext, - a: A, b: B): (this: TContext, t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, - t: T, u: U, v: V) => TReturn, - context: TContext, - a: A): (this: TContext, t: T, u: U, v: V) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (t: T, u: U, v: V) => TReturn, - context: TContext): (this: TContext, t: T, u: U, v: V) => TReturn; - - // endregion - - // region 4 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U, v: V, w: W) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (this: TContext, t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U, v: V, w: W) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F): (this: TContext, t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U, v: V, w: W) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E): (this: TContext, t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U, v: V, w: W) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D): (this: TContext, t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U, v: V, w: W) => TReturn, - context: TContext, - a: A, b: B, c: C): (this: TContext, t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, - t: T, u: U, v: V, w: W) => TReturn, - context: TContext, - a: A, b: B): (this: TContext, t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, - t: T, u: U, v: V, w: W) => TReturn, - context: TContext, - a: A): (this: TContext, t: T, u: U, v: V, w: W) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (t: T, u: U, v: V, w: W) => TReturn, - context: TContext): (this: TContext, t: T, u: U, v: V, w: W) => TReturn; - - // endregion - - // region 5 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (this: TContext, t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F): (this: TContext, t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E): (this: TContext, t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D): (this: TContext, t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: TContext, - a: A, b: B, c: C): (this: TContext, t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: TContext, - a: A, b: B): (this: TContext, t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, - t: T, u: U, v: V, w: W, x: X) => TReturn, - context: TContext, - a: A): (this: TContext, t: T, u: U, v: V, w: W, x: X) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (t: T, u: U, v: V, w: W, x: X) => TReturn, - context: TContext): (this: TContext, t: T, u: U, v: V, w: W, x: X) => TReturn; - - // endregion - - // region 6 parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: TContext, - a: A, b: B, c: C): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: TContext, - a: A, b: B): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, - t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: TContext, - a: A): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn, - context: TContext): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y) => TReturn; - - // endregion - - // region 7+ parameters - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F, g: G): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, f: F, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E, f: F): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, e: E, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D, e: E): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, d: D, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: TContext, - a: A, b: B, c: C, d: D): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, c: C, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: TContext, - a: A, b: B, c: C): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, b: B, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: TContext, - a: A, b: B): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (a: A, - t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: TContext, - a: A): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn, - context: TContext): (this: TContext, t: T, u: U, v: V, w: W, x: X, y: Y, z: Z, ...args: any[]) => TReturn; - - // endregion - - // endregion - - // region 8+ arguments - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param fn The function whose context will be changed. - * @param context The object to which the context (this) of the function should be set. - * @param additionalArguments Any number of arguments to be passed to the function referenced in the function argument. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(fn: (...args: any[]) => TReturn, - context: TContext, - ...additionalArguments: any[]): (this: TContext, ...args: any[]) => TReturn; - - // endregion - - // endregion - - // region (context, name) - - /** - * Takes a function and returns a new one that will always have a particular context. - * - * @param context The object to which the context of the function should be set. - * @param name The name of the function whose context will be changed (should be a property of the context object). - * @param additionalArguments Any number of arguments to be passed to the function named in the name argument. - * @see {@link https://api.jquery.com/jQuery.proxy/} - * @since 1.4 - * @since 1.6 - */ - proxy(context: TContext, - name: keyof TContext, - ...additionalArguments: any[]): (this: TContext, ...args: any[]) => any; - - // endregion - - // endregion - - /** - * Manipulate the queue of functions to be executed on the matched element. - * - * @param element A DOM element where the array of queued functions is attached. - * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. - * @param newQueue The new function to add to the queue. - * An array of functions to replace the current queue contents. - * @see {@link https://api.jquery.com/jQuery.queue/} - * @since 1.3 - */ - queue(element: T, queueName?: string, newQueue?: JQuery.TypeOrArray>): JQuery.Queue; - /** - * Handles errors thrown synchronously in functions wrapped in jQuery(). - * - * @param error An error thrown in the function wrapped in jQuery(). - * @see {@link https://api.jquery.com/jQuery.readyException/} - * @since 3.1 - */ - readyException(error: Error): any; - /** - * Remove a previously-stored piece of data. - * - * @param element A DOM element from which to remove data. - * @param name A string naming the piece of data to remove. - * @see {@link https://api.jquery.com/jQuery.removeData/} - * @since 1.2.3 - */ - removeData(element: Element, name?: string): void; - /** - * Creates an object containing a set of properties ready to be used in the definition of custom animations. - * - * @param duration A string or number determining how long the animation will run. - * @param easing A string indicating which easing function to use for the transition. - * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/jQuery.speed/} - * @since 1.1 - */ - speed(duration: JQuery.Duration, easing: string, complete: (this: TElement) => void): JQuery.EffectsOptions; - /** - * Creates an object containing a set of properties ready to be used in the definition of custom animations. - * - * @param duration A string or number determining how long the animation will run. - * @param easing_complete A string indicating which easing function to use for the transition. - * A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/jQuery.speed/} - * @since 1.0 - * @since 1.1 - */ - speed(duration: JQuery.Duration, - easing_complete: string | ((this: TElement) => void)): JQuery.EffectsOptions; - /** - * Creates an object containing a set of properties ready to be used in the definition of custom animations. - * - * @param duration_complete_settings A string or number determining how long the animation will run. - * A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/jQuery.speed/} - * @since 1.0 - * @since 1.1 - */ - speed(duration_complete_settings?: JQuery.Duration | ((this: TElement) => void) | JQuery.SpeedSettings): JQuery.EffectsOptions; - /** - * Remove the whitespace from the beginning and end of a string. - * - * @param str The string to trim. - * @see {@link https://api.jquery.com/jQuery.trim/} - * @since 1.0 - */ - trim(str: string): string; - /** - * Determine the internal JavaScript [[Class]] of an object. - * - * @param obj Object to get the internal JavaScript [[Class]] of. - * @see {@link https://api.jquery.com/jQuery.type/} - * @since 1.4.3 - */ - type(obj: any): 'array' | 'boolean' | 'date' | 'error' | 'function' | 'null' | 'number' | 'object' | 'regexp' | 'string' | 'symbol' | 'undefined'; - /** - * Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on - * arrays of DOM elements, not strings or numbers. - * - * @param array The Array of DOM elements. - * @see {@link https://api.jquery.com/jQuery.unique/} - * @since 1.1.3 - * @deprecated 3.0 - */ - unique(array: T[]): T[]; - /** - * Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on - * arrays of DOM elements, not strings or numbers. - * - * @param array The Array of DOM elements. - * @see {@link https://api.jquery.com/jQuery.uniqueSort/} - * @since 1.12 - * @since 2.2 - */ - uniqueSort(array: T[]): T[]; - /** - * Provides a way to execute callback functions based on zero or more Thenable objects, usually - * Deferred objects that represent asynchronous events. - * - * @see {@link https://api.jquery.com/jQuery.when/} - * @since 1.5 - */ - when - (deferredT: JQuery.Promise | JQuery.Thenable | TR1, - deferredU: JQuery.Promise | JQuery.Thenable | UR1, - deferredV: JQuery.Promise | JQuery.Thenable | VR1): JQuery.Promise3; - /** - * Provides a way to execute callback functions based on zero or more Thenable objects, usually - * Deferred objects that represent asynchronous events. - * - * @see {@link https://api.jquery.com/jQuery.when/} - * @since 1.5 - */ - when - (deferredT: JQuery.Promise | JQuery.Thenable | TR1, - deferredU: JQuery.Promise | JQuery.Thenable | UR1): JQuery.Promise2; - /** - * Provides a way to execute callback functions based on zero or more Thenable objects, usually - * Deferred objects that represent asynchronous events. - * - * @see {@link https://api.jquery.com/jQuery.when/} - * @since 1.5 - */ - when - (deferredT: JQuery.Promise3 | - JQuery.Promise2): JQuery.Promise3; - /** - * Provides a way to execute callback functions based on zero or more Thenable objects, usually - * Deferred objects that represent asynchronous events. - * - * @see {@link https://api.jquery.com/jQuery.when/} - * @since 1.5 - */ - when(deferred: JQuery.Promise | JQuery.Thenable | TR1): JQuery.Promise; - /** - * Provides a way to execute callback functions based on zero or more Thenable objects, usually - * Deferred objects that represent asynchronous events. - * - * @param deferreds Zero or more Thenable objects. - * @see {@link https://api.jquery.com/jQuery.when/} - * @since 1.5 - */ - when(...deferreds: Array | JQuery.Thenable | TR1>): JQuery.Promise; - /** - * Provides a way to execute callback functions based on zero or more Thenable objects, usually - * Deferred objects that represent asynchronous events. - * - * @param deferreds Zero or more Thenable objects. - * @see {@link https://api.jquery.com/jQuery.when/} - * @since 1.5 - */ - when(...deferreds: any[]): JQuery.Promise; -} - -interface JQuery extends Iterable { +interface JQuery extends Iterable { /** * A string containing the jQuery version number. - * - * @see {@link https://api.jquery.com/jquery/} + * @see \`{@link https://api.jquery.com/jquery-2/#jquery1 }\` * @since 1.0 + * @example ​ ````Determine if an object is a jQuery object +```javascript +var a = { what: "A regular JS object" }, + b = $( "body" ); +​ +if ( a.jquery ) { // Falsy, since it's undefined + alert( "a is a jQuery object!" ); +} +​ +if ( b.jquery ) { // Truthy, since it's a string + alert( "b is a jQuery object!" ); +} +``` + * @example ​ ````Get the current version of jQuery running on the page +```javascript +alert( "You are running jQuery version: " + $.fn.jquery ); +``` */ jquery: string; /** * The number of elements in the jQuery object. - * - * @see {@link https://api.jquery.com/length/} + * @see \`{@link https://api.jquery.com/length/ }\` * @since 1.0 + * @example ​ ````Count the divs. Click to add more. +```html + + + + + length demo + + + + +​ +
​ + +​ + + +``` */ length: number; /** * Create a new jQuery object with elements added to the set of matched elements. - * * @param selector A string representing a selector expression to find additional elements to add to the set of matched elements. * @param context The point in the document at which the selector should begin matching; similar to the context * argument of the $(selector, context) method. - * @see {@link https://api.jquery.com/add/} + * @see \`{@link https://api.jquery.com/add/ }\` * @since 1.4 */ add(selector: JQuery.Selector, context: Element): this; + // TODO: The return type should reflect newly selected types. /** * Create a new jQuery object with elements added to the set of matched elements. - * - * @param selector A string representing a selector expression to find additional elements to add to the set of matched elements. - * One or more elements to add to the set of matched elements. - * An HTML fragment to add to the set of matched elements. - * An existing jQuery object to add to the set of matched elements. - * @see {@link https://api.jquery.com/add/} + * @param selector_elements_html_selection _@param_ `selector_elements_html_selection` + *
+ * * `selector` — A string representing a selector expression to find additional elements to add to the set of matched elements.
+ * * `elements` — One or more elements to add to the set of matched elements.
+ * * `html` — An HTML fragment to add to the set of matched elements.
+ * * `selection` — An existing jQuery object to add to the set of matched elements. + * @see \`{@link https://api.jquery.com/add/ }\` * @since 1.0 * @since 1.3.2 + * @example ​ ````Finds all divs and makes a border. Then adds all paragraphs to the jQuery object to set their backgrounds yellow. +```html + + + + + add demo + + + + +​ +
+
+
+
+
+
+​ +

Added this... (notice no border)

+​ + +​ + + +``` + * @example ​ ````Adds more elements, matched by the given expression, to the set of matched elements. +```html + + + + + add demo + + + +​ +

Hello

+Hello Again +​ + +​ + + +``` + * @example ​ ````Adds more elements, created on the fly, to the set of matched elements. +```html + + + + + add demo + + + +​ +

Hello

+​ + +​ + + +``` + * @example ​ ````Adds one or more Elements to the set of matched elements. +```html + + + + + add demo + + + +​ +

Hello

+Hello Again +​ + +​ + + +``` + * @example ​ ````Demonstrates how to add (or push) elements to an existing collection +```html + + + + + add demo + + + +​ +

Hello

+Hello Again +​ + +​ + + +``` */ - add(selector: JQuery.Selector | JQuery.TypeOrArray | JQuery.htmlString | JQuery): this; + add(selector_elements_html_selection: JQuery.Selector | JQuery.TypeOrArray | JQuery.htmlString | JQuery | JQuery.Node): this; /** * Add the previous set of elements on the stack to the current set, optionally filtered by a selector. - * * @param selector A string containing a selector expression to match the current set of elements against. - * @see {@link https://api.jquery.com/addBack/} + * @see \`{@link https://api.jquery.com/addBack/ }\` * @since 1.8 + * @example ​ ````The .addBack() method causes the previous set of DOM elements in the traversal stack to be added to the current set. In the first example, the top stack contains the set resulting from .find("p"). In the second example, .addBack() adds the previous set of elements on the stack — in this case $("div.after-addback") — to the current set, selecting both the div and its enclosed paragraphs. +```html + + + + + addBack demo + + + + +​ +
+

Before addBack()

+
+

First Paragraph

+

Second Paragraph

+
+
+
+

After addBack()

+
+

First Paragraph

+

Second Paragraph

+
+
+​ + +​ + + +``` */ addBack(selector?: JQuery.Selector): this; /** * Adds the specified class(es) to each element in the set of matched elements. - * - * @param className One or more space-separated classes to be added to the class attribute of each matched element. - * A function returning one or more space-separated class names to be added to the existing class - * name(s). Receives the index position of the element in the set and the existing class name(s) as - * arguments. Within the function, this refers to the current element in the set. - * @see {@link https://api.jquery.com/addClass/} + * @param className_function _@param_ `className_function` + *
+ * * `className` — One or more space-separated classes to be added to the class attribute of each matched element.
+ * * `function` — A function returning one or more space-separated class names to be added to the existing class + * name(s). Receives the index position of the element in the set and the existing class name(s) as + * arguments. Within the function, `this` refers to the current element in the set. + * @see \`{@link https://api.jquery.com/addClass/ }\` * @since 1.0 * @since 1.4 + * @since 3.3 + * @example ​ ````Add the class "selected" to the matched elements. +```html + + + + + addClass demo + + + + +​ +

Hello

+

and

+

Goodbye

+​ + +​ + + +``` + * @example ​ ````Add the classes "selected" and "highlight" to the matched elements. +```html + + + + + addClass demo + + + + +​ +

Hello

+

and

+

Goodbye

+​ + +​ + + +``` + * @example ​ ````Pass in a function to .addClass() to add the "green" class to a div that already has a "red" class. +```html + + + + + addClass demo + + + + +​ +
This div should be white
+
This div will be green because it now has the "green" and "red" classes. + It would be red if the addClass function failed.
+
This div should be white
+

There are zero green divs

+​ + +​ + + +``` */ - addClass(className: string | ((this: TElement, index: number, currentClassName: string) => string)): this; + addClass(className_function: JQuery.TypeOrArray | ((this: TElement, index: number, currentClassName: string) => string)): this; /** * Insert content, specified by the parameter, after each element in the set of matched elements. - * * @param contents One or more additional DOM elements, text nodes, arrays of elements and text nodes, HTML strings, or * jQuery objects to insert after each element in the set of matched elements. - * @see {@link https://api.jquery.com/after/} + * @see \`{@link https://api.jquery.com/after/ }\` * @since 1.0 + * @example ​ ````Inserts some HTML after all paragraphs. +```html + + + + + after demo + + + + +​ +

I would like to say:

+​ + +​ + + +``` + * @example ​ ````Inserts a DOM element after all paragraphs. +```html + + + + + after demo + + + + +​ +

I would like to say:

+​ + +​ + + +``` + * @example ​ ````Inserts a jQuery object (similar to an Array of DOM Elements) after all paragraphs. +```html + + + + + after demo + + + + +​ +Hello +

I would like to say:

+​ + +​ + + +``` */ after(...contents: Array>>): this; /** * Insert content, specified by the parameter, after each element in the set of matched elements. - * - * @param fn A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert - * after each element in the set of matched elements. Receives the index position of the element in the - * set and the old HTML value of the element as arguments. Within the function, this refers to the - * current element in the set. - * @see {@link https://api.jquery.com/after/} + * @param function_functionーhtml _@param_ `function_functionーhtml` + *
+ * * `function` — A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert + * after each element in the set of matched elements. Receives the index position of the element in the + * set as an argument. Within the function, `this` refers to the current element in the set.
+ * * `functionーhtml` — A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert + * after each element in the set of matched elements. Receives the index position of the element in the + * set and the old HTML value of the element as arguments. Within the function, `this` refers to the + * current element in the set. + * @see \`{@link https://api.jquery.com/after/ }\` * @since 1.4 * @since 1.10 */ - after(fn: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; + after(function_functionーhtml: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; /** * Register a handler to be called when Ajax requests complete. This is an AjaxEvent. - * * @param handler The function to be invoked. - * @see {@link https://api.jquery.com/ajaxComplete/} + * @see \`{@link https://api.jquery.com/ajaxComplete/ }\` * @since 1.0 + * @example ​ ````Show a message when an Ajax request completes. +```javascript +$( document ).ajaxComplete(function( event, request, settings ) { + $( "#msg" ).append( "
  • Request Complete.
  • " ); +}); +``` */ - ajaxComplete(handler: (this: Document, event: JQuery.Event, jqXHR: JQuery.jqXHR, ajaxOptions: JQuery.AjaxSettings) => void | false): this; + ajaxComplete(handler: (this: Document, + event: JQuery.TriggeredEvent, + jqXHR: JQuery.jqXHR, + ajaxOptions: JQuery.AjaxSettings) => void | false): this; /** * Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event. - * * @param handler The function to be invoked. - * @see {@link https://api.jquery.com/ajaxError/} + * @see \`{@link https://api.jquery.com/ajaxError/ }\` * @since 1.0 + * @example ​ ````Show a message when an Ajax request fails. +```javascript +$( document ).ajaxError(function( event, request, settings ) { + $( "#msg" ).append( "
  • Error requesting page " + settings.url + "
  • " ); +}); +``` */ - ajaxError(handler: (this: Document, event: JQuery.Event, jqXHR: JQuery.jqXHR, ajaxSettings: JQuery.AjaxSettings, thrownError: string) => void | false): this; + ajaxError(handler: (this: Document, + event: JQuery.TriggeredEvent, + jqXHR: JQuery.jqXHR, + ajaxSettings: JQuery.AjaxSettings, + thrownError: string) => void | false): this; /** * Attach a function to be executed before an Ajax request is sent. This is an Ajax Event. - * * @param handler The function to be invoked. - * @see {@link https://api.jquery.com/ajaxSend/} + * @see \`{@link https://api.jquery.com/ajaxSend/ }\` * @since 1.0 + * @example ​ ````Show a message before an Ajax request is sent. +```javascript +$( document ).ajaxSend(function( event, request, settings ) { + $( "#msg" ).append( "
  • Starting request at " + settings.url + "
  • " ); +}); +``` */ - ajaxSend(handler: (this: Document, event: JQuery.Event, jqXHR: JQuery.jqXHR, ajaxOptions: JQuery.AjaxSettings) => void | false): this; + ajaxSend(handler: (this: Document, + event: JQuery.TriggeredEvent, + jqXHR: JQuery.jqXHR, + ajaxOptions: JQuery.AjaxSettings) => void | false): this; /** * Register a handler to be called when the first Ajax request begins. This is an Ajax Event. - * * @param handler The function to be invoked. - * @see {@link https://api.jquery.com/ajaxStart/} + * @see \`{@link https://api.jquery.com/ajaxStart/ }\` * @since 1.0 + * @example ​ ````Show a loading message whenever an Ajax request starts (and none is already active). +```javascript +$( document ).ajaxStart(function() { + $( "#loading" ).show(); +}); +``` */ ajaxStart(handler: (this: Document) => void | false): this; /** * Register a handler to be called when all Ajax requests have completed. This is an Ajax Event. - * * @param handler The function to be invoked. - * @see {@link https://api.jquery.com/ajaxStop/} + * @see \`{@link https://api.jquery.com/ajaxStop/ }\` * @since 1.0 + * @example ​ ````Hide a loading message after all the Ajax requests have stopped. +```javascript +$( document ).ajaxStop(function() { + $( "#loading" ).hide(); +}); +``` */ ajaxStop(handler: (this: Document) => void | false): this; /** * Attach a function to be executed whenever an Ajax request completes successfully. This is an Ajax Event. - * * @param handler The function to be invoked. - * @see {@link https://api.jquery.com/ajaxSuccess/} + * @see \`{@link https://api.jquery.com/ajaxSuccess/ }\` * @since 1.0 + * @example ​ ````Show a message when an Ajax request completes successfully. +```javascript +$( document ).ajaxSuccess(function( event, request, settings ) { + $( "#msg" ).append( "
  • Successful Request!
  • " ); +}); +``` */ - ajaxSuccess(handler: (this: Document, event: JQuery.Event, jqXHR: JQuery.jqXHR, ajaxOptions: JQuery.AjaxSettings, data: JQuery.PlainObject) => void | false): this; + ajaxSuccess(handler: (this: Document, + event: JQuery.TriggeredEvent, + jqXHR: JQuery.jqXHR, + ajaxOptions: JQuery.AjaxSettings, + data: JQuery.PlainObject) => void | false): this; /** * Perform a custom animation of a set of CSS properties. - * * @param properties An object of CSS properties and values that the animation will move toward. * @param duration A string or number determining how long the animation will run. * @param easing A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/animate/} + * @see \`{@link https://api.jquery.com/animate/ }\` * @since 1.0 + * @example ​ ````An example of using an 'easing' function to provide a different style of animation. This will only work if you have a plugin that provides this easing function. Note, this code will do nothing unless the paragraph element is hidden. +```javascript +$( "p" ).animate({ + opacity: "show" +}, "slow", "easein" ); +``` + * @example ​ ````Animate all paragraphs and execute a callback function when the animation is complete. The first argument is an object of CSS properties, the second specifies that the animation should take 1000 milliseconds to complete, the third states the easing type, and the fourth argument is an anonymous callback function. +```javascript +$( "p" ).animate({ + height: 200, + width: 400, + opacity: 0.5 +}, 1000, "linear", function() { + alert( "all done" ); +}); +``` */ animate(properties: JQuery.PlainObject, duration: JQuery.Duration, @@ -3100,4928 +642,12301 @@ interface JQuery extends Iterable complete?: (this: TElement) => void): this; /** * Perform a custom animation of a set of CSS properties. - * * @param properties An object of CSS properties and values that the animation will move toward. - * @param duration_easing A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. + * @param duration_easing _@param_ `duration_easing` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/animate/} + * @see \`{@link https://api.jquery.com/animate/ }\` * @since 1.0 + * @example ​ ````Click the button to animate the div with a number of different properties. +```html + + + + + animate demo + + + + +​ + +
    Hello!
    +​ + +​ + + +``` + * @example ​ ````Animates a div's left property with a relative value. Click several times on the buttons to see the relative animations queued up. +```html + + + + + animate demo + + + + +​ + + +
    +​ + +​ + + +``` + * @example ​ ````Animate all paragraphs to toggle both height and opacity, completing the animation within 600 milliseconds. +```javascript +$( "p" ).animate({ + height: "toggle", + opacity: "toggle" +}, "slow" ); +``` + * @example ​ ````Animate all paragraphs to a left style of 50 and opacity of 1 (opaque, visible), completing the animation within 500 milliseconds. +```javascript +$( "p" ).animate({ + left: 50, + opacity: 1 +}, 500 ); +``` */ animate(properties: JQuery.PlainObject, duration_easing: JQuery.Duration | string, complete?: (this: TElement) => void): this; /** * Perform a custom animation of a set of CSS properties. - * * @param properties An object of CSS properties and values that the animation will move toward. * @param options A map of additional options to pass to the method. - * @see {@link https://api.jquery.com/animate/} + * @see \`{@link https://api.jquery.com/animate/ }\` * @since 1.0 + * @example ​ ````The first button shows how an unqueued animation works. It expands the div out to 90% width while the font-size is increasing. Once the font-size change is complete, the border animation will begin. + +The second button starts a traditional chained animation, where each animation will start once the previous animation on the element has completed. +```html + + + + + animate demo + + + + +​ + + + + +
    Block1
    +
    Block2
    +​ + +​ + + +``` + * @example ​ ````Animates the first div's left property and synchronizes the remaining divs, using the step function to set their left properties at each stage of the animation. +```html + + + + + animate demo + + + + +​ +

    +
    +
    +
    +
    +
    +
    +​ + +​ + + +``` + * @example ​ ````Animate the left and opacity style properties of all paragraphs; run the animation outside the queue, so that it will automatically start without waiting for its turn. +```javascript +$( "p" ).animate({ + left: "50px", + opacity: 1 +}, { + duration: 500, + queue: false +}); +``` + * @example ​ ````Animates all paragraphs to toggle both height and opacity, completing the animation within 600 milliseconds. +```javascript +$( "p" ).animate({ + height: "toggle", + opacity: "toggle" +}, { + duration: "slow" +}); +``` + * @example ​ ````Use an easing function to provide a different style of animation. This will only work if you have a plugin that provides this easing function. +```javascript +$( "p" ).animate({ + opacity: "show" +}, { + duration: "slow", + easing: "easein" +}); +``` */ animate(properties: JQuery.PlainObject, options: JQuery.EffectsOptions): this; /** * Perform a custom animation of a set of CSS properties. - * * @param properties An object of CSS properties and values that the animation will move toward. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/animate/} + * @see \`{@link https://api.jquery.com/animate/ }\` * @since 1.0 */ animate(properties: JQuery.PlainObject, complete?: (this: TElement) => void): this; /** * Insert content, specified by the parameter, to the end of each element in the set of matched elements. - * * @param contents One or more additional DOM elements, text nodes, arrays of elements and text nodes, HTML strings, or * jQuery objects to insert at the end of each element in the set of matched elements. - * @see {@link https://api.jquery.com/append/} + * @see \`{@link https://api.jquery.com/append/ }\` * @since 1.0 + * @example ​ ````Appends some HTML to all paragraphs. +```html + + + + + append demo + + + + +​ +

    I would like to say:

    +​ + +​ + + +``` + * @example ​ ````Appends an Element to all paragraphs. +```html + + + + + append demo + + + + +​ +

    I would like to say:

    +​ + +​ + + +``` + * @example ​ ````Appends a jQuery object (similar to an Array of DOM Elements) to all paragraphs. +```html + + + + + append demo + + + + +​ +Hello world!!! +

    I would like to say:

    +​ + +​ + + +``` */ append(...contents: Array>>): this; /** * Insert content, specified by the parameter, to the end of each element in the set of matched elements. - * - * @param fn A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert at - * the end of each element in the set of matched elements. Receives the index position of the element - * in the set and the old HTML value of the element as arguments. Within the function, this refers to - * the current element in the set. - * @see {@link https://api.jquery.com/append/} + * @param funсtion A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert at + * the end of each element in the set of matched elements. Receives the index position of the element + * in the set and the old HTML value of the element as arguments. Within the function, `this` refers to + * the current element in the set. + * @see \`{@link https://api.jquery.com/append/ }\` * @since 1.4 */ - append(fn: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; + append(funсtion: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; /** * Insert every element in the set of matched elements to the end of the target. - * * @param target A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements * will be inserted at the end of the element(s) specified by this parameter. - * @see {@link https://api.jquery.com/appendTo/} + * @see \`{@link https://api.jquery.com/appendTo/ }\` * @since 1.0 + * @example ​ ````Append all spans to the element with the ID "foo" (Check append() documentation for more examples) +```html + + + + + appendTo demo + + + + +​ +I have nothing more to say... +​ +
    FOO!
    +​ + +​ + + +``` */ - appendTo(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; + appendTo(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; /** * Set one or more attributes for the set of matched elements. - * * @param attributeName The name of the attribute to set. - * @param value A value to set for the attribute. If null, the specified attribute will be removed (as in .removeAttr()). - * A function returning the value to set. this is the current element. Receives the index position of - * the element in the set and the old attribute value as arguments. - * @see {@link https://api.jquery.com/attr/} + * @param value_function _@param_ `value_function` + *
    + * * `value` — A value to set for the attribute. If `null`, the specified attribute will be removed (as in \`{@link removeAttr .removeAttr()}`).
    + * * `function` — A function returning the value to set. `this` is the current element. Receives the index position of + * the element in the set and the old attribute value as arguments. + * @see \`{@link https://api.jquery.com/attr/ }\` * @since 1.0 * @since 1.1 + * @example ​ ````Set the id for divs based on the position in the page. +```html + + + + + attr demo + + + + +​ +
    Zero-th
    +
    First
    +
    Second
    +​ + +​ + + +``` + * @example ​ ````Set the src attribute from title attribute on the image. +```html + + + + + attr demo + + + +​ + +​ + +​ + + +``` */ attr(attributeName: string, - value: string | number | null | ((this: TElement, index: number, attr: string) => string | number | void | undefined)): this; + value_function: string | number | null | ((this: TElement, index: number, attr: string) => string | number | void | undefined)): this; /** * Set one or more attributes for the set of matched elements. - * * @param attributes An object of attribute-value pairs to set. - * @see {@link https://api.jquery.com/attr/} + * @see \`{@link https://api.jquery.com/attr/ }\` * @since 1.0 + * @example ​ ````Set some attributes for all <img>s in the page. +```html + + + + + attr demo + + + + +​ + + + +​ +
    Attribute of Ajax
    +​ + +​ + + +``` */ attr(attributes: JQuery.PlainObject): this; /** * Get the value of an attribute for the first element in the set of matched elements. - * * @param attributeName The name of the attribute to get. - * @see {@link https://api.jquery.com/attr/} + * @see \`{@link https://api.jquery.com/attr/ }\` * @since 1.0 + * @example ​ ````Display the checked attribute and property of a checkbox as it changes. +```html + + + + + attr demo + + + + +​ + + +

    +​ + +​ + + +``` + * @example ​ ````Find the title attribute of the first <em> in the page. +```html + + + + + attr demo + + + + +​ +

    Once there was a large dinosaur...

    +​ +The title of the emphasis is:
    +​ + +​ + + +``` */ attr(attributeName: string): string | undefined; /** * Insert content, specified by the parameter, before each element in the set of matched elements. - * * @param contents One or more additional DOM elements, text nodes, arrays of elements and text nodes, HTML strings, or * jQuery objects to insert before each element in the set of matched elements. - * @see {@link https://api.jquery.com/before/} + * @see \`{@link https://api.jquery.com/before/ }\` * @since 1.0 + * @example ​ ````Inserts some HTML before all paragraphs. +```html + + + + + before demo + + + + +​ +

    is what I said...

    +​ + +​ + + +``` + * @example ​ ````Inserts a DOM element before all paragraphs. +```html + + + + + before demo + + + + +​ +

    is what I said...

    +​ + +​ + + +``` + * @example ​ ````Inserts a jQuery object (similar to an Array of DOM Elements) before all paragraphs. +```html + + + + + before demo + + + + +​ +

    is what I said...

    Hello +​ + +​ + + +``` */ before(...contents: Array>>): this; /** * Insert content, specified by the parameter, before each element in the set of matched elements. - * - * @param fn A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert - * before each element in the set of matched elements. Receives the index position of the element in - * the set and the old HTML value of the element as arguments. Within the function, this refers to the - * current element in the set. - * @see {@link https://api.jquery.com/before/} + * @param function_functionーhtml _@param_ `function_functionーhtml` + *
    + * * `function` — A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert + * before each element in the set of matched elements. Receives the index position of the element in + * the set as an argument. Within the function, `this` refers to the current element in the set.
    + * * `functionーhtml` — A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert + * before each element in the set of matched elements. Receives the index position of the element in + * the set and the old HTML value of the element as arguments. Within the function, `this` refers to the + * current element in the set. + * @see \`{@link https://api.jquery.com/before/ }\` * @since 1.4 * @since 1.10 */ - before(fn: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; + before(function_functionーhtml: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; // [bind() overloads] https://github.com/jquery/api.jquery.com/issues/1048 /** * Attach a handler to an event for the elements. - * * @param eventType A string containing one or more DOM event types, such as "click" or "submit," or custom event names. * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/bind/} + * @see \`{@link https://api.jquery.com/bind/ }\` * @since 1.0 * @since 1.4.3 - * @deprecated 3.0 + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. */ - bind(eventType: string, - eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + bind( + eventType: TType, + eventData: TData, + handler: JQuery.TypeEventHandler + ): this; /** * Attach a handler to an event for the elements. - * * @param eventType A string containing one or more DOM event types, such as "click" or "submit," or custom event names. - * @param handler A function to execute each time the event is triggered. - * Setting the second argument to false will attach a function that prevents the default action from - * occurring and stops the event from bubbling. - * @see {@link https://api.jquery.com/bind/} + * @param handler_preventBubble _@param_ `handler_preventBubble` + *
    + * * `handler` — A function to execute each time the event is triggered.
    + * * `preventBubble` — Setting the third argument to false will attach a function that prevents the default action from + * occurring and stops the event from bubbling. The default is `true`. + * @see \`{@link https://api.jquery.com/bind/ }\` * @since 1.0 * @since 1.4.3 - * @deprecated 3.0 + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````Handle click and double-click for the paragraph. Note: the coordinates are window relative, so in this case relative to the demo iframe. +```html + + + + + bind demo + + + + +​ +

    Click or double click here.

    + +​ + +​ + + +``` + * @example ​ ````To display each paragraph's text in an alert box whenever it is clicked: +```javascript +$( "p" ).bind( "click", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Cancel a default action and prevent it from bubbling up by returning false: +```javascript +$( "form" ).bind( "submit", function() { + return false; +}) +``` + * @example ​ ````Cancel only the default action by using the .preventDefault() method. +```javascript +$( "form" ).bind( "submit", function( event ) { + event.preventDefault(); +}); +``` + * @example ​ ````Stop an event from bubbling without preventing the default action by using the .stopPropagation() method. +```javascript +$( "form" ).bind( "submit", function( event ) { + event.stopPropagation(); +}); +``` + * @example ​ ````Bind custom events. +```html + + + + + bind demo + + + + +​ +

    Has an attached custom event.

    + + +​ + +​ + + +``` */ - bind(eventType: string, - handler: JQuery.EventHandler | JQuery.EventHandlerBase> | false | null | undefined): this; + bind( + eventType: TType, + handler_preventBubble: JQuery.TypeEventHandler | + false | + null | + undefined + ): this; /** * Attach a handler to an event for the elements. - * * @param events An object containing one or more DOM event types and functions to execute for them. - * @see {@link https://api.jquery.com/bind/} + * @see \`{@link https://api.jquery.com/bind/ }\` * @since 1.4 - * @deprecated 3.0 + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````Bind multiple events simultaneously. +```javascript +$( "div.test" ).bind({ + click: function() { + $( this ).addClass( "active" ); + }, + mouseenter: function() { + $( this ).addClass( "inside" ); + }, + mouseleave: function() { + $( this ).removeClass( "inside" ); + } +}); +``` */ - bind(events: JQuery.PlainObject | JQuery.EventHandlerBase> | false>): this; + bind(events: JQuery.TypeEventHandlers): this; /** * Bind an event handler to the "blur" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/blur/} + * @see \`{@link https://api.jquery.com/blur/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ blur(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "blur" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/blur/} + * @see \`{@link https://api.jquery.com/blur/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To trigger the blur event on all paragraphs: +```javascript +$( "p" ).blur(); +``` */ - blur(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + blur(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to the "change" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/change/} + * @see \`{@link https://api.jquery.com/change/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ change(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "change" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/change/} + * @see \`{@link https://api.jquery.com/change/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Attaches a change event to the select that gets the text for each selected option and writes them in the div. It then triggers the event for the initial text draw. +```html + + + + + change demo + + + + +​ + +
    +​ + +​ + + +``` + * @example ​ ````To add a validity test to all text input elements: +```javascript +$( "input[type='text']" ).change(function() { + // Check input( $( this ).val() ) for validity here +}); +``` */ - change(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + change(handler?: JQuery.TypeEventHandler | + false): this; /** * Get the children of each element in the set of matched elements, optionally filtered by a selector. - * * @param selector A string containing a selector expression to match elements against. - * @see {@link https://api.jquery.com/children/} + * @see \`{@link https://api.jquery.com/children/ }\` * @since 1.0 + * @example ​ ````Find all children of the clicked element. +```html + + + + + children demo + + + + +​ +
    +
    +

    This is the way we + write the demo,

    +
    +​ +
    + write the demo, demo, +
    +​ +
    + This the way we write the demo so + in +
    +​ +

    + the morning. + Found 0 children in TAG. +

    +
    +​ + +​ + + +``` + * @example ​ ````Find all children of each div. +```html + + + + + children demo + + + + +​ +

    Hello (this is a paragraph)

    +​ +
    Hello Again (this span is a child of the a div)
    +

    And Again (in another paragraph)

    +​ +
    And One Last Time (most text directly in a div)
    +​ + +​ + + +``` + * @example ​ ````Find all children with a class "selected" of each div. +```html + + + + + children demo + + + + +​ +
    + Hello +

    Hello Again

    +
    And Again
    +

    And One Last Time

    +
    +​ + +​ + + +``` */ children(selector?: JQuery.Selector): this; /** * Remove from the queue all items that have not yet been run. - * * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. - * @see {@link https://api.jquery.com/clearQueue/} + * @see \`{@link https://api.jquery.com/clearQueue/ }\` * @since 1.4 + * @example ​ ````Empty the queue. +```html + + + + + clearQueue demo + + + + +​ + + +
    +​ + +​ + + +``` */ clearQueue(queueName?: string): this; /** * Bind an event handler to the "click" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/click/} + * @see \`{@link https://api.jquery.com/click/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ click(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "click" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/click/} + * @see \`{@link https://api.jquery.com/click/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Hide paragraphs on a page when they are clicked: +```html + + + + + click demo + + + + +​ +

    First Paragraph

    +

    Second Paragraph

    +

    Yet one more Paragraph

    +​ + +​ + + +``` + * @example ​ ````Trigger the click event on all of the paragraphs on the page: +```javascript +$( "p" ).click(); +``` */ - click(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + click(handler?: JQuery.TypeEventHandler | + false): this; /** * Create a deep copy of the set of matched elements. - * * @param withDataAndEvents A Boolean indicating whether event handlers and data should be copied along with the elements. The * default value is false. *In jQuery 1.5.0 the default value was incorrectly true; it was changed back * to false in 1.5.1 and up. * @param deepWithDataAndEvents A Boolean indicating whether event handlers and data for all children of the cloned element should * be copied. By default its value matches the first argument's value (which defaults to false). - * @see {@link https://api.jquery.com/clone/} + * @see \`{@link https://api.jquery.com/clone/ }\` * @since 1.0 * @since 1.5 + * @example ​ ````Clones all b elements (and selects the clones) and prepends them to all paragraphs. +```html + + + + + clone demo + + + +​ +Hello

    , how are you?

    +​ + +​ + + +``` */ clone(withDataAndEvents?: boolean, deepWithDataAndEvents?: boolean): this; /** - * For each element in the set, get the first element that matches the selector by testing the element - * itself and traversing up through its ancestors in the DOM tree. - * + * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. * @param selector A string containing a selector expression to match elements against. * @param context A DOM element within which a matching element may be found. - * @see {@link https://api.jquery.com/closest/} + * @see \`{@link https://api.jquery.com/closest/ }\` * @since 1.4 */ closest(selector: JQuery.Selector, context: Element): this; /** - * For each element in the set, get the first element that matches the selector by testing the element - * itself and traversing up through its ancestors in the DOM tree. - * - * @param selector A string containing a selector expression to match elements against. - * A jQuery object to match elements against. - * An element to match elements against. - * @see {@link https://api.jquery.com/closest/} + * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. + * @param selector_selection_element _@param_ `selector_selection_element` + *
    + * * `selector` — A string containing a selector expression to match elements against.
    + * * `selection` — A jQuery object to match elements against.
    + * * `element` — An element to match elements against. + * @see \`{@link https://api.jquery.com/closest/ }\` * @since 1.3 * @since 1.6 + * @example ​ ````Show how event delegation can be done with closest. The closest list element toggles a yellow background when it or its descendent is clicked. +```html + + + + + closest demo + + + + +​ +
      +
    • Click me!
    • +
    • You can also Click me!
    • +
    +​ + +​ + + +``` + * @example ​ ````Pass a jQuery object to closest. The closest list element toggles a yellow background when it or its descendent is clicked. +```html + + + + + closest demo + + + + +​ +
      +
    • Click me!
    • +
    • You can also Click me!
    • +
    +​ + +​ + + +``` */ - closest(selector: JQuery.Selector | Element | JQuery): this; + closest(selector_selection_element: JQuery.Selector | Element | JQuery): this; /** * Get the children of each element in the set of matched elements, including text and comment nodes. - * - * @see {@link https://api.jquery.com/contents/} + * @see \`{@link https://api.jquery.com/contents/ }\` * @since 1.2 + * @example ​ ````Find all the text nodes inside a paragraph and wrap them with a bold tag. +```html + + + + + contents demo + + + +​ +

    Hello John, how are you doing?

    +​ + +​ + + +``` + * @example ​ ````Change the background color of links inside of an iframe. +```html + + + + + contents demo + + + +​ + +​ + +​ + + +``` */ - contents(): JQuery; + contents(): JQuery; /** * Bind an event handler to the "contextmenu" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/contextmenu/} + * @see \`{@link https://api.jquery.com/contextmenu/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ contextmenu(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "contextmenu" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/contextmenu/} + * @see \`{@link https://api.jquery.com/contextmenu/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To show a "Hello World!" alert box when the contextmenu event is triggered on a paragraph on the page: +```javascript +$( "p" ).contextmenu(function() { + alert( "Hello World!" ); +}); +``` + * @example ​ ````Right click to toggle background color. +```html + + + + + contextmenu demo + + + + +​ +
    +Right click the block +​ + +​ + + +``` */ - contextmenu(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + contextmenu(handler?: JQuery.TypeEventHandler | + false): this; /** * Set one or more CSS properties for the set of matched elements. - * * @param propertyName A CSS property name. - * @param value A value to set for the property. - * A function returning the value to set. this is the current element. Receives the index position of - * the element in the set and the old value as arguments. - * @see {@link https://api.jquery.com/css/} + * @param value_function _@param_ `value_function` + *
    + * * `value` — A value to set for the property.
    + * * `function` — A function returning the value to set. `this` is the current element. Receives the index position of + * the element in the set and the old value as arguments. + * @see \`{@link https://api.jquery.com/css/ }\` * @since 1.0 * @since 1.4 + * @example ​ ````Change the color of any paragraph to red on mouseover event. +```html + + + + + css demo + + + + +​ +

    Just roll the mouse over me.

    +​ +

    Or me to see a color change.

    +​ + +​ + + +``` + * @example ​ ````Increase the width of #box by 200 pixels the first time it is clicked. +```html + + + + + css demo + + + + +​ +
    Click me to grow
    +​ + +​ + + +``` + * @example ​ ````Highlight a clicked word in the paragraph. +```html + + + + + css demo + + + + +​ +

    + Once upon a time there was a man + who lived in a pizza parlor. This + man just loved pizza and ate it all + the time. He went on to be the + happiest man in the world. The end. +

    +​ + +​ + + +``` */ css(propertyName: string, - value: string | number | ((this: TElement, index: number, value: string) => string | number | void | undefined)): this; + value_function: string | number | ((this: TElement, index: number, value: string) => string | number | void | undefined)): this; /** * Set one or more CSS properties for the set of matched elements. - * * @param properties An object of property-value pairs to set. - * @see {@link https://api.jquery.com/css/} + * @see \`{@link https://api.jquery.com/css/ }\` * @since 1.0 + * @example ​ ````Change the font weight and background color on mouseenter and mouseleave. +```html + + + + + css demo + + + + +​ +

    Move the mouse over a paragraph.

    +

    Like this one or the one above.

    +​ + +​ + + +``` + * @example ​ ````Increase the size of a div when you click it. +```html + + + + + css demo + + + + +​ +
    click
    +
    click
    +​ + +​ + + +``` */ css(properties: JQuery.PlainObject string | number | void | undefined)>): this; /** * Get the computed style properties for the first element in the set of matched elements. - * * @param propertyName A CSS property. - * An array of one or more CSS properties. - * @see {@link https://api.jquery.com/css/} + * @see \`{@link https://api.jquery.com/css/ }\` * @since 1.0 + * @example ​ ````Get the background color of a clicked div. +```html + + + + + css demo + + + + +​ +  +
    +
    +
    +
    +​ + +​ + + +``` */ css(propertyName: string): string; /** * Get the computed style properties for the first element in the set of matched elements. - * * @param propertyNames An array of one or more CSS properties. - * @see {@link https://api.jquery.com/css/} + * @see \`{@link https://api.jquery.com/css/ }\` * @since 1.9 + * @example ​ ````Get the width, height, text color, and background color of a clicked div. +```html + + + + + css demo + + + + +​ +

     

    +
    1
    +
    2
    +
    3
    +
    4
    +​ + +​ + + +``` */ css(propertyNames: string[]): JQuery.PlainObject; - /** - * Return the value at the named data store for the first element in the jQuery collection, as set by - * data(name, value) or by an HTML5 data-* attribute. - * - * @param key Name of the data stored. - * @see {@link https://api.jquery.com/data/} - * @since 1.2.3 - */ - data(key: string, undefined: undefined): any; // tslint:disable-line:unified-signatures /** * Store arbitrary data associated with the matched elements. - * * @param key A string naming the piece of data to set. - * @param value The new data value; this can be any Javascript type except undefined. - * @see {@link https://api.jquery.com/data/} + * @param value The new data value; this can be any Javascript type except `undefined`. + * @see \`{@link https://api.jquery.com/data/ }\` * @since 1.2.3 + * @example ​ ````Store then retrieve a value from the div element. +```html + + + + + data demo + + + + +​ +
    + The values stored were + + and + +
    +​ + +​ + + +``` */ - data(key: string, value: any): this; + data(key: string, value: string | number | boolean | symbol | object | null): this; /** * Store arbitrary data associated with the matched elements. - * * @param obj An object of key-value pairs of data to update. - * @see {@link https://api.jquery.com/data/} + * @see \`{@link https://api.jquery.com/data/ }\` * @since 1.4.3 */ data(obj: JQuery.PlainObject): this; /** - * Return the value at the named data store for the first element in the jQuery collection, as set by - * data(name, value) or by an HTML5 data-* attribute. - * + * Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute. * @param key Name of the data stored. - * @see {@link https://api.jquery.com/data/} + * @param value `undefined` is not recognized as a data value. Calls such as `.data( "name", undefined )` + * will return the jQuery object that it was called on, allowing for chaining. + * @see \`{@link https://api.jquery.com/data/ }\` * @since 1.2.3 */ + // `unified-signatures` is disabled so that behavior when passing `undefined` to `value` can be documented. Unifying the signatures + // results in potential confusion for users from an unexpected parameter. + // tslint:disable-next-line:unified-signatures + data(key: string, value: undefined): any; + /** + * Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute. + * @param key Name of the data stored. + * @see \`{@link https://api.jquery.com/data/ }\` + * @since 1.2.3 + * @example ​ ````Get the data named "blah" stored at for an element. +```html + + + + + data demo + + + + +​ +
    A div
    + + + + +

    The "blah" value of this div is ?

    +​ + +​ + + +``` + */ data(key: string): any; /** - * Return the value at the named data store for the first element in the jQuery collection, as set by - * data(name, value) or by an HTML5 data-* attribute. - * - * @see {@link https://api.jquery.com/data/} + * Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute. + * @see \`{@link https://api.jquery.com/data/ }\` * @since 1.4 */ data(): JQuery.PlainObject; /** * Bind an event handler to the "dblclick" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/dblclick/} + * @see \`{@link https://api.jquery.com/dblclick/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ dblclick(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "dblclick" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/dblclick/} + * @see \`{@link https://api.jquery.com/dblclick/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To bind a "Hello World!" alert box to the dblclick event on every paragraph on the page: +```javascript +$( "p" ).dblclick(function() { + alert( "Hello World!" ); +}); +``` + * @example ​ ````Double click to toggle background color. +```html + + + + + dblclick demo + + + + +​ +
    +Double click the block +​ + +​ + + +``` */ - dblclick(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + dblclick(handler?: JQuery.TypeEventHandler | + false): this; /** * Set a timer to delay execution of subsequent items in the queue. - * * @param duration An integer indicating the number of milliseconds to delay execution of the next item in the queue. * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. - * @see {@link https://api.jquery.com/delay/} + * @see \`{@link https://api.jquery.com/delay/ }\` * @since 1.4 + * @example ​ ````Animate the hiding and showing of two divs, delaying the first before showing it. +```html + + + + + delay demo + + + + +​ +

    +
    +
    +​ + +​ + + +``` */ delay(duration: JQuery.Duration, queueName?: string): this; /** - * Attach a handler to one or more events for all elements that match the selector, now or in the - * future, based on a specific set of root elements. - * + * Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. * @param selector A selector to filter the elements that trigger the event. * @param eventType A string containing one or more space-separated JavaScript event types, such as "click" or * "keydown," or custom event names. * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/delegate/} + * @see \`{@link https://api.jquery.com/delegate/ }\` * @since 1.4.2 - * @deprecated 3.0 - */ - delegate(selector: JQuery.Selector, - eventType: string, - eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; - /** - * Attach a handler to one or more events for all elements that match the selector, now or in the - * future, based on a specific set of root elements. + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + */ + delegate( + selector: JQuery.Selector, + eventType: TType, + eventData: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. * @param selector A selector to filter the elements that trigger the event. * @param eventType A string containing one or more space-separated JavaScript event types, such as "click" or * "keydown," or custom event names. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/delegate/} + * @see \`{@link https://api.jquery.com/delegate/ }\` * @since 1.4.2 - * @deprecated 3.0 - */ - delegate(selector: JQuery.Selector, - eventType: string, - handler: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; - /** - * Attach a handler to one or more events for all elements that match the selector, now or in the - * future, based on a specific set of root elements. + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````Click a paragraph to add another. Note that .delegate() attaches a click event handler to all paragraphs - even new ones. +```html + + + + + delegate demo + + + + +​ +

    Click me!

    +​ + +​ + +​ + + +``` + * @example ​ ````To display each paragraph's text in an alert box whenever it is clicked: +```javascript +$( "body" ).delegate( "p", "click", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````To cancel a default action and prevent it from bubbling up, return false: +```javascript +$( "body" ).delegate( "a", "click", function() { + return false; +}); +``` + * @example ​ ````To cancel only the default action by using the preventDefault method. +```javascript +$( "body" ).delegate( "a", "click", function( event ) { + event.preventDefault(); +}); +``` + * @example ​ ````Can bind custom events too. +```html + + + + + delegate demo + + + + +​ +

    Has an attached custom event.

    + + +​ + +​ + + +``` + */ + delegate( + selector: JQuery.Selector, + eventType: TType, + handler: JQuery.TypeEventHandler | + false + ): this; + /** + * Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. * @param selector A selector to filter the elements that trigger the event. * @param events A plain object of one or more event types and functions to execute for them. - * @see {@link https://api.jquery.com/delegate/} + * @see \`{@link https://api.jquery.com/delegate/ }\` * @since 1.4.3 - * @deprecated 3.0 + * @deprecated ​ Deprecated since 3.0. Use \`{@link on }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. */ delegate(selector: JQuery.Selector, - events: JQuery.PlainObject | JQuery.EventHandlerBase> | false>): this; + events: JQuery.TypeEventHandlers + ): this; /** * Execute the next function on the queue for the matched elements. - * * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. - * @see {@link https://api.jquery.com/dequeue/} + * @see \`{@link https://api.jquery.com/dequeue/ }\` * @since 1.2 + * @example ​ ````Use dequeue to end a custom queue function which allows the queue to keep going. +```html + + + + + dequeue demo + + + + +​ + +
    +​ + +​ + + +``` */ dequeue(queueName?: string): this; /** * Remove the set of matched elements from the DOM. - * * @param selector A selector expression that filters the set of matched elements to be removed. - * @see {@link https://api.jquery.com/detach/} + * @see \`{@link https://api.jquery.com/detach/ }\` * @since 1.4 + * @example ​ ````Detach all paragraphs from the DOM +```html + + + + + detach demo + + + + +​ +

    Hello

    +how are +

    you?

    + +​ + +​ + + +``` */ detach(selector?: JQuery.Selector): this; /** * Iterate over a jQuery object, executing a function for each matched element. - * - * @param fn A function to execute for each matched element. - * @see {@link https://api.jquery.com/each/} + * @param funсtion A function to execute for each matched element. + * @see \`{@link https://api.jquery.com/each/ }\` * @since 1.0 + * @example ​ ````Iterate over three divs and sets their color property. +```html + + + + + each demo + + + + +​ +
    Click here
    +
    to iterate through
    +
    these divs.
    +​ + +​ + + +``` + * @example ​ ````To access a jQuery object instead of the regular DOM element, use $( this ). For example: +```html + + + + + each demo + + + + +​ +To do list: (click here to change) +
      +
    • Eat
    • +
    • Sleep
    • +
    • Be merry
    • +
    +​ + +​ + + +``` + * @example ​ ````Use return false to break out of each() loops early. +```html + + + + + each demo + + + + +​ + + +
    +
    +
    +
    +
    Stop here
    +
    +
    +
    +​ + +​ + + +``` */ - each(fn: (this: TElement, index: number, element: TElement) => void | false): this; + each(funсtion: (this: TElement, index: number, element: TElement) => void | false): this; /** * Remove all child nodes of the set of matched elements from the DOM. - * - * @see {@link https://api.jquery.com/empty/} + * @see \`{@link https://api.jquery.com/empty/ }\` * @since 1.0 + * @example ​ ````Removes all child nodes (including text nodes) from all paragraphs +```html + + + + + empty demo + + + + +​ +

    + Hello, Person and person. +

    +​ + +​ + +​ + + +``` */ empty(): this; /** - * End the most recent filtering operation in the current chain and return the set of matched elements - * to its previous state. - * - * @see {@link https://api.jquery.com/end/} + * End the most recent filtering operation in the current chain and return the set of matched elements to its previous state. + * @see \`{@link https://api.jquery.com/end/ }\` * @since 1.0 + * @example ​ ````Selects all paragraphs, finds span elements inside these, and reverts the selection back to the paragraphs. +```html + + + + + end demo + + + + +​ +

    + Hi there how are you doing? +

    +​ +

    + This span is one of + several spans in this + sentence. +

    +​ +
    + Tags in jQuery object initially: +
    +​ +
    + Tags in jQuery object after find: +
    +​ +
    + Tags in jQuery object after end: +
    +​ + +​ + + +``` + * @example ​ ````Selects all paragraphs, finds span elements inside these, and reverts the selection back to the paragraphs. +```html + + + + + end demo + + + + +​ +

    Hello, how are you?

    +​ + +​ + + +``` */ end(): this; /** * Reduce the set of matched elements to the one at the specified index. - * * @param index An integer indicating the 0-based position of the element. * An integer indicating the position of the element, counting backwards from the last element in the set. - * @see {@link https://api.jquery.com/eq/} + * @see \`{@link https://api.jquery.com/eq/ }\` * @since 1.1.2 * @since 1.4 + * @example ​ ````Turn the div with index 2 blue by adding an appropriate class. +```html + + + + + eq demo + + + + +​ +
    +
    +
    +
    +
    +
    +​ + +​ + + +``` */ eq(index: number): this; /** * Merge the contents of an object onto the jQuery prototype to provide new jQuery instance methods. - * * @param obj An object to merge onto the jQuery prototype. - * @see {@link https://api.jquery.com/jQuery.fn.extend/} + * @see \`{@link https://api.jquery.com/jQuery.fn.extend/ }\` * @since 1.0 + * @example ​ ````Add two methods to the jQuery prototype ($.fn) object and then use one of them. +```html + + + + + jQuery.fn.extend demo + + + + +​ + + +​ + +​ + + +``` */ extend(obj: object): this; /** * Display the matched elements by fading them to opaque. - * * @param duration A string or number determining how long the animation will run. * @param easing A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/fadeIn/} + * @see \`{@link https://api.jquery.com/fadeIn/ }\` * @since 1.4.3 */ fadeIn(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; /** * Display the matched elements by fading them to opaque. - * - * @param duration_easing A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. + * @param duration_easing _@param_ `duration_easing` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/fadeIn/} + * @see \`{@link https://api.jquery.com/fadeIn/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Fades a red block in over the text. Once the animation is done, it quickly fades in more text on top. +```html + + + + + fadeIn demo + + + + +​ +

    + Let it be known that the party of the first part + and the party of the second part are henceforth + and hereto directed to assess the allegations + for factual correctness... (click!) +

    CENSORED!
    +

    +​ + +​ + + +``` */ fadeIn(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; /** * Display the matched elements by fading them to opaque. - * - * @param duration_easing_complete_options A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. - * A function to call once the animation is complete, called once per matched element. - * A map of additional options to pass to the method. - * @see {@link https://api.jquery.com/fadeIn/} + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition.
    + * * `complete` — A function to call once the animation is complete, called once per matched element.
    + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/fadeIn/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Animates hidden divs to fade in one by one, completing each animation within 600 milliseconds. +```html + + + + + fadeIn demo + + + + +​ +Click here... +
    +
    +
    +​ + +​ + + +``` */ fadeIn(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; /** * Hide the matched elements by fading them to transparent. - * * @param duration A string or number determining how long the animation will run. * @param easing A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/fadeOut/} + * @see \`{@link https://api.jquery.com/fadeOut/ }\` * @since 1.4.3 + * @example ​ ````Fades out two divs, one with a "linear" easing and one with the default, "swing," easing. +```html + + + + + fadeOut demo + + + + +​ + + +​ +
    +​ +
    linear
    +
    swing
    +​ + +​ + + +``` */ fadeOut(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; /** * Hide the matched elements by fading them to transparent. - * - * @param duration_easing A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. + * @param duration_easing _@param_ `duration_easing` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/fadeOut/} + * @see \`{@link https://api.jquery.com/fadeOut/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Fades out spans in one section that you click on. +```html + + + + + fadeOut demo + + + + +​ +

    Find the modifiers -

    +

    + If you really want to go outside + in the cold then make sure to wear + your warm jacket given to you by + your favorite teacher. +

    +​ + +​ + + +``` */ fadeOut(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; /** * Hide the matched elements by fading them to transparent. - * - * @param duration_easing_complete_options A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. - * A function to call once the animation is complete, called once per matched element. - * A map of additional options to pass to the method. - * @see {@link https://api.jquery.com/fadeOut/} + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition.
    + * * `complete` — A function to call once the animation is complete, called once per matched element.
    + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/fadeOut/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Animates all paragraphs to fade out, completing the animation within 600 milliseconds. +```html + + + + + fadeOut demo + + + + +​ +

    + If you click on this paragraph + you'll see it just fade away. +

    +​ + +​ + + +``` */ fadeOut(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; /** * Adjust the opacity of the matched elements. - * * @param duration A string or number determining how long the animation will run. * @param opacity A number between 0 and 1 denoting the target opacity. * @param easing A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/fadeTo/} + * @see \`{@link https://api.jquery.com/fadeTo/ }\` * @since 1.4.3 */ fadeTo(duration: JQuery.Duration, opacity: number, easing: string, complete?: (this: TElement) => void): this; /** * Adjust the opacity of the matched elements. - * * @param duration A string or number determining how long the animation will run. * @param opacity A number between 0 and 1 denoting the target opacity. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/fadeTo/} + * @see \`{@link https://api.jquery.com/fadeTo/ }\` * @since 1.0 + * @example ​ ````Animates first paragraph to fade to an opacity of 0.33 (33%, about one third visible), completing the animation within 600 milliseconds. +```html + + + + + fadeTo demo + + + +​ +

    +Click this paragraph to see it fade. +

    +​ +

    +Compare to this one that won't fade. +

    +​ + +​ + + +``` + * @example ​ ````Fade div to a random opacity on each click, completing the animation within 200 milliseconds. +```html + + + + + fadeTo demo + + + + +​ +

    And this is the library that John built...

    +​ +
    +
    +
    +​ + +​ + + +``` + * @example ​ ````Find the right answer! The fade will take 250 milliseconds and change various styles when it completes. +```html + + + + + fadeTo demo + + + + +​ +

    Wrong

    +
    +

    Wrong

    +
    +

    Right!

    +
    +​ + +​ + + +``` */ fadeTo(duration: JQuery.Duration, opacity: number, complete?: (this: TElement) => void): this; /** * Display or hide the matched elements by animating their opacity. - * * @param duration A string or number determining how long the animation will run. * @param easing A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/fadeToggle/} + * @see \`{@link https://api.jquery.com/fadeToggle/ }\` * @since 1.4.4 + * @example ​ ````Fades first paragraph in or out, completing the animation within 600 milliseconds and using a linear easing. Fades last paragraph in or out for 200 milliseconds, inserting a "finished" message upon completion. +```html + + + + + fadeToggle demo + + + +​ + + +

    This paragraph has a slow, linear fade.

    +

    This paragraph has a fast animation.

    +
    +​ + +​ + + +``` */ fadeToggle(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; /** * Display or hide the matched elements by animating their opacity. - * - * @param duration_easing A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. + * @param duration_easing _@param_ `duration_easing` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/fadeToggle/} + * @see \`{@link https://api.jquery.com/fadeToggle/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Fades first paragraph in or out, completing the animation within 600 milliseconds and using a linear easing. Fades last paragraph in or out for 200 milliseconds, inserting a "finished" message upon completion. +```html + + + + + fadeToggle demo + + + +​ + + +

    This paragraph has a slow, linear fade.

    +

    This paragraph has a fast animation.

    +
    +​ + +​ + + +``` */ fadeToggle(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; /** * Display or hide the matched elements by animating their opacity. - * - * @param duration_easing_complete_options A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. - * A function to call once the animation is complete, called once per matched element. - * A map of additional options to pass to the method. - * @see {@link https://api.jquery.com/fadeToggle/} + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `easing` — A string indicating which easing function to use for the transition.
    + * * `complete` — A function to call once the animation is complete, called once per matched element.
    + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/fadeToggle/ }\` * @since 1.0 * @since 1.4.3 */ fadeToggle(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; /** * Reduce the set of matched elements to those that match the selector or pass the function's test. - * - * @param selector A string containing a selector expression to match the current set of elements against. - * One or more DOM elements to match the current set of elements against. - * An existing jQuery object to match the current set of elements against. - * A function used as a test for each element in the set. this is the current DOM element. - * @see {@link https://api.jquery.com/filter/} + * @param selector_elements_selection_function _@param_ `selector_elements_selection_function` + *
    + * * `selector` — A string containing a selector expression to match the current set of elements against.
    + * * `elements` — One or more DOM elements to match the current set of elements against.
    + * * `selection` — An existing jQuery object to match the current set of elements against.
    + * * `function` — A function used as a test for each element in the set. this is the current DOM element. + * @see \`{@link https://api.jquery.com/filter/ }\` * @since 1.0 * @since 1.4 + * @example ​ ````Change the color of all divs; then add a border to those with a "middle" class. +```html + + + + + filter demo + + + + +​ +
    +
    +
    +
    +
    +
    +​ + +​ + + +``` + * @example ​ ````Change the color of all divs; then add a border to the second one (index == 1) and the div with an id of "fourth." +```html + + + + + filter demo + + + + +​ +
    +
    +
    +
    +
    +
    +​ + +​ + + +``` + * @example ​ ````Select all divs and filter the selection with a DOM element, keeping only the one with an id of "unique". +```javascript +$( "div" ).filter( document.getElementById( "unique" ) ); +``` + * @example ​ ````Select all divs and filter the selection with a jQuery object, keeping only the one with an id of "unique". +```javascript +$( "div" ).filter( $( "#unique" ) ); +``` */ - filter(selector: JQuery.Selector | JQuery.TypeOrArray | JQuery | ((this: TElement, index: number, element: TElement) => boolean)): this; + filter(selector_elements_selection_function: + JQuery.Selector | + JQuery.TypeOrArray | + JQuery | + ((this: TElement, index: number, element: TElement) => boolean) + ): this; /** - * Get the descendants of each element in the current set of matched elements, filtered by a selector, - * jQuery object, or element. - * - * @param selector A string containing a selector expression to match elements against. - * An element or a jQuery object to match elements against. - * @see {@link https://api.jquery.com/find/} + * Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element. + * @param selector_element _@param_ `selector_element` + *
    + * * `selector` — A string containing a selector expression to match elements against.
    + * * `element` — An element or a jQuery object to match elements against. + * @see \`{@link https://api.jquery.com/find/ }\` * @since 1.0 * @since 1.6 + * @example ​ ````Starts with all paragraphs and searches for descendant span elements, same as $( "p span" ) +```html + + + + + find demo + + + +​ +

    Hello, how are you?

    +

    Me? I'm good.

    +​ + +​ + + +``` + * @example ​ ````A selection using a jQuery collection of all span tags. Only spans within p tags are changed to red while others are left blue. +```html + + + + + find demo + + + + +​ +

    Hello, how are you?

    +

    Me? I'm good.

    +
    Did you eat yet?
    +​ + +​ + + +``` + * @example ​ ````Add spans around each word then add a hover and italicize words with the letter t. +```html + + + + + find demo + + + + +​ +

    + When the day is short + find that which matters to you + or stop believing +

    +​ + +​ + + +``` */ - find(selector: JQuery.Selector | Element | JQuery): this; + find(selector_element: JQuery.Selector | Element | JQuery): this; /** - * Stop the currently-running animation, remove all queued animations, and complete all animations for - * the matched elements. - * + * Stop the currently-running animation, remove all queued animations, and complete all animations for the matched elements. * @param queue The name of the queue in which to stop animations. - * @see {@link https://api.jquery.com/finish/} + * @see \`{@link https://api.jquery.com/finish/ }\` * @since 1.9 + * @example ​ ````Click the Go button once to start the animation, and then click the other buttons to see how they affect the current and queued animations. +```html + + + + + finish demo + + + + +​ +
    +
    + +
    + + +
    + + +
    + + +
    + +
    + +
    +​ + +​ + + +``` */ finish(queue?: string): this; /** * Reduce the set of matched elements to the first in the set. - * - * @see {@link https://api.jquery.com/first/} + * @see \`{@link https://api.jquery.com/first/ }\` * @since 1.4 + * @example ​ ````Highlight the first span in a paragraph. +```html + + + + + first demo + + + + +​ +

    + Look: + This is some text in a paragraph. + This is a note about it. +

    +​ + +​ + + +``` */ first(): this; /** * Bind an event handler to the "focus" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/focus/} + * @see \`{@link https://api.jquery.com/focus/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ focus(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "focus" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/focus/} + * @see \`{@link https://api.jquery.com/focus/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Fire focus. +```html + + + + + focus demo + + + + +​ +

    focus fire

    +

    focus fire

    +​ + +​ + + +``` + * @example ​ ````To stop people from writing in text input boxes, try: +```javascript +$( "input[type=text]" ).focus(function() { + $( this ).blur(); +}); +``` + * @example ​ ````To focus on a login input box with id 'login' on page startup, try: +```javascript +$( document ).ready(function() { + $( "#login" ).focus(); +}); +``` */ - focus(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + focus(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to the "focusin" event. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/focusin/} + * @see \`{@link https://api.jquery.com/focusin/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ focusin(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "focusin" event. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/focusin/} + * @see \`{@link https://api.jquery.com/focusin/ }\` * @since 1.4 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Watch for a focus to occur within the paragraphs on the page. +```html + + + + + focusin demo + + + + +​ +

    focusin fire

    +

    focusin fire

    +​ + +​ + + +``` */ - focusin(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + focusin(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to the "focusout" JavaScript event. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/focusout/} + * @see \`{@link https://api.jquery.com/focusout/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ focusout(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "focusout" JavaScript event. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/focusout/} + * @see \`{@link https://api.jquery.com/focusout/ }\` * @since 1.4 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Watch for a loss of focus to occur inside paragraphs and note the difference between the focusout count and the blur count. (The blur count does not change because those events do not bubble.) +```html + + + + + focusout demo + + + + +​ +
    +

    +
    + +

    +

    + +

    +
    +
    focusout fire
    +
    blur fire
    +​ + +​ + + +``` */ - focusout(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + focusout(handler?: JQuery.TypeEventHandler | + false): this; /** * Retrieve one of the elements matched by the jQuery object. - * * @param index A zero-based integer indicating which element to retrieve. - * @see {@link https://api.jquery.com/get/} + * @see \`{@link https://api.jquery.com/get/ }\` * @since 1.0 + * @example ​ ````Display the tag name of the click element. +```html + + + + + get demo + + + + +​ +  +

    In this paragraph is an important section

    +
    +​ + +​ + + +``` */ get(index: number): TElement; /** * Retrieve the elements matched by the jQuery object. - * - * @see {@link https://api.jquery.com/get/} + * @see \`{@link https://api.jquery.com/get/ }\` * @since 1.0 + * @example ​ ````Select all divs in the document and return the DOM Elements as an Array; then use the built-in reverse() method to reverse that array. +```html + + + + + get demo + + + + +​ +Reversed - +​ +
    One
    +
    Two
    +
    Three
    +​ + +​ + + +``` */ get(): TElement[]; /** * Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element. - * - * @param selector A string containing a selector expression to match elements against. - * A DOM element to match elements against. - * @see {@link https://api.jquery.com/has/} + * @param selector_contained _@param_ `selector_contained` + *
    + * * `selector` — A string containing a selector expression to match elements against.
    + * * `contained` — A DOM element to match elements against. + * @see \`{@link https://api.jquery.com/has/ }\` * @since 1.4 + * @example ​ ````Check if an element is inside another. +```html + + + + + has demo + + + + +​ +
    • Does the UL contain an LI?
    +​ + +​ + + +``` */ - has(selector: string | Element): this; + has(selector_contained: string | Element): this; /** * Determine whether any of the matched elements are assigned the given class. - * * @param className The class name to search for. - * @see {@link https://api.jquery.com/hasClass/} + * @see \`{@link https://api.jquery.com/hasClass/ }\` * @since 1.2 + * @example ​ ````Looks for the paragraph that contains 'selected' as a class. +```html + + + + + hasClass demo + + + + +​ +

    This paragraph is black and is the first paragraph.

    +

    This paragraph is red and is the second paragraph.

    +
    First paragraph has selected class:
    +
    Second paragraph has selected class:
    +
    At least one paragraph has selected class:
    +​ + +​ + + +``` */ hasClass(className: string): boolean; /** * Set the CSS height of every matched element. - * - * @param value An integer representing the number of pixels, or an integer with an optional unit of measure - * appended (as a string). - * A function returning the height to set. Receives the index position of the element in the set and - * the old height as arguments. Within the function, this refers to the current element in the set. - * @see {@link https://api.jquery.com/height/} + * @param value_function _@param_ `value_function` + *
    + * * `value` — An integer representing the number of pixels, or an integer with an optional unit of measure + * appended (as a string).
    + * * `function` — A function returning the height to set. Receives the index position of the element in the set and + * the old height as arguments. Within the function, `this` refers to the current element in the set. + * @see \`{@link https://api.jquery.com/height/ }\` * @since 1.0 * @since 1.4.1 + * @example ​ ````To set the height of each div on click to 30px plus a color change. +```html + + + + + height demo + + + + +​ +
    +
    +
    +
    +
    +​ + +​ + + +``` */ - height(value: string | number | ((this: TElement, index: number, height: number) => string | number)): this; + height(value_function: string | number | ((this: TElement, index: number, height: number) => string | number)): this; /** * Get the current computed height for the first element in the set of matched elements. - * - * @see {@link https://api.jquery.com/height/} + * @see \`{@link https://api.jquery.com/height/ }\` * @since 1.0 + * @example ​ ````Show various heights. Note the values are from the iframe so might be smaller than you expected. The yellow highlight shows the iframe body. +```html + + + + + height demo + + + + +​ + + + +​ +
     
    +

    + Sample paragraph to test height +

    +​ + +​ + + +``` */ height(): number | undefined; /** * Hide the matched elements. - * * @param duration A string or number determining how long the animation will run. * @param easing A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/hide/} + * @see \`{@link https://api.jquery.com/hide/ }\` * @since 1.4.3 */ hide(duration: JQuery.Duration, easing: string, complete: (this: TElement) => void): this; /** * Hide the matched elements. - * * @param duration A string or number determining how long the animation will run. - * @param easing_complete A string indicating which easing function to use for the transition. - * A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/hide/} + * @param easing_complete _@param_ `easing_complete` + *
    + * * `easing` — A string indicating which easing function to use for the transition.
    + * * `complete` — A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/hide/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Animates all spans (words in this case) to hide fastly, completing each animation within 200 milliseconds. Once each animation is done, it starts the next one. +```html + + + + + hide demo + + + + +​ + + +
    + Once upon a + time there were + three programmers... +
    +​ + +​ + + +``` + * @example ​ ````Hides the divs when clicked over 2 seconds, then removes the div element when its hidden. Try clicking on more than one box at a time. +```html + + + + + hide demo + + + + +​ +
    +​ + +​ + + +``` */ hide(duration: JQuery.Duration, easing_complete: string | ((this: TElement) => void)): this; /** * Hide the matched elements. - * - * @param duration_complete_options A string or number determining how long the animation will run. - * A function to call once the animation is complete, called once per matched element. - * A map of additional options to pass to the method. - * @see {@link https://api.jquery.com/hide/} + * @param duration_complete_options _@param_ `duration_complete_options` + *
    + * * `duration` — A string or number determining how long the animation will run.
    + * * `complete` — A function to call once the animation is complete, called once per matched element.
    + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/hide/ }\` * @since 1.0 + * @example ​ ````Hides all paragraphs then the link on click. +```html + + + + + hide demo + + + +​ +

    Hello

    +Click to hide me too +

    Here is another paragraph

    +​ + +​ + + +``` + * @example ​ ````Animates all shown paragraphs to hide slowly, completing the animation within 600 milliseconds. +```html + + + + + hide demo + + + + +​ + +

    Hiya

    +

    Such interesting text, eh?

    +​ + +​ + + +``` */ hide(duration_complete_options?: JQuery.Duration | ((this: TElement) => void) | JQuery.EffectsOptions): this; /** - * Bind one or two handlers to the matched elements, to be executed when the mouse pointer enters and - * leaves the elements. - * - * @param handlerInOut A function to execute when the mouse pointer enters or leaves the element. + * Bind two handlers to the matched elements, to be executed when the mouse pointer enters and leaves the elements. + * @param handlerIn A function to execute when the mouse pointer enters the element. * @param handlerOut A function to execute when the mouse pointer leaves the element. - * @see {@link https://api.jquery.com/hover/} + * @see \`{@link https://api.jquery.com/hover/ }\` * @since 1.0 - * @since 1.4 + * @deprecated ​ Deprecated. + * + * **Cause**: The `.hover()` method is a shorthand for the use of the `mouseover`/`mouseout` events. It is often a poor user interface choice because it does not allow for any small amounts of delay between when the mouse enters or exits an area and when the event fires. This can make it quite difficult to use with UI widgets such as drop-down menus. For more information on the problems of hovering, see the \`{@link http://cherne.net/brian/resources/jquery.hoverIntent.html hoverIntent plugin}\`. + * + * **Solution**: Review uses of `.hover()` to determine if they are appropriate, and consider use of plugins such as `hoverIntent` as an alternative. The direct replacement for `.hover(fn1, fn2)`, is `.on("mouseenter", fn1).on("mouseleave", fn2)`. + * @example ​ ````To add a special style to list items that are being hovered over, try: +```html + + + + + hover demo + + + + +​ +
      +
    • Milk
    • +
    • Bread
    • +
    • Chips
    • +
    • Socks
    • +
    +​ + +​ + + +``` + * @example ​ ````To add a special style to table cells that are being hovered over, try: +```javascript +$( "td" ).hover( + function() { + $( this ).addClass( "hover" ); + }, function() { + $( this ).removeClass( "hover" ); + } +); +``` + * @example ​ ````To unbind the above example use: +```javascript +$( "td" ).off( "mouseenter mouseleave" ); +``` */ - // HACK: The type parameter T is not used but ensures the 'event' callback parameter is typed correctly. - hover(handlerInOut: JQuery.EventHandler | JQuery.EventHandlerBase> | false, - handlerOut?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + hover(handlerIn: JQuery.TypeEventHandler | + false, + handlerOut: JQuery.TypeEventHandler | + false): this; + /** + * Bind a single handler to the matched elements, to be executed when the mouse pointer enters or leaves the elements. + * @param handlerInOut A function to execute when the mouse pointer enters or leaves the element. + * @see \`{@link https://api.jquery.com/hover/ }\` + * @since 1.4 + * @deprecated ​ Deprecated. + * + * **Cause**: The `.hover()` method is a shorthand for the use of the `mouseover`/`mouseout` events. It is often a poor user interface choice because it does not allow for any small amounts of delay between when the mouse enters or exits an area and when the event fires. This can make it quite difficult to use with UI widgets such as drop-down menus. For more information on the problems of hovering, see the \`{@link http://cherne.net/brian/resources/jquery.hoverIntent.html hoverIntent plugin}\`. + * + * **Solution**: Review uses of `.hover()` to determine if they are appropriate, and consider use of plugins such as `hoverIntent` as an alternative. The direct replacement for `.hover(fn1, fn2)`, is `.on("mouseenter", fn1).on("mouseleave", fn2)`. + * @example ​ ````Slide the next sibling LI up or down on hover, and toggle a class. +```html + + + + + hover demo + + + + +​ +
      +
    • Milk
    • +
    • White
    • +
    • Carrots
    • +
    • Orange
    • +
    • Broccoli
    • +
    • Green
    • +
    +​ + +​ + + +``` + */ + hover(handlerInOut: JQuery.TypeEventHandler | + false): this; /** * Set the HTML contents of each element in the set of matched elements. - * - * @param htmlString A string of HTML to set as the content of each matched element. - * A function returning the HTML content to set. Receives the index position of the element in the set - * and the old HTML value as arguments. jQuery empties the element before calling the function; use the - * oldhtml argument to reference the previous content. Within the function, this refers to the current element in the set. - * @see {@link https://api.jquery.com/html/} + * @param htmlString_function _@param_ `htmlString_function` + *
    + * * `htmlString` — A string of HTML to set as the content of each matched element.
    + * * `function` — A function returning the HTML content to set. Receives the index position of the element in the set + * and the old HTML value as arguments. jQuery empties the element before calling the function; use the + * oldhtml argument to reference the previous content. Within the function, `this` refers to the current + * element in the set. + * @see \`{@link https://api.jquery.com/html/ }\` * @since 1.0 * @since 1.4 + * @example ​ ````Add some html to each div. +```html + + + + + html demo + + + + +​ +Hello +
    +
    +
    +​ + +​ + + +``` + * @example ​ ````Add some html to each div then immediately do further manipulations to the inserted html. +```html + + + + + html demo + + + + +​ +
    +
    +
    +​ + +​ + + +``` */ - html(htmlString: JQuery.htmlString | ((this: TElement, index: number, oldhtml: JQuery.htmlString) => JQuery.htmlString)): this; + html(htmlString_function: JQuery.htmlString | + JQuery.Node | + ((this: TElement, index: number, oldhtml: JQuery.htmlString) => JQuery.htmlString | JQuery.Node)): this; /** * Get the HTML contents of the first element in the set of matched elements. - * - * @see {@link https://api.jquery.com/html/} + * @see \`{@link https://api.jquery.com/html/ }\` * @since 1.0 + * @example ​ ````Click a paragraph to convert it from html to text. +```html + + + + + html demo + + + + +​ +

    + Click to change the html +

    +

    + to a text node. +

    +

    + This does nothing. +

    +​ + +​ + + +``` */ html(): string; /** * Search for a given element from among the matched elements. - * - * @param element The DOM element or first element within the jQuery object to look for. - * A selector representing a jQuery collection in which to look for an element. - * @see {@link https://api.jquery.com/index/} + * @param selector_element _@param_ `selector_element` + *
    + * * `selector` — A selector representing a jQuery collection in which to look for an element.
    + * * `element` — The DOM element or first element within the jQuery object to look for. + * @see \`{@link https://api.jquery.com/index/ }\` * @since 1.0 * @since 1.4 + * @example ​ ````On click, returns the index (zero-based) of that div in the page. +```html + + + + + index demo + + + + +​ +Click a div! +
    First div
    +
    Second div
    +
    Third div
    +​ + +​ + + +``` + * @example ​ ````Returns the index for the element with ID bar. +```html + + + + + index demo + + + + +​ +
      +
    • foo
    • +
    • bar
    • +
    • baz
    • +
    +
    +​ + +​ + + +``` + * @example ​ ````Returns the index for the first item in the jQuery collection. +```html + + + + + index demo + + + + +​ +
      +
    • foo
    • +
    • bar
    • +
    • baz
    • +
    +
    +​ + +​ + + +``` + * @example ​ ````Returns the index for the element with ID bar in relation to all <li> elements. +```html + + + + + index demo + + + + +​ +
      +
    • foo
    • +
    • bar
    • +
    • baz
    • +
    +
    +​ + +​ + + +``` + * @example ​ ````Returns the index for the element with ID bar in relation to its siblings. +```html + + + + + index demo + + + + +​ +
      +
    • foo
    • +
    • bar
    • +
    • baz
    • +
    +
    +​ + +​ + + +``` + * @example ​ ````Returns -1, as there is no element with ID foobar. +```html + + + + + index demo + + + + +​ +
      +
    • foo
    • +
    • bar
    • +
    • baz
    • +
    +
    +​ + +​ + + +``` */ - index(element?: JQuery.Selector | Element | JQuery): number; + index(selector_element?: JQuery.Selector | Element | JQuery): number; /** * Set the CSS inner height of each element in the set of matched elements. - * - * @param value A number representing the number of pixels, or a number along with an optional unit of measure - * appended (as a string). - * A function returning the inner height (including padding but not border) to set. Receives the index - * position of the element in the set and the old inner height as arguments. Within the function, this - * refers to the current element in the set. - * @see {@link https://api.jquery.com/innerHeight/} + * @param value_function _@param_ `value_function` + *
    + * * `value` — A number representing the number of pixels, or a number along with an optional unit of measure + * appended (as a string).
    + * * `function` — A function returning the inner height (including padding but not border) to set. Receives the index + * position of the element in the set and the old inner height as arguments. Within the function, `this` + * refers to the current element in the set. + * @see \`{@link https://api.jquery.com/innerHeight/ }\` * @since 1.8.0 + * @example ​ ````Change the inner height of each div the first time it is clicked (and change its color). +```html + + + + + innerHeight demo + + + + +​ +
    d
    +
    d
    +
    d
    +
    d
    +
    d
    +​ + +​ + + +``` */ - innerHeight(value: string | number | ((this: TElement, index: number, height: number) => string | number)): this; + innerHeight(value_function: string | number | ((this: TElement, index: number, height: number) => string | number)): this; /** - * Get the current computed height for the first element in the set of matched elements, including - * padding but not border. - * - * @see {@link https://api.jquery.com/innerHeight/} + * Get the current computed height for the first element in the set of matched elements, including padding but not border. + * @see \`{@link https://api.jquery.com/innerHeight/ }\` * @since 1.2.6 + * @example ​ ````Get the innerHeight of a paragraph. +```html + + + + + innerHeight demo + + + + +​ +

    Hello

    +

    +​ + +​ + + +``` */ innerHeight(): number | undefined; /** * Set the CSS inner width of each element in the set of matched elements. - * - * @param value A number representing the number of pixels, or a number along with an optional unit of measure - * appended (as a string). - * A function returning the inner width (including padding but not border) to set. Receives the index - * position of the element in the set and the old inner width as arguments. Within the function, this - * refers to the current element in the set. - * @see {@link https://api.jquery.com/innerWidth/} + * @param value_function _@param_ `value_function` + *
    + * * `value` — A number representing the number of pixels, or a number along with an optional unit of measure + * appended (as a string).
    + * * `function` — A function returning the inner width (including padding but not border) to set. Receives the index + * position of the element in the set and the old inner width as arguments. Within the function, `this` + * refers to the current element in the set. + * @see \`{@link https://api.jquery.com/innerWidth/ }\` * @since 1.8.0 + * @example ​ ````Change the inner width of each div the first time it is clicked (and change its color). +```html + + + + + innerWidth demo + + + + +​ +
    d
    +
    d
    +
    d
    +
    d
    +
    d
    +​ + +​ + + +``` */ - innerWidth(value: string | number | ((this: TElement, index: number, width: number) => string | number)): this; + innerWidth(value_function: string | number | ((this: TElement, index: number, width: number) => string | number)): this; /** - * Get the current computed inner width for the first element in the set of matched elements, including - * padding but not border. - * - * @see {@link https://api.jquery.com/innerWidth/} + * Get the current computed inner width for the first element in the set of matched elements, including padding but not border. + * @see \`{@link https://api.jquery.com/innerWidth/ }\` * @since 1.2.6 + * @example ​ ````Get the innerWidth of a paragraph. +```html + + + + + innerWidth demo + + + + +​ +

    Hello

    +

    +​ + +​ + + +``` */ innerWidth(): number | undefined; /** * Insert every element in the set of matched elements after the target. - * * @param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements * will be inserted after the element(s) specified by this parameter. - * @see {@link https://api.jquery.com/insertAfter/} + * @see \`{@link https://api.jquery.com/insertAfter/ }\` * @since 1.0 + * @example ​ ````Insert all paragraphs after an element with id of "foo". Same as $( "#foo" ).after( "p" ) +```html + + + + + insertAfter demo + + + + +​ +

    is what I said...

    +
    FOO!
    +​ + +​ + + +``` */ - insertAfter(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; + insertAfter(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; /** * Insert every element in the set of matched elements before the target. - * * @param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements * will be inserted before the element(s) specified by this parameter. - * @see {@link https://api.jquery.com/insertBefore/} + * @see \`{@link https://api.jquery.com/insertBefore/ }\` * @since 1.0 + * @example ​ ````Insert all paragraphs before an element with id of "foo". Same as $( "#foo" ).before( "p" ) +```html + + + + + insertBefore demo + + + + +​ +
    FOO!
    +

    I would like to say:

    +​ + +​ + + +``` */ - insertBefore(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; + insertBefore(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; /** - * Check the current matched set of elements against a selector, element, or jQuery object and return - * true if at least one of these elements matches the given arguments. - * - * @param selector A string containing a selector expression to match elements against. - * A function used as a test for every element in the set. It accepts two arguments, index, which is - * the element's index in the jQuery collection, and element, which is the DOM element. Within the - * function, this refers to the current DOM element. - * An existing jQuery object to match the current set of elements against. - * One or more elements to match the current set of elements against. - * @see {@link https://api.jquery.com/is/} + * Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments. + * @param selector_function_selection_elements _@param_ `selector_function_selection_elements` + *
    + * * `selector` — A string containing a selector expression to match elements against.
    + * * `function` — A function used as a test for every element in the set. It accepts two arguments, `index`, which is + * the element's index in the jQuery collection, and `element`, which is the DOM element. Within the + * function, `this` refers to the current DOM element.
    + * * `selection` — An existing jQuery object to match the current set of elements against.
    + * * `elements` — One or more elements to match the current set of elements against. + * @see \`{@link https://api.jquery.com/is/ }\` * @since 1.0 * @since 1.6 + * @example ​ ````Shows a few ways is() can be used inside an event handler. +```html + + + + + is demo + + + + +​ +
    +
    +
    +
    +

    Peter
    +
    +

     

    +​ + +​ + + +``` + * @example ​ ````Returns true, because the parent of the input is a form element. +```html + + + + + is demo + + + + +​ +
    + +
    +
    +​ + +​ + + +``` + * @example ​ ````Returns false, because the parent of the input is a p element. +```html + + + + + is demo + + + + +​ +
    +

    +
    +
    +​ + +​ + + +``` + * @example ​ ````Checks against an existing collection of alternating list elements. Blue, alternating list elements slide up while others turn red. +```html + + + + + is demo + + + + +​ +
      +
    • Chrome
    • +
    • Safari
    • +
    • Firefox
    • +
    • Opera
    • +
    +​ + +​ + + +``` + * @example ​ ````An alternate way to achieve the above example using an element rather than a jQuery object. Checks against an existing collection of alternating list elements. Blue, alternating list elements slide up while others turn red. +```html + + + + + is demo + + + + +​ +
      +
    • Chrome
    • +
    • Safari
    • +
    • Firefox
    • +
    • Opera
    • +
    +​ + +​ + + +``` */ - is(selector: JQuery.Selector | JQuery.TypeOrArray | JQuery | ((this: TElement, index: number, element: TElement) => boolean)): boolean; + is(selector_function_selection_elements: JQuery.Selector | JQuery.TypeOrArray | JQuery | ((this: TElement, index: number, element: TElement) => boolean)): boolean; /** * Bind an event handler to the "keydown" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/keydown/} + * @see \`{@link https://api.jquery.com/keydown/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ keydown(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "keydown" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/keydown/} + * @see \`{@link https://api.jquery.com/keydown/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the event object for the keydown handler when a key is pressed in the input. +```html + + + + + keydown demo + + + + +​ +
    +
    + + +
    +
    + + +​ + +​ + + +``` */ - keydown(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + keydown(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to the "keypress" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/keypress/} + * @see \`{@link https://api.jquery.com/keypress/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ keypress(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "keypress" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/keypress/} + * @see \`{@link https://api.jquery.com/keypress/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the event object when a key is pressed in the input. Note: This demo relies on a simple $.print() plugin (https://api.jquery.com/resources/events.js) for the event object's output. +```html + + + + + keypress demo + + + + +​ +
    +
    + + +
    +
    + + +​ + +​ + + +``` */ - keypress(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + keypress(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to the "keyup" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/keyup/} + * @see \`{@link https://api.jquery.com/keyup/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ keyup(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "keyup" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/keyup/} + * @see \`{@link https://api.jquery.com/keyup/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the event object for the keyup handler (using a simple $.print plugin) when a key is released in the input. +```html + + + + + keyup demo + + + + +​ +
    +
    + + +
    +
    + + +​ + +​ + + +``` */ - keyup(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + keyup(handler?: JQuery.TypeEventHandler | + false): this; /** * Reduce the set of matched elements to the final one in the set. - * - * @see {@link https://api.jquery.com/last/} + * @see \`{@link https://api.jquery.com/last/ }\` * @since 1.4 + * @example ​ ````Highlight the last span in a paragraph. +```html + + + + + last demo + + + + +​ +

    Look: This is some text in a paragraph. This is a note about it.

    +​ + +​ + + +``` */ last(): this; /** * Load data from the server and place the returned HTML into the matched element. - * * @param url A string containing the URL to which the request is sent. * @param data A plain object or string that is sent to the server with the request. * @param complete A callback function that is executed when the request completes. - * @see {@link https://api.jquery.com/load/} + * @see \`{@link https://api.jquery.com/load/ }\` * @since 1.0 + * @example ​ ````Same as above, but will POST the additional parameters to the server and a callback that is executed when the server is finished responding. +```javascript +$( "#feeds" ).load( "feeds.php", { limit: 25 }, function() { + alert( "The last 25 entries in the feed have been loaded" ); +}); +``` */ load(url: string, data: string | JQuery.PlainObject, complete: (this: TElement, responseText: string, textStatus: JQuery.Ajax.TextStatus, jqXHR: JQuery.jqXHR) => void): this; /** * Load data from the server and place the returned HTML into the matched element. - * * @param url A string containing the URL to which the request is sent. - * @param complete_data A callback function that is executed when the request completes. - * A plain object or string that is sent to the server with the request. - * @see {@link https://api.jquery.com/load/} + * @param complete_data _@param_ `complete_data` + *
    + * * `complete` — A callback function that is executed when the request completes.
    + * * `data` — A plain object or string that is sent to the server with the request. + * @see \`{@link https://api.jquery.com/load/ }\` * @since 1.0 + * @example ​ ````Load another page's list items into an ordered list. +```html + + + + + load demo + + + + +​ +Projects: +
      +​ + +​ + + +``` + * @example ​ ````Display a notice if the Ajax request encounters an error. +```html + + + + + load demo + + + + +​ +Successful Response (should be blank): +
      +Error Response: +
      +​ + +​ + + +``` + * @example ​ ````Load the feeds.html file into the div with the ID of feeds. +```javascript +$( "#feeds" ).load( "feeds.html" ); +``` + * @example ​ ````pass arrays of data to the server. +```javascript +$( "#objectID" ).load( "test.php", { "choices[]": [ "Jon", "Susan" ] } ); +``` */ load(url: string, complete_data?: ((this: TElement, responseText: string, textStatus: JQuery.Ajax.TextStatus, jqXHR: JQuery.jqXHR) => void) | string | JQuery.PlainObject): this; /** - * Pass each element in the current matched set through a function, producing a new jQuery object - * containing the return values. - * + * Pass each element in the current matched set through a function, producing a new jQuery object containing the return values. * @param callback A function object that will be invoked for each element in the current set. - * @see {@link https://api.jquery.com/map/} + * @see \`{@link https://api.jquery.com/map/ }\` * @since 1.2 + * @example ​ ````Build a list of all the values within a form. +```html + + + + + map demo + + + + +​ +

      Values:

      +
      + + + +
      +​ + +​ + + +``` + * @example ​ ````A contrived example to show some functionality. +```html + + + + + map demo + + + + +​ +
        +
      • First
      • +
      • Second
      • +
      • Third
      • +
      • Fourth
      • +
      • Fifth
      • +
      +
        +
      +​ + +​ + + +``` + * @example ​ ````Equalize the heights of the divs. +```html + + + + + map demo + + + + +​ + +
      +
      +
      +​ + +​ + + +``` */ - map(callback: (this: TElement, index: number, domElement: TElement) => any | any[] | null | undefined): this; + map(callback: (this: TElement, index: number, domElement: TElement) => JQuery.TypeOrArray | null | undefined): JQuery; /** * Bind an event handler to the "mousedown" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mousedown/} + * @see \`{@link https://api.jquery.com/mousedown/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ mousedown(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "mousedown" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mousedown/} + * @see \`{@link https://api.jquery.com/mousedown/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show texts when mouseup and mousedown event triggering. +```html + + + + + mousedown demo + + + +​ +

      Press mouse and release here.

      +​ + +​ + + +``` */ - mousedown(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + mousedown(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mouseenter/} + * @see \`{@link https://api.jquery.com/mouseenter/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ mouseenter(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mouseenter/} + * @see \`{@link https://api.jquery.com/mouseenter/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show texts when mouseenter and mouseout event triggering. + mouseover fires when the pointer moves into the child element as well, while mouseenter fires only when the pointer moves into the bound element. +```html + + + + + mouseenter demo + + + + +​ +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +​ +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +​ + +​ + + +``` */ - mouseenter(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + mouseenter(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mouseleave/} + * @see \`{@link https://api.jquery.com/mouseleave/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ mouseleave(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mouseleave/} + * @see \`{@link https://api.jquery.com/mouseleave/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show number of times mouseout and mouseleave events are triggered. mouseout fires when the pointer moves out of child element as well, while mouseleave fires only when the pointer moves out of the bound element. +```html + + + + + mouseleave demo + + + + +​ +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +​ + +​ + + +``` */ - mouseleave(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + mouseleave(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to the "mousemove" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mousemove/} + * @see \`{@link https://api.jquery.com/mousemove/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ mousemove(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "mousemove" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mousemove/} + * @see \`{@link https://api.jquery.com/mousemove/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the mouse coordinates when the mouse is moved over the yellow div. Coordinates are relative to the window, which in this case is the iframe. +```html + + + + + mousemove demo + + + + +​ +

      + Move the mouse over the div. +   +

      +
      +​ + +​ + + +``` */ - mousemove(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + mousemove(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to the "mouseout" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mouseout/} + * @see \`{@link https://api.jquery.com/mouseout/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ mouseout(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "mouseout" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mouseout/} + * @see \`{@link https://api.jquery.com/mouseout/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the number of times mouseout and mouseleave events are triggered. + mouseout fires when the pointer moves out of the child element as well, while mouseleave fires only when the pointer moves out of the bound element. +```html + + + + + mouseout demo + + + + +​ +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +​ +
      +

      move your mouse

      +

      move your mouse

      0

      +

      0

      +
      +​ + +​ + + +``` */ - mouseout(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + mouseout(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to the "mouseover" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mouseover/} + * @see \`{@link https://api.jquery.com/mouseover/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ mouseover(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "mouseover" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mouseover/} + * @see \`{@link https://api.jquery.com/mouseover/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show the number of times mouseover and mouseenter events are triggered. +mouseover fires when the pointer moves into the child element as well, while mouseenter fires only when the pointer moves into the bound element. +```html + + + + + mouseover demo + + + + +​ +
      + move your mouse +
      +
      +
      +​ +
      + move your mouse +
      +
      +
      +​ + +​ + + +``` */ - mouseover(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + mouseover(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to the "mouseup" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mouseup/} + * @see \`{@link https://api.jquery.com/mouseup/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ mouseup(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "mouseup" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/mouseup/} + * @see \`{@link https://api.jquery.com/mouseup/ }\` * @since 1.0 - */ - mouseup(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; - /** - * Get the immediately following sibling of each element in the set of matched elements. If a selector - * is provided, it retrieves the next sibling only if it matches that selector. + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````Show texts when mouseup and mousedown event triggering. +```html + + + + + mouseup demo + + + +​ +

      Press mouse and release here.

      +​ + +​ + + +``` + */ + mouseup(handler?: JQuery.TypeEventHandler | + false): this; + /** + * Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector. * @param selector A string containing a selector expression to match elements against. - * @see {@link https://api.jquery.com/next/} + * @see \`{@link https://api.jquery.com/next/ }\` * @since 1.0 + * @example ​ ````Find the very next sibling of each disabled button and change its text "this button is disabled". +```html + + + + + next demo + + + + +​ +
      -
      +
      -
      +
      -
      +​ + +​ + + +``` + * @example ​ ````Find the very next sibling of each paragraph. Keep only the ones with a class "selected". +```html + + + + + next demo + + + +​ +

      Hello

      +

      Hello Again

      +
      And Again
      +​ + +​ + + +``` */ next(selector?: JQuery.Selector): this; /** * Get all following siblings of each element in the set of matched elements, optionally filtered by a selector. - * * @param selector A string containing a selector expression to match elements against. - * @see {@link https://api.jquery.com/nextAll/} + * @see \`{@link https://api.jquery.com/nextAll/ }\` * @since 1.2 + * @example ​ ````Locate all the divs after the first and give them a class. +```html + + + + + nextAll demo + + + + +​ +
      first
      +
      sibling
      child
      +
      sibling
      +
      sibling
      ​ + +​ + + +``` + * @example ​ ````Locate all the paragraphs after the second child in the body and give them a class. +```html + + + + + nextAll demo + + + + +​ +

      p

      +
      div
      +

      p

      +

      p

      +
      div
      +

      p

      +
      div
      +​ + +​ + + +``` */ nextAll(selector?: string): this; /** - * Get all following siblings of each element up to but not including the element matched by the - * selector, DOM node, or jQuery object passed. - * - * @param selector A string containing a selector expression to indicate where to stop matching following sibling elements. - * A DOM node or jQuery object indicating where to stop matching following sibling elements. + * Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed. + * @param selector_element _@param_ `selector_element` + *
      + * * `selector` — A string containing a selector expression to indicate where to stop matching following sibling elements.
      + * * `element` — A DOM node or jQuery object indicating where to stop matching following sibling elements. * @param filter A string containing a selector expression to match elements against. - * @see {@link https://api.jquery.com/nextUntil/} + * @see \`{@link https://api.jquery.com/nextUntil/ }\` * @since 1.4 * @since 1.6 + * @example ​ ````Find the siblings that follow <dt id="term-2"> up to the next <dt> and give them a red background color. Also, find <dd> siblings that follow <dt id="term-1"> up to <dt id="term-3"> and give them a green text color. +```html + + + + + nextUntil demo + + + +​ +
      +
      term 1
      +
      definition 1-a
      +
      definition 1-b
      +
      definition 1-c
      +
      definition 1-d
      +
      term 2
      +
      definition 2-a
      +
      definition 2-b
      +
      definition 2-c
      +
      term 3
      +
      definition 3-a
      +
      definition 3-b
      +
      +​ + +​ + + +``` */ - nextUntil(selector?: JQuery.Selector | Element | JQuery, filter?: JQuery.Selector): this; + nextUntil(selector_element?: JQuery.Selector | Element | JQuery, filter?: JQuery.Selector): this; /** * Remove elements from the set of matched elements. - * - * @param selector A string containing a selector expression, a DOM element, or an array of elements to match against the set. - * A function used as a test for each element in the set. It accepts two arguments, index, which is the - * element's index in the jQuery collection, and element, which is the DOM element. Within the - * function, this refers to the current DOM element. - * An existing jQuery object to match the current set of elements against. - * @see {@link https://api.jquery.com/not/} + * @param selector_function_selection _@param_ `selector_function_selection` + *
      + * * `selector` — A string containing a selector expression, a DOM element, or an array of elements to match against the set.
      + * * `function` — A function used as a test for each element in the set. It accepts two arguments, `index`, which is + * the element's index in the jQuery collection, and `element`, which is the DOM element. Within the + * function, `this` refers to the current DOM element.
      + * * `selection` — An existing jQuery object to match the current set of elements against. + * @see \`{@link https://api.jquery.com/not/ }\` * @since 1.0 * @since 1.4 + * @example ​ ````Adds a border to divs that are not green or blue. +```html + + + + + not demo + + + + +​ +
      +
      +
      +
      +
      +
      +
      +​ + +​ + + +``` + * @example ​ ````Removes the element with the ID "selected" from the set of all paragraphs. +```javascript +$( "p" ).not( $( "#selected" )[ 0 ] ); +``` + * @example ​ ````Removes the element with the ID "selected" from the set of all paragraphs. +```javascript +$( "p" ).not( "#selected" ); +``` + * @example ​ ````Removes all elements that match "div p.selected" from the total set of all paragraphs. +```javascript +$( "p" ).not( $( "div p.selected" ) ); +``` */ - not(selector: JQuery.Selector | JQuery.TypeOrArray | JQuery | ((this: TElement, index: number, element: TElement) => boolean)): this; + not(selector_function_selection: JQuery.Selector | JQuery.TypeOrArray | JQuery | ((this: TElement, index: number, element: TElement) => boolean)): this; /** * Remove an event handler. - * * @param events One or more space-separated event types and optional namespaces, or just namespaces, such as * "click", "keydown.myPlugin", or ".myPlugin". * @param selector A selector which should match the one originally passed to .on() when attaching event handlers. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/off/} + * @see \`{@link https://api.jquery.com/off/ }\` * @since 1.7 + * @example ​ ````Add and remove event handlers on the colored button. +```html + + + + + off demo + + + + +​ + + + +
      Click!
      +​ + +​ + + +``` + * @example ​ ````Remove just one previously bound handler by passing it as the third argument: +```javascript +var foo = function() { + // Code to handle some kind of event +}; +​ +// ... Now foo will be called when paragraphs are clicked ... +$( "body" ).on( "click", "p", foo ); +​ +// ... Foo will no longer be called. +$( "body" ).off( "click", "p", foo ); +``` */ - off(events: string, selector: JQuery.Selector, handler: JQuery.EventHandlerBase> | false): this; + off( + events: TType, + selector: JQuery.Selector, + handler: JQuery.TypeEventHandler | + false + ): this; /** * Remove an event handler. - * * @param events One or more space-separated event types and optional namespaces, or just namespaces, such as * "click", "keydown.myPlugin", or ".myPlugin". - * @param selector_handler A selector which should match the one originally passed to .on() when attaching event handlers. - * A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/off/} + * @param selector_handler _@param_ `selector_handler` + *
      + * * `selector` — A selector which should match the one originally passed to `.on()` when attaching event handlers.
      + * * `handler` — A handler function previously attached for the event(s), or the special value `false`. + * @see \`{@link https://api.jquery.com/off/ }\` * @since 1.7 + * @example ​ ````Remove all delegated click handlers from all paragraphs: +```javascript +$( "p" ).off( "click", "**" ); +``` + * @example ​ ````Unbind all delegated event handlers by their namespace: +```javascript +var validate = function() { + // Code to validate form entries +}; +​ +// Delegate events under the ".validator" namespace +$( "form" ).on( "click.validator", "button", validate ); +​ +$( "form" ).on( "keypress.validator", "input[type='text']", validate ); +​ +// Remove event handlers in the ".validator" namespace +$( "form" ).off( ".validator" ); +``` */ - off(events: string, selector_handler?: JQuery.Selector | JQuery.EventHandlerBase> | false): this; + off( + events: TType, + selector_handler?: JQuery.Selector | + JQuery.TypeEventHandler | + false + ): this; /** * Remove an event handler. - * * @param events An object where the string keys represent one or more space-separated event types and optional * namespaces, and the values represent handler functions previously attached for the event(s). * @param selector A selector which should match the one originally passed to .on() when attaching event handlers. - * @see {@link https://api.jquery.com/off/} + * @see \`{@link https://api.jquery.com/off/ }\` * @since 1.7 */ - off(events: JQuery.PlainObject> | false>, selector?: JQuery.Selector): this; + off(events: JQuery.TypeEventHandlers, + selector?: JQuery.Selector): this; /** * Remove an event handler. - * * @param event A jQuery.Event object. - * @see {@link https://api.jquery.com/off/} + * @see \`{@link https://api.jquery.com/off/ }\` * @since 1.7 + * @example ​ ````Remove all event handlers from all paragraphs: +```javascript +$( "p" ).off(); +``` */ - off(event?: JQuery.Event): this; + off(event?: JQuery.TriggeredEvent): this; /** * Set the current coordinates of every element in the set of matched elements, relative to the document. - * - * @param coordinates An object containing the properties top and left, which are numbers indicating the new top and left - * coordinates for the elements. - * A function to return the coordinates to set. Receives the index of the element in the collection as - * the first argument and the current coordinates as the second argument. The function should return an - * object with the new top and left properties. - * @see {@link https://api.jquery.com/offset/} + * @param coordinates_function _@param_ `coordinates_function` + *
      + * * `coordinates` — An object containing the properties `top` and `left`, which are numbers indicating the new top and + * left coordinates for the elements.
      + * * `function` — A function to return the coordinates to set. Receives the index of the element in the collection as + * the first argument and the current coordinates as the second argument. The function should return an + * object with the new `top` and `left` properties. + * @see \`{@link https://api.jquery.com/offset/ }\` * @since 1.4 + * @example ​ ````Set the offset of the second paragraph: +```html + + + + + offset demo + + + + +​ +

      Hello

      2nd Paragraph

      +​ + +​ + + +``` */ - offset(coordinates: JQuery.Coordinates | ((this: TElement, index: number, coords: JQuery.Coordinates) => JQuery.Coordinates)): this; + offset(coordinates_function: JQuery.CoordinatesPartial | ((this: TElement, index: number, coords: JQuery.Coordinates) => JQuery.CoordinatesPartial)): this; /** * Get the current coordinates of the first element in the set of matched elements, relative to the document. - * - * @see {@link https://api.jquery.com/offset/} + * @see \`{@link https://api.jquery.com/offset/ }\` * @since 1.2 + * @example ​ ````Access the offset of the second paragraph: +```html + + + + + offset demo + + + + +​ +

      Hello

      2nd Paragraph

      +​ + +​ + + +``` + * @example ​ ````Click to see the offset. +```html + + + + + offset demo + + + + +​ +
      Click an element.
      +

      + This is the best way to find an offset. +

      +
      +
      +​ + +​ + + +``` */ offset(): JQuery.Coordinates | undefined; /** * Get the closest ancestor element that is positioned. - * - * @see {@link https://api.jquery.com/offsetParent/} + * @see \`{@link https://api.jquery.com/offsetParent/ }\` * @since 1.2.6 + * @example ​ ````Find the offsetParent of item "A." +```html + + + + + offsetParent demo + + + +​ +
        +
      • I
      • +
      • II +
          +
        • A
        • +
        • B +
            +
          • 1
          • +
          • 2
          • +
          • 3
          • +
          +
        • +
        • C
        • +
        +
      • +
      • III
      • +
      +​ + +​ + + +``` */ offsetParent(): this; /** * Attach an event handler function for one or more events to the selected elements. - * * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the * selector is null or omitted, the event is always triggered when it reaches the selected element. * @param data Data to be passed to the handler in event.data when an event is triggered. * @param handler A function to execute when the event is triggered. - * @see {@link https://api.jquery.com/on/} + * @see \`{@link https://api.jquery.com/on/ }\` * @since 1.7 */ - on(events: string, - selector: JQuery.Selector | null, - data: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; - /** - * Attach an event handler function for one or more events to the selected elements. - * - * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". - * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the - * selector is null or omitted, the event is always triggered when it reaches the selected element. - * @param handler A function to execute when the event is triggered. The value false is also allowed as a shorthand - * for a function that simply does return false. - * @see {@link https://api.jquery.com/on/} - * @since 1.7 - */ - on(events: string, - selector: JQuery.Selector, - handler: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; - /** - * Attach an event handler function for one or more events to the selected elements. - * - * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". - * @param data Data to be passed to the handler in event.data when an event is triggered. - * @param handler A function to execute when the event is triggered. - * @see {@link https://api.jquery.com/on/} - * @since 1.7 - */ - on(events: string, - data: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; - /** - * Attach an event handler function for one or more events to the selected elements. - * - * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". - * @param handler A function to execute when the event is triggered. The value false is also allowed as a shorthand - * for a function that simply does return false. - * @see {@link https://api.jquery.com/on/} - * @since 1.7 - */ - on(events: string, - handler: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; - /** - * Attach an event handler function for one or more events to the selected elements. - * - * @param events An object in which the string keys represent one or more space-separated event types and optional - * namespaces, and the values represent a handler function to be called for the event(s). - * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If - * the selector is null or omitted, the handler is always called when it reaches the selected element. - * @param data Data to be passed to the handler in event.data when an event occurs. - * @see {@link https://api.jquery.com/on/} - * @since 1.7 - */ - on(events: JQuery.PlainObject | JQuery.EventHandlerBase> | false>, - selector: JQuery.Selector | null, - data: TData): this; - /** - * Attach an event handler function for one or more events to the selected elements. - * - * @param events An object in which the string keys represent one or more space-separated event types and optional - * namespaces, and the values represent a handler function to be called for the event(s). - * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If - * the selector is null or omitted, the handler is always called when it reaches the selected element. - * @see {@link https://api.jquery.com/on/} - * @since 1.7 - */ - on(events: JQuery.PlainObject | JQuery.EventHandlerBase> | false>, - selector: JQuery.Selector): this; // tslint:disable-line:unified-signatures - /** - * Attach an event handler function for one or more events to the selected elements. - * - * @param events An object in which the string keys represent one or more space-separated event types and optional - * namespaces, and the values represent a handler function to be called for the event(s). - * @param data Data to be passed to the handler in event.data when an event occurs. - * @see {@link https://api.jquery.com/on/} - * @since 1.7 - */ - on(events: JQuery.PlainObject | JQuery.EventHandlerBase> | false>, - data: TData): this; - /** - * Attach an event handler function for one or more events to the selected elements. - * - * @param events An object in which the string keys represent one or more space-separated event types and optional - * namespaces, and the values represent a handler function to be called for the event(s). - * @see {@link https://api.jquery.com/on/} - * @since 1.7 - */ - on(events: JQuery.PlainObject | JQuery.EventHandlerBase> | false>): this; - /** - * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. - * - * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". - * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the - * selector is null or omitted, the event is always triggered when it reaches the selected element. - * @param data Data to be passed to the handler in event.data when an event is triggered. - * @param handler A function to execute when the event is triggered. - * @see {@link https://api.jquery.com/one/} - * @since 1.7 - */ - one(events: string, - selector: JQuery.Selector | null, - data: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; - /** - * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. - * - * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". - * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the - * selector is null or omitted, the event is always triggered when it reaches the selected element. - * @param handler A function to execute when the event is triggered. The value false is also allowed as a shorthand - * for a function that simply does return false. - * @see {@link https://api.jquery.com/one/} - * @since 1.7 - */ - one(events: string, + on( + events: TType, selector: JQuery.Selector, - handler: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + data: TData, + handler: JQuery.TypeEventHandler + ): this; /** - * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. - * + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + */ + on( + events: TType, + selector: null | undefined, + data: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @deprecated ​ Deprecated. Use \`{@link JQuery.Event }\` in place of \`{@link JQueryEventObject }\`. + */ + on(events: string, + selector: JQuery.Selector | null | undefined, + data: any, + handler: ((event: JQueryEventObject) => void)): this; + /** + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param handler A function to execute when the event is triggered. The value false is also allowed as a shorthand + * for a function that simply does return false. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @example ​ ````Click any paragraph to add another after it. Note that .on() allows a click event on any paragraph--even new ones--since the event is handled by the ever-present body element after it bubbles to there. +```html + + + + + on demo + + + + +​ +

      Click me!

      + +​ + +​ + + +``` + * @example ​ ````Display each paragraph's text in an alert box whenever it is clicked: +```javascript +$( "body" ).on( "click", "p", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Cancel a link's default action using the .preventDefault() method: +```javascript +$( "body" ).on( "click", "a", function( event ) { + event.preventDefault(); +}); +``` + */ + on( + events: TType, + selector: JQuery.Selector, + handler: JQuery.TypeEventHandler | + false + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". * @param data Data to be passed to the handler in event.data when an event is triggered. * @param handler A function to execute when the event is triggered. - * @see {@link https://api.jquery.com/one/} + * @see \`{@link https://api.jquery.com/on/ }\` * @since 1.7 + * @example ​ ````Pass data to the event handler, which is specified here by name: +```javascript +function myHandler( event ) { + alert( event.data.foo ); +} +$( "p" ).on( "click", { foo: "bar" }, myHandler ); +``` */ - one(events: string, - data: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + on( + events: TType, + data: TData, + handler: JQuery.TypeEventHandler + ): this; /** - * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. - * + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector_data _@param_ `selector_data` + *
      + * * `selector` — A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element.
      + * * `data` — Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @deprecated ​ Deprecated. Use \`{@link JQuery.Event }\` in place of \`{@link JQueryEventObject }\`. + * @example ​ ````Click any paragraph to add another after it. Note that .on() allows a click event on any paragraph--even new ones--since the event is handled by the ever-present body element after it bubbles to there. +```html + + + + + on demo + + + + +​ +

      Click me!

      + +​ + +​ + + +``` + * @example ​ ````Display each paragraph's text in an alert box whenever it is clicked: +```javascript +$( "body" ).on( "click", "p", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Cancel a link's default action using the .preventDefault() method: +```javascript +$( "body" ).on( "click", "a", function( event ) { + event.preventDefault(); +}); +``` + * @example ​ ````Pass data to the event handler, which is specified here by name: +```javascript +function myHandler( event ) { + alert( event.data.foo ); +} +$( "p" ).on( "click", { foo: "bar" }, myHandler ); +``` + */ + on(events: string, + selector_data: any, + handler: ((event: JQueryEventObject) => void)): this; + /** + * Attach an event handler function for one or more events to the selected elements. * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". * @param handler A function to execute when the event is triggered. The value false is also allowed as a shorthand * for a function that simply does return false. - * @see {@link https://api.jquery.com/one/} + * @see \`{@link https://api.jquery.com/on/ }\` * @since 1.7 + * @example ​ ````Display a paragraph's text in an alert when it is clicked: +```javascript +$( "p" ).on( "click", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Cancel a form submit action and prevent the event from bubbling up by returning false: +```javascript +$( "form" ).on( "submit", false ); +``` + * @example ​ ````Cancel only the default action by using .preventDefault(). +```javascript +$( "form" ).on( "submit", function( event ) { + event.preventDefault(); +}); +``` + * @example ​ ````Stop submit events from bubbling without preventing form submit, using .stopPropagation(). +```javascript +$( "form" ).on( "submit", function( event ) { + event.stopPropagation(); +}); +``` + * @example ​ ````Pass data to the event handler using the second argument to .trigger() +```javascript +$( "div" ).on( "click", function( event, person ) { + alert( "Hello, " + person.name ); +}); +$( "div" ).trigger( "click", { name: "Jim" } ); +``` + * @example ​ ````Use the the second argument of .trigger() to pass an array of data to the event handler +```javascript +$( "div" ).on( "click", function( event, salutation, name ) { + alert( salutation + ", " + name ); +}); +$( "div" ).trigger( "click", [ "Goodbye", "Jim" ] ); +``` + * @example ​ ````Attach and trigger custom (non-browser) events. +```html + + + + + on demo + + + + +​ +

      Has an attached custom event.

      + + +​ + +​ + + +``` + * @example ​ ````Attach multiple events—one on mouseenter and one on mouseleave to the same element: +```javascript +$( "#cart" ).on( "mouseenter mouseleave", function( event ) { + $( this ).toggleClass( "active" ); +}); +``` */ - one(events: string, - handler: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + on( + events: TType, + handler: JQuery.TypeEventHandler | + false + ): this; /** - * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. - * + * Attach an event handler function for one or more events to the selected elements. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @deprecated ​ Deprecated. Use \`{@link JQuery.Event }\` in place of \`{@link JQueryEventObject }\`. + * @example ​ ````Display a paragraph's text in an alert when it is clicked: +```javascript +$( "p" ).on( "click", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Cancel a form submit action and prevent the event from bubbling up by returning false: +```javascript +$( "form" ).on( "submit", false ); +``` + * @example ​ ````Cancel only the default action by using .preventDefault(). +```javascript +$( "form" ).on( "submit", function( event ) { + event.preventDefault(); +}); +``` + * @example ​ ````Stop submit events from bubbling without preventing form submit, using .stopPropagation(). +```javascript +$( "form" ).on( "submit", function( event ) { + event.stopPropagation(); +}); +``` + * @example ​ ````Pass data to the event handler using the second argument to .trigger() +```javascript +$( "div" ).on( "click", function( event, person ) { + alert( "Hello, " + person.name ); +}); +$( "div" ).trigger( "click", { name: "Jim" } ); +``` + * @example ​ ````Use the the second argument of .trigger() to pass an array of data to the event handler +```javascript +$( "div" ).on( "click", function( event, salutation, name ) { + alert( salutation + ", " + name ); +}); +$( "div" ).trigger( "click", [ "Goodbye", "Jim" ] ); +``` + * @example ​ ````Attach and trigger custom (non-browser) events. +```html + + + + + on demo + + + + +​ +

      Has an attached custom event.

      + + +​ + +​ + + +``` + * @example ​ ````Attach multiple events—one on mouseenter and one on mouseleave to the same element: +```javascript +$( "#cart" ).on( "mouseenter mouseleave", function( event ) { + $( this ).toggleClass( "active" ); +}); +``` + */ + on(events: string, + handler: ((event: JQueryEventObject) => void)): this; + /** + * Attach an event handler function for one or more events to the selected elements. * @param events An object in which the string keys represent one or more space-separated event types and optional * namespaces, and the values represent a handler function to be called for the event(s). * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If * the selector is null or omitted, the handler is always called when it reaches the selected element. * @param data Data to be passed to the handler in event.data when an event occurs. - * @see {@link https://api.jquery.com/one/} + * @see \`{@link https://api.jquery.com/on/ }\` * @since 1.7 */ - one(events: JQuery.PlainObject | JQuery.EventHandlerBase> | false>, - selector: JQuery.Selector | null, - data: TData): this; + on( + events: JQuery.TypeEventHandlers, + selector: JQuery.Selector, + data: TData + ): this; /** - * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. - * + * Attach an event handler function for one or more events to the selected elements. * @param events An object in which the string keys represent one or more space-separated event types and optional * namespaces, and the values represent a handler function to be called for the event(s). * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If * the selector is null or omitted, the handler is always called when it reaches the selected element. - * @see {@link https://api.jquery.com/one/} + * @param data Data to be passed to the handler in event.data when an event occurs. + * @see \`{@link https://api.jquery.com/on/ }\` * @since 1.7 */ - one(events: JQuery.PlainObject | JQuery.EventHandlerBase> | false>, - selector: JQuery.Selector): this; // tslint:disable-line:unified-signatures + on( + events: JQuery.TypeEventHandlers, + selector: null | undefined, + data: TData + ): this; /** - * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. - * + * Attach an event handler function for one or more events to the selected elements. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If + * the selector is null or omitted, the handler is always called when it reaches the selected element. + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + */ + on(events: JQuery.TypeEventHandlers, + selector: JQuery.Selector + ): this; + /** + * Attach an event handler function for one or more events to the selected elements. * @param events An object in which the string keys represent one or more space-separated event types and optional * namespaces, and the values represent a handler function to be called for the event(s). * @param data Data to be passed to the handler in event.data when an event occurs. - * @see {@link https://api.jquery.com/one/} + * @see \`{@link https://api.jquery.com/on/ }\` * @since 1.7 */ - one(events: JQuery.PlainObject | JQuery.EventHandlerBase> | false>, - data: TData): this; + on( + events: JQuery.TypeEventHandlers, + data: TData + ): this; /** - * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. - * + * Attach an event handler function for one or more events to the selected elements. * @param events An object in which the string keys represent one or more space-separated event types and optional * namespaces, and the values represent a handler function to be called for the event(s). - * @see {@link https://api.jquery.com/one/} + * @see \`{@link https://api.jquery.com/on/ }\` + * @since 1.7 + * @example ​ ````Attach multiple event handlers simultaneously using a plain object. +```html + + + + + on demo + + + + +​ +
      test div
      +​ + +​ + + +``` + */ + on(events: JQuery.TypeEventHandlers): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/one/ }\` * @since 1.7 */ - one(events: JQuery.PlainObject | JQuery.EventHandlerBase> | false>): this; + one( + events: TType, + selector: JQuery.Selector, + data: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: TType, + selector: null | undefined, + data: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the + * selector is null or omitted, the event is always triggered when it reaches the selected element. + * @param handler A function to execute when the event is triggered. The value false is also allowed as a shorthand + * for a function that simply does return false. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: TType, + selector: JQuery.Selector, + handler: JQuery.TypeEventHandler | + false + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param data Data to be passed to the handler in event.data when an event is triggered. + * @param handler A function to execute when the event is triggered. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: TType, + data: TData, + handler: JQuery.TypeEventHandler + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + * @param handler A function to execute when the event is triggered. The value false is also allowed as a shorthand + * for a function that simply does return false. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + * @example ​ ````Tie a one-time click to each div. +```html + + + + + one demo + + + + +​ +
      +
      +
      +
      +
      +

      Click a green square...

      +​ + +​ + + +``` + * @example ​ ````To display the text of all paragraphs in an alert box the first time each of them is clicked: +```javascript +$( "p" ).one( "click", function() { + alert( $( this ).text() ); +}); +``` + * @example ​ ````Event handlers will trigger once per element per event type +```html + + + + + one demo + + + +​ +
      0
      +
      Hover/click me
      +​ + +​ + + +``` + */ + one( + events: TType, + handler: JQuery.TypeEventHandler| + false + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If + * the selector is null or omitted, the handler is always called when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event occurs. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: JQuery.TypeEventHandlers, + selector: JQuery.Selector, + data: TData + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If + * the selector is null or omitted, the handler is always called when it reaches the selected element. + * @param data Data to be passed to the handler in event.data when an event occurs. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: JQuery.TypeEventHandlers, + selector: null | undefined, + data: TData + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param selector A selector string to filter the descendants of the selected elements that will call the handler. If + * the selector is null or omitted, the handler is always called when it reaches the selected element. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one(events: JQuery.TypeEventHandlers, + selector: JQuery.Selector): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @param data Data to be passed to the handler in event.data when an event occurs. + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one( + events: JQuery.TypeEventHandlers, + data: TData + ): this; + /** + * Attach a handler to an event for the elements. The handler is executed at most once per element per event type. + * @param events An object in which the string keys represent one or more space-separated event types and optional + * namespaces, and the values represent a handler function to be called for the event(s). + * @see \`{@link https://api.jquery.com/one/ }\` + * @since 1.7 + */ + one(events: JQuery.TypeEventHandlers): this; /** * Set the CSS outer height of each element in the set of matched elements. - * - * @param value A number representing the number of pixels, or a number along with an optional unit of measure - * appended (as a string). - * @see {@link https://api.jquery.com/outerHeight/} + * @param value_function _@param_ `value_function` + *
      + * * `value` — A number representing the number of pixels, or a number along with an optional unit of measure + * appended (as a string).
      + * * `function` — A function returning the outer height to set. Receives the index position of the element in the set + * and the old outer height as arguments. Within the function, `this` refers to the current element in + * the set. + * @see \`{@link https://api.jquery.com/outerHeight/ }\` * @since 1.8.0 + * @example ​ ````Change the outer height of each div the first time it is clicked (and change its color). +```html + + + + + outerHeight demo + + + + +​ +
      d
      +
      d
      +
      d
      +
      d
      +
      d
      +​ + +​ + + +``` */ - outerHeight(value: string | number | ((this: TElement, index: number, height: number) => string | number)): this; + outerHeight(value_function: string | number | ((this: TElement, index: number, height: number) => string | number), + includeMargin?: boolean): this; /** - * Get the current computed outer height (including padding, border, and optionally margin) for the - * first element in the set of matched elements. - * + * Get the current computed outer height (including padding, border, and optionally margin) for the first element in the set of matched elements. * @param includeMargin A Boolean indicating whether to include the element's margin in the calculation. - * @see {@link https://api.jquery.com/outerHeight/} + * @see \`{@link https://api.jquery.com/outerHeight/ }\` * @since 1.2.6 + * @example ​ ````Get the outerHeight of a paragraph. +```html + + + + + outerHeight demo + + + + +​ +

      Hello

      +​ + +​ + + +``` */ outerHeight(includeMargin?: boolean): number | undefined; /** * Set the CSS outer width of each element in the set of matched elements. - * - * @param value A number representing the number of pixels, or a number along with an optional unit of measure - * appended (as a string). - * A function returning the outer width to set. Receives the index position of the element in the set - * and the old outer width as arguments. Within the function, this refers to the current element in the set. - * @see {@link https://api.jquery.com/outerWidth/} + * @param value_function _@param_ `value_function` + *
      + * * `value` — A number representing the number of pixels, or a number along with an optional unit of measure + * appended (as a string).
      + * * `function` — A function returning the outer width to set. Receives the index position of the element in the set + * and the old outer width as arguments. Within the function, `this` refers to the current element in + * the set. + * @see \`{@link https://api.jquery.com/outerWidth/ }\` * @since 1.8.0 + * @example ​ ````Change the outer width of each div the first time it is clicked (and change its color). +```html + + + + + outerWidth demo + + + + +​ +
      d
      +
      d
      +
      d
      +
      d
      +
      d
      +​ + +​ + + +``` */ - outerWidth(value: string | number | ((this: TElement, index: number, width: number) => string | number)): this; + outerWidth(value_function: string | number | ((this: TElement, index: number, width: number) => string | number), + includeMargin?: boolean): this; /** - * Get the current computed outer width (including padding, border, and optionally margin) for the - * first element in the set of matched elements. - * + * Get the current computed outer width (including padding, border, and optionally margin) for the first element in the set of matched elements. * @param includeMargin A Boolean indicating whether to include the element's margin in the calculation. - * @see {@link https://api.jquery.com/outerWidth/} + * @see \`{@link https://api.jquery.com/outerWidth/ }\` * @since 1.2.6 + * @example ​ ````Get the outerWidth of a paragraph. +```html + + + + + outerWidth demo + + + + +​ +

      Hello

      +​ + +​ + + +``` */ outerWidth(includeMargin?: boolean): number | undefined; /** * Get the parent of each element in the current set of matched elements, optionally filtered by a selector. - * * @param selector A string containing a selector expression to match elements against. - * @see {@link https://api.jquery.com/parent/} + * @see \`{@link https://api.jquery.com/parent/ }\` * @since 1.0 + * @example ​ ````Shows the parent of each element as (parent > child). Check the View Source to see the raw html. +```html + + + + + parent demo + + + + +​ +
      div, + span, + b +
      +​ +

      p, + span, + em + +

      +​ +
      div, + strong, + span, + em, + b, + + + b +
      +​ + +​ + + +``` + * @example ​ ````Find the parent element of each paragraph with a class "selected". +```html + + + + + parent demo + + + +​ +

      Hello

      +

      Hello Again

      +​ + +​ + + +``` */ parent(selector?: JQuery.Selector): this; /** * Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector. - * * @param selector A string containing a selector expression to match elements against. - * @see {@link https://api.jquery.com/parents/} + * @see \`{@link https://api.jquery.com/parents/ }\` * @since 1.0 + * @example ​ ````Find all parent elements of each b. +```html + + + + + parents demo + + + + +​ +
      +

      + + My parents are: + +

      +
      +​ + +​ + + +``` + * @example ​ ````Click to find all unique div parent elements of each span. +```html + + + + + parents demo + + + + +​ +

      +

      +
      Hello
      + Hello Again +
      +
      + And Hello Again +
      +

      + Click Hellos to toggle their parents. +​ + +​ + + +``` */ parents(selector?: JQuery.Selector): this; /** - * Get the ancestors of each element in the current set of matched elements, up to but not including - * the element matched by the selector, DOM node, or jQuery object. - * - * @param selector A string containing a selector expression to indicate where to stop matching ancestor elements. - * A DOM node or jQuery object indicating where to stop matching ancestor elements. + * Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object. + * @param selector_element _@param_ `selector_element` + *
      + * * `selector` — A string containing a selector expression to indicate where to stop matching ancestor elements.
      + * * `element` — A DOM node or jQuery object indicating where to stop matching ancestor elements. * @param filter A string containing a selector expression to match elements against. - * @see {@link https://api.jquery.com/parentsUntil/} + * @see \`{@link https://api.jquery.com/parentsUntil/ }\` * @since 1.4 * @since 1.6 + * @example ​ ````Find the ancestors of <li class="item-a"> up to <ul class="level-1"> and give them a red background color. Also, find ancestors of <li class="item-2"> that have a class of "yes" up to <ul class="level-1"> and give them a green border. +```html + + + + + parentsUntil demo + + + +​ +
        +
      • I
      • +
      • II +
          +
        • A
        • +
        • B +
            +
          • 1
          • +
          • 2
          • +
          • 3
          • +
          +
        • +
        • C
        • +
        +
      • +
      • III
      • +
      +​ + +​ + + +``` */ - parentsUntil(selector?: JQuery.Selector | Element | JQuery, filter?: JQuery.Selector): this; + parentsUntil(selector_element?: JQuery.Selector | Element | JQuery, filter?: JQuery.Selector): this; /** * Get the current coordinates of the first element in the set of matched elements, relative to the offset parent. - * - * @see {@link https://api.jquery.com/position/} + * @see \`{@link https://api.jquery.com/position/ }\` * @since 1.2 + * @example ​ ````Access the position of the second paragraph: +```html + + + + + position demo + + + + +​ +
      +

      Hello

      +
      +

      +​ + +​ + + +``` */ position(): JQuery.Coordinates; /** * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements. - * * @param contents One or more additional DOM elements, text nodes, arrays of elements and text nodes, HTML strings, or * jQuery objects to insert at the beginning of each element in the set of matched elements. - * @see {@link https://api.jquery.com/prepend/} + * @see \`{@link https://api.jquery.com/prepend/ }\` * @since 1.0 + * @example ​ ````Prepends some HTML to all paragraphs. +```html + + + + + prepend demo + + + + +​ +

      there, friend!

      +

      amigo!

      +​ + +​ + + +``` + * @example ​ ````Prepends a DOM Element to all paragraphs. +```html + + + + + prepend demo + + + + +​ +

      is what I'd say

      +

      is what I said

      +​ + +​ + + +``` + * @example ​ ````Prepends a jQuery object (similar to an Array of DOM Elements) to all paragraphs. +```html + + + + + prepend demo + + + + +​ +

      is what was said.

      Hello +​ + +​ + + +``` */ prepend(...contents: Array>>): this; /** * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements. - * - * @param fn A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert at - * the beginning of each element in the set of matched elements. Receives the index position of the - * element in the set and the old HTML value of the element as arguments. Within the function, this - * refers to the current element in the set. - * @see {@link https://api.jquery.com/prepend/} + * @param funсtion A function that returns an HTML string, DOM element(s), text node(s), or jQuery object to insert at + * the beginning of each element in the set of matched elements. Receives the index position of the + * element in the set and the old HTML value of the element as arguments. Within the function, `this` + * refers to the current element in the set. + * @see \`{@link https://api.jquery.com/prepend/ }\` * @since 1.4 */ - prepend(fn: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; + prepend(funсtion: (this: TElement, index: number, html: string) => JQuery.htmlString | JQuery.TypeOrArray>): this; /** * Insert every element in the set of matched elements to the beginning of the target. - * * @param target A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements * will be inserted at the beginning of the element(s) specified by this parameter. - * @see {@link https://api.jquery.com/prependTo/} + * @see \`{@link https://api.jquery.com/prependTo/ }\` * @since 1.0 + * @example ​ ````Prepend all spans to the element with the ID "foo" (Check .prepend() documentation for more examples) +```html + + + + + prependTo demo + + + + +​ +
      FOO!
      +I have something to say... +​ + +​ + + +``` */ - prependTo(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; + prependTo(target: JQuery.Selector | JQuery.htmlString | JQuery.TypeOrArray | JQuery): this; /** - * Get the immediately preceding sibling of each element in the set of matched elements. If a selector - * is provided, it retrieves the previous sibling only if it matches that selector. - * + * Get the immediately preceding sibling of each element in the set of matched elements. If a selector is provided, it retrieves the previous sibling only if it matches that selector. * @param selector A string containing a selector expression to match elements against. - * @see {@link https://api.jquery.com/prev/} + * @see \`{@link https://api.jquery.com/prev/ }\` * @since 1.0 + * @example ​ ````Find the very previous sibling of each div. +```html + + + + + prev demo + + + + +​ +
      +
      +
      has child
      +
      +
      +
      +
      +
      +

      +​ + +​ + + +``` + * @example ​ ````For each paragraph, find the very previous sibling that has a class "selected". +```html + + + + + prev demo + + + +​ +
      Hello
      +

      Hello Again

      +

      And Again

      +​ + +​ + + +``` */ prev(selector?: JQuery.Selector): this; /** * Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector. - * * @param selector A string containing a selector expression to match elements against. - * @see {@link https://api.jquery.com/prevAll/} + * @see \`{@link https://api.jquery.com/prevAll/ }\` * @since 1.2 + * @example ​ ````Locate all the divs preceding the last div and give them a class. +```html + + + + + prevAll demo + + + + +​ +
      +
      +
      +
      +​ + +​ + + +``` */ prevAll(selector?: JQuery.Selector): this; /** - * Get all preceding siblings of each element up to but not including the element matched by the - * selector, DOM node, or jQuery object. - * - * @param selector A string containing a selector expression to indicate where to stop matching preceding sibling elements. - * A DOM node or jQuery object indicating where to stop matching preceding sibling elements. + * Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object. + * @param selector_element _@param_ `selector_element` + *
      + * * `selector` — A string containing a selector expression to indicate where to stop matching preceding sibling elements.
      + * * `element` — A DOM node or jQuery object indicating where to stop matching preceding sibling elements. * @param filter A string containing a selector expression to match elements against. - * @see {@link https://api.jquery.com/prevUntil/} + * @see \`{@link https://api.jquery.com/prevUntil/ }\` * @since 1.4 * @since 1.6 + * @example ​ ````Find the siblings that precede <dt id="term-2"> up to the preceding <dt> and give them a red background color. Also, find previous <dd> siblings of <dt id="term-3"> up to <dt id="term-1"> and give them a green text color. +```html + + + + + prevUntil demo + + + +​ +
      +
      term 1
      +
      definition 1-a
      +
      definition 1-b
      +
      definition 1-c
      +
      definition 1-d
      +​ +
      term 2
      +
      definition 2-a
      +
      definition 2-b
      +
      definition 2-c
      +​ +
      term 3
      +
      definition 3-a
      +
      definition 3-b
      +
      +​ + +​ + + +``` */ - prevUntil(selector?: JQuery.Selector | Element | JQuery, filter?: JQuery.Selector): this; + prevUntil(selector_element?: JQuery.Selector | Element | JQuery, filter?: JQuery.Selector): this; /** - * Return a Promise object to observe when all actions of a certain type bound to the collection, - * queued or not, have finished. - * + * Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished. * @param type The type of queue that needs to be observed. * @param target Object onto which the promise methods have to be attached - * @see {@link https://api.jquery.com/promise/} + * @see \`{@link https://api.jquery.com/promise/ }\` * @since 1.6 */ promise(type: string, target: T): T & JQuery.Promise; /** - * Return a Promise object to observe when all actions of a certain type bound to the collection, - * queued or not, have finished. - * + * Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished. * @param target Object onto which the promise methods have to be attached - * @see {@link https://api.jquery.com/promise/} + * @see \`{@link https://api.jquery.com/promise/ }\` * @since 1.6 */ promise(target: T): T & JQuery.Promise; /** - * Return a Promise object to observe when all actions of a certain type bound to the collection, - * queued or not, have finished. - * + * Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished. * @param type The type of queue that needs to be observed. - * @see {@link https://api.jquery.com/promise/} + * @see \`{@link https://api.jquery.com/promise/ }\` * @since 1.6 + * @example ​ ````Using .promise() on a collection with no active animation returns a resolved Promise: +```javascript +var div = $( "
      " ); +​ +div.promise().done(function( arg1 ) { + // Will fire right away and alert "true" + alert( this === div && arg1 === div ); +}); +``` + * @example ​ ````Resolve the returned Promise when all animations have ended (including those initiated in the animation callback or added later on): +```html + + + + + promise demo + + + + +​ + +

      Ready...

      +
      +
      +
      +
      +​ + +​ + + +``` + * @example ​ ````Resolve the returned Promise using a $.when() statement (the .promise() method makes it possible to do this with jQuery collections): +```html + + + + + promise demo + + + + +​ + +

      Ready...

      +
      +
      +
      +
      +​ + +​ + + +``` */ promise(type?: string): JQuery.Promise; /** * Set one or more properties for the set of matched elements. - * * @param propertyName The name of the property to set. - * @param value A function returning the value to set. Receives the index position of the element in the set and the - * old property value as arguments. Within the function, the keyword this refers to the current element. - * @see {@link https://api.jquery.com/prop/} + * @param value_function _@param_ `value_function` + *
      + * * `value` — A value to set for the property.
      + * * `function` — A function returning the value to set. Receives the index position of the element in the set and the + * old property value as arguments. Within the function, the keyword `this` refers to the current element. + * @see \`{@link https://api.jquery.com/prop/ }\` * @since 1.6 */ - prop(propertyName: string, value: (this: TElement, index: number, oldPropertyValue: any) => any): this; + prop(propertyName: string, + value_function: string | number | boolean | symbol | object | null | undefined | ((this: TElement, index: number, oldPropertyValue: any) => any)): this; /** * Set one or more properties for the set of matched elements. - * - * @param propertyName The name of the property to set. - * @param value A value to set for the property. - * @see {@link https://api.jquery.com/prop/} - * @since 1.6 - */ - prop(propertyName: string, value: any): this; // tslint:disable-line:unified-signatures - /** - * Set one or more properties for the set of matched elements. - * * @param properties An object of property-value pairs to set. - * @see {@link https://api.jquery.com/prop/} + * @see \`{@link https://api.jquery.com/prop/ }\` * @since 1.6 + * @example ​ ````Disable all checkboxes on the page. +```html + + + + + prop demo + + + + +​ + + + + +​ + +​ + + +``` */ prop(properties: JQuery.PlainObject): this; /** * Get the value of a property for the first element in the set of matched elements. - * * @param propertyName The name of the property to get. - * @see {@link https://api.jquery.com/prop/} + * @see \`{@link https://api.jquery.com/prop/ }\` * @since 1.6 + * @example ​ ````Display the checked property and attribute of a checkbox as it changes. +```html + + + + + prop demo + + + + +​ + + +

      +​ + +​ + + +``` */ - prop(propertyName: string): any | undefined; + prop(propertyName: string): any; /** * Add a collection of DOM elements onto the jQuery stack. - * * @param elements An array of elements to push onto the stack and make into a new jQuery object. * @param name The name of a jQuery method that generated the array of elements. * @param args The arguments that were passed in to the jQuery method (for serialization). - * @see {@link https://api.jquery.com/pushStack/} + * @see \`{@link https://api.jquery.com/pushStack/ }\` * @since 1.3 */ pushStack(elements: ArrayLike, name: string, args: any[]): this; /** * Add a collection of DOM elements onto the jQuery stack. - * * @param elements An array of elements to push onto the stack and make into a new jQuery object. - * @see {@link https://api.jquery.com/pushStack/} + * @see \`{@link https://api.jquery.com/pushStack/ }\` * @since 1.0 + * @example ​ ````Add some elements onto the jQuery stack, then pop back off again. +```javascript +jQuery([]) + .pushStack( document.getElementsByTagName( "div" ) ) + .remove() + .end(); +``` */ pushStack(elements: ArrayLike): this; /** * Manipulate the queue of functions to be executed, once for each matched element. - * * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. * @param newQueue The new function to add to the queue, with a function to call that will dequeue the next item. * An array of functions to replace the current queue contents. - * @see {@link https://api.jquery.com/queue/} + * @see \`{@link https://api.jquery.com/queue/ }\` * @since 1.2 + * @example ​ ````Set a queue array to delete the queue. +```html + + + + + queue demo + + + + +​ + + +
      +​ + +​ + + +``` */ queue(queueName: string, newQueue: JQuery.TypeOrArray>): this; /** * Manipulate the queue of functions to be executed, once for each matched element. - * * @param newQueue The new function to add to the queue, with a function to call that will dequeue the next item. * An array of functions to replace the current queue contents. - * @see {@link https://api.jquery.com/queue/} + * @see \`{@link https://api.jquery.com/queue/ }\` * @since 1.2 + * @example ​ ````Queue a custom function. +```html + + + + + queue demo + + + + +​ +Click here... +
      +​ + +​ + + +``` */ queue(newQueue: JQuery.TypeOrArray>): this; /** * Show the queue of functions to be executed on the matched elements. - * * @param queueName A string containing the name of the queue. Defaults to fx, the standard effects queue. - * @see {@link https://api.jquery.com/queue/} + * @see \`{@link https://api.jquery.com/queue/ }\` * @since 1.2 + * @example ​ ````Show the length of the queue. +```html + + + + + queue demo + + + + +​ +

      The queue length is:

      +
      +​ + +​ + + +``` */ queue(queueName?: string): JQuery.Queue; /** * Specify a function to execute when the DOM is fully loaded. - * * @param handler A function to execute after the DOM is ready. - * @see {@link https://api.jquery.com/ready/} + * @see \`{@link https://api.jquery.com/ready/ }\` * @since 1.0 - * @deprecated 3.0 + * @deprecated ​ Deprecated since 3.0. Use `jQuery(function() { })`. + * @example ​ ````Display a message when the DOM is loaded. +```html + + + + + ready demo + + + + + +​ +

      Not loaded yet.

      +​ + + +``` */ - ready(handler: ($: JQueryStatic) => void): this; + ready(handler: ($: JQueryStatic) => void): this; /** * Remove the set of matched elements from the DOM. - * * @param selector A selector expression that filters the set of matched elements to be removed. - * @see {@link https://api.jquery.com/remove/} + * @see \`{@link https://api.jquery.com/remove/ }\` * @since 1.0 + * @example ​ ````Removes all paragraphs from the DOM +```html + + + + + remove demo + + + + +​ +

      Hello

      +how are +

      you?

      + +​ + +​ + + +``` + * @example ​ ````Removes all paragraphs that contain "Hello" from the DOM. Analogous to doing $("p").filter(":contains('Hello')").remove(). +```html + + + + + remove demo + + + + +​ +

      Hello

      +how are +

      you?

      + +​ + +​ + + +``` */ remove(selector?: string): this; /** * Remove an attribute from each element in the set of matched elements. - * * @param attributeName An attribute to remove; as of version 1.7, it can be a space-separated list of attributes. - * @see {@link https://api.jquery.com/removeAttr/} + * @see \`{@link https://api.jquery.com/removeAttr/ }\` * @since 1.0 + * @example ​ ````Clicking the button changes the title of the input next to it. Move the mouse pointer over the text input to see the effect of adding and removing the title attribute. +```html + + + + + removeAttr demo + + + +​ + + +
      +​ + +​ + + +``` */ removeAttr(attributeName: string): this; /** * Remove a single class, multiple classes, or all classes from each element in the set of matched elements. - * - * @param className One or more space-separated classes to be removed from the class attribute of each matched element. - * A function returning one or more space-separated class names to be removed. Receives the index - * position of the element in the set and the old class value as arguments. - * @see {@link https://api.jquery.com/removeClass/} + * @param className_function _@param_ `className_function` + *
      + * * `className` — One or more space-separated classes to be removed from the class attribute of each matched element.
      + * * `function` — A function returning one or more space-separated class names to be removed. Receives the index + * position of the element in the set and the old class value as arguments. + * @see \`{@link https://api.jquery.com/removeClass/ }\` * @since 1.0 * @since 1.4 + * @since 3.3 + * @example ​ ````Remove the class 'blue' from the matched elements. +```html + + + + + removeClass demo + + + + +​ +

      Hello

      +

      and

      +

      then

      +

      Goodbye

      +​ + +​ + + +``` + * @example ​ ````Remove the class 'blue' and 'under' from the matched elements. +```html + + + + + removeClass demo + + + + +​ +

      Hello

      +

      and

      +

      then

      +

      Goodbye

      +​ + +​ + + +``` + * @example ​ ````Remove all the classes from the matched elements. +```html + + + + + removeClass demo + + + + +​ +

      Hello

      +

      and

      +

      then

      +

      Goodbye

      +​ + +​ + + +``` */ - removeClass(className?: string | ((this: TElement, index: number, className: string) => string)): this; + removeClass(className_function?: JQuery.TypeOrArray | ((this: TElement, index: number, className: string) => string)): this; /** * Remove a previously-stored piece of data. - * * @param name A string naming the piece of data to delete. * An array or space-separated string naming the pieces of data to delete. - * @see {@link https://api.jquery.com/removeData/} + * @see \`{@link https://api.jquery.com/removeData/ }\` * @since 1.2.3 * @since 1.7 + * @example ​ ````Set a data store for 2 names then remove one of them. +```html + + + + + removeData demo + + + + +​ +
      value1 before creation:
      +
      value1 after creation:
      +
      value1 after removal:
      +
      value2 after removal:
      +​ + +​ + + +``` */ removeData(name?: JQuery.TypeOrArray): this; /** * Remove a property for the set of matched elements. - * * @param propertyName The name of the property to remove. - * @see {@link https://api.jquery.com/removeProp/} + * @see \`{@link https://api.jquery.com/removeProp/ }\` * @since 1.6 + * @example ​ ````Set a numeric property on a paragraph and then remove it. +```html + + + + + removeProp demo + + + + +​ +

      +​ + +​ + + +``` */ removeProp(propertyName: string): this; /** * Replace each target element with the set of matched elements. - * * @param target A selector string, jQuery object, DOM element, or array of elements indicating which element(s) to replace. - * @see {@link https://api.jquery.com/replaceAll/} + * @see \`{@link https://api.jquery.com/replaceAll/ }\` * @since 1.2 + * @example ​ ````Replace all the paragraphs with bold words. +```html + + + + + replaceAll demo + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` */ replaceAll(target: JQuery.Selector | JQuery | JQuery.TypeOrArray): this; /** - * Replace each element in the set of matched elements with the provided new content and return the set - * of elements that was removed. - * - * @param newContent The content to insert. May be an HTML string, DOM element, array of DOM elements, or jQuery object. - * A function that returns content with which to replace the set of matched elements. - * @see {@link https://api.jquery.com/replaceWith/} + * Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed. + * @param newContent_function _@param_ `newContent_function` + *
      + * * `newContent` — The content to insert. May be an HTML string, DOM element, array of DOM elements, or jQuery object.
      + * * `function` — A function that returns content with which to replace the set of matched elements. + * @see \`{@link https://api.jquery.com/replaceWith/ }\` * @since 1.2 * @since 1.4 + * @example ​ ````On click, replace the button with a div containing the same word. +```html + + + + + replaceWith demo + + + + +​ + + + +​ + +​ + + +``` + * @example ​ ````Replace all paragraphs with bold words. +```html + + + + + replaceWith demo + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````On click, replace each paragraph with a div that is already in the DOM and selected with the $() function. Notice it doesn't clone the object but rather moves it to replace the paragraph. +```html + + + + + replaceWith demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +
      Replaced!
      +​ + +​ + + +``` + * @example ​ ````On button click, replace the containing div with its child divs and append the class name of the selected element to the paragraph. +```html + + + + + replaceWith demo + + + + +​ +

      + +

      +
      +
      Scooby
      +
      Dooby
      +
      Doo
      +
      +​ + +​ + + +``` */ - replaceWith(newContent: JQuery.htmlString | JQuery | JQuery.TypeOrArray | ((this: TElement) => any)): this; + replaceWith(newContent_function: JQuery.htmlString | + JQuery | + JQuery.TypeOrArray | + JQuery.Node | + ((this: TElement, index: number, oldhtml: JQuery.htmlString) => JQuery.htmlString | + JQuery | + JQuery.TypeOrArray | + JQuery.Node)): this; /** * Bind an event handler to the "resize" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/resize/} + * @see \`{@link https://api.jquery.com/resize/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ resize(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "resize" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/resize/} + * @see \`{@link https://api.jquery.com/resize/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To see the window width while (or after) it is resized, try: +```javascript +$( window ).resize(function() { + $( "body" ).prepend( "
      " + $( window ).width() + "
      " ); +}); +``` */ - resize(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + resize(handler?: JQuery.TypeEventHandler | + false): this; /** * Bind an event handler to the "scroll" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/scroll/} + * @see \`{@link https://api.jquery.com/scroll/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ scroll(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "scroll" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/scroll/} + * @see \`{@link https://api.jquery.com/scroll/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To do something when your page is scrolled: +```html + + + + + scroll demo + + + + +​ +
      Try scrolling the iframe.
      +

      Paragraph - Scroll happened!

      +​ + +​ + + +``` */ - scroll(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + scroll(handler?: JQuery.TypeEventHandler | + false): this; /** * Set the current horizontal position of the scroll bar for each of the set of matched elements. - * * @param value An integer indicating the new position to set the scroll bar to. - * @see {@link https://api.jquery.com/scrollLeft/} + * @see \`{@link https://api.jquery.com/scrollLeft/ }\` * @since 1.2.6 + * @example ​ ````Set the scrollLeft of a div. +```html + + + + + scrollLeft demo + + + + +​ +

      lalala

      Hello

      +​ + +​ + + +``` */ scrollLeft(value: number): this; /** * Get the current horizontal position of the scroll bar for the first element in the set of matched elements. - * - * @see {@link https://api.jquery.com/scrollLeft/} + * @see \`{@link https://api.jquery.com/scrollLeft/ }\` * @since 1.2.6 + * @example ​ ````Get the scrollLeft of a paragraph. +```html + + + + + scrollLeft demo + + + + +​ +

      Hello

      +​ + +​ + + +``` */ scrollLeft(): number | undefined; /** * Set the current vertical position of the scroll bar for each of the set of matched elements. - * * @param value A number indicating the new position to set the scroll bar to. - * @see {@link https://api.jquery.com/scrollTop/} + * @see \`{@link https://api.jquery.com/scrollTop/ }\` * @since 1.2.6 + * @example ​ ````Set the scrollTop of a div. +```html + + + + + scrollTop demo + + + + +​ +

      lalala

      Hello

      +​ + +​ + + +``` */ scrollTop(value: number): this; /** - * Get the current vertical position of the scroll bar for the first element in the set of matched - * elements or set the vertical position of the scroll bar for every matched element. - * - * @see {@link https://api.jquery.com/scrollTop/} + * Get the current vertical position of the scroll bar for the first element in the set of matched elements or set the vertical position of the scroll bar for every matched element. + * @see \`{@link https://api.jquery.com/scrollTop/ }\` * @since 1.2.6 + * @example ​ ````Get the scrollTop of a paragraph. +```html + + + + + scrollTop demo + + + + +​ +

      Hello

      +​ + +​ + + +``` */ scrollTop(): number | undefined; /** * Bind an event handler to the "select" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/select/} + * @see \`{@link https://api.jquery.com/select/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ select(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "select" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/select/} + * @see \`{@link https://api.jquery.com/select/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````To do something when text in input boxes is selected: +```html + + + + + select demo + + + + +​ +

      Click and drag the mouse to select text in the inputs.

      + + +
      + ​ + +​ + + +``` + * @example ​ ````To trigger the select event on all input elements, try: +```javascript +$( "input" ).select(); +``` */ - select(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + select(handler?: JQuery.TypeEventHandler | + false): this; /** * Encode a set of form elements as a string for submission. - * - * @see {@link https://api.jquery.com/serialize/} + * @see \`{@link https://api.jquery.com/serialize/ }\` * @since 1.0 + * @example ​ ````Serialize a form to a query string that could be sent to a server in an Ajax request. +```html + + + + + serialize demo + + + + +​ +
      + +​ +
      + +​ +
      + + + + +​ +
      + + + + +
      +​ +

      +​ + +​ + + +``` */ serialize(): string; /** * Encode a set of form elements as an array of names and values. - * - * @see {@link https://api.jquery.com/serializeArray/} + * @see \`{@link https://api.jquery.com/serializeArray/ }\` * @since 1.2 + * @example ​ ````Get the values from a form, iterate through them, and append them to a results display. +```html + + + + + serializeArray demo + + + + +​ +

      Results:

      +
      + + +
      + + + + + + + + +
      +​ + +​ + + +``` */ serializeArray(): JQuery.NameValuePair[]; /** * Display the matched elements. - * * @param duration A string or number determining how long the animation will run. * @param easing A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/show/} + * @see \`{@link https://api.jquery.com/show/ }\` * @since 1.4.3 */ show(duration: JQuery.Duration, easing: string, complete: (this: TElement) => void): this; /** * Display the matched elements. - * * @param duration A string or number determining how long the animation will run. - * @param easing_complete A string indicating which easing function to use for the transition. - * A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/show/} + * @param easing_complete _@param_ `easing_complete` + *
      + * * `easing` — A string indicating which easing function to use for the transition.
      + * * `complete` — A function to call once the animation is complete, called once per matched element. + * @see \`{@link https://api.jquery.com/show/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Show the first div, followed by each next adjacent sibling div in order, with a 200ms animation. Each animation starts when the previous sibling div's animation ends. +```html + + + + + show demo + + + + +​ + + +
      Hello 3,
      +
      how
      +
      are
      +
      you?
      +​ + +​ + + +``` + * @example ​ ````Show all span and input elements with an animation. Change the text once the animation is done. +```html + + + + + show demo + + + + +​ + +Are you sure? (type 'yes' if you are) +
      +
      + +
      +
      +

      I'm hidden...

      +​ + +​ + + +``` */ show(duration: JQuery.Duration, easing_complete: string | ((this: TElement) => void)): this; /** * Display the matched elements. - * - * @param duration_complete_options A string or number determining how long the animation will run. - * A function to call once the animation is complete, called once per matched element. - * A map of additional options to pass to the method. - * @see {@link https://api.jquery.com/show/} + * @param duration_complete_options _@param_ `duration_complete_options` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `complete` — A function to call once the animation is complete, called once per matched element.
      + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/show/ }\` * @since 1.0 + * @example ​ ````Animates all hidden paragraphs to show slowly, completing the animation within 600 milliseconds. +```html + + + + + show demo + + + + +​ + +

      Hello 2

      +​ + +​ + + +``` */ show(duration_complete_options?: JQuery.Duration | ((this: TElement) => void) | JQuery.EffectsOptions): this; /** * Get the siblings of each element in the set of matched elements, optionally filtered by a selector. - * * @param selector A string containing a selector expression to match elements against. - * @see {@link https://api.jquery.com/siblings/} + * @see \`{@link https://api.jquery.com/siblings/ }\` * @since 1.0 + * @example ​ ````Find the unique siblings of all yellow li elements in the 3 lists (including other yellow li elements if appropriate). +```html + + + + + siblings demo + + + + +​ +
        +
      • One
      • +
      • Two
      • +
      • Three
      • +
      • Four
      • +
      +​ +
        +
      • Five
      • +
      • Six
      • +
      • Seven
      • +
      +​ +
        +
      • Eight
      • +
      • Nine
      • +
      • Ten
      • +
      • Eleven
      • +
      +​ +

      Unique siblings:

      +​ + +​ + + +``` + * @example ​ ````Find all siblings with a class "selected" of each div. +```html + + + + + siblings demo + + + +​ +
      Hello
      +

      Hello Again

      +

      And Again

      +​ + +​ + + +``` */ siblings(selector?: JQuery.Selector): this; /** * Reduce the set of matched elements to a subset specified by a range of indices. - * * @param start An integer indicating the 0-based position at which the elements begin to be selected. If negative, * it indicates an offset from the end of the set. * @param end An integer indicating the 0-based position at which the elements stop being selected. If negative, * it indicates an offset from the end of the set. If omitted, the range continues until the end of the set. - * @see {@link https://api.jquery.com/slice/} + * @see \`{@link https://api.jquery.com/slice/ }\` * @since 1.1.4 + * @example ​ ````Turns divs yellow based on a random slice. +```html + + + + + slice demo + + + + +​ +

      + Click the button!

      +
      +
      +
      +
      +
      +
      +
      +
      +
      + ​ + +​ + + +``` + * @example ​ ````Selects all paragraphs, then slices the selection to include only the first element. +```javascript +$( "p" ).slice( 0, 1 ).wrapInner( "" ); +``` + * @example ​ ````Selects all paragraphs, then slices the selection to include only the first and second element. +```javascript +$( "p" ).slice( 0, 2 ).wrapInner( "" ); +``` + * @example ​ ````Selects all paragraphs, then slices the selection to include only the second element. +```javascript +$( "p" ).slice( 1, 2 ).wrapInner( "" ); +``` + * @example ​ ````Selects all paragraphs, then slices the selection to include only the second and third element. +```javascript +$( "p" ).slice( 1 ).wrapInner( "" ); +``` + * @example ​ ````Selects all paragraphs, then slices the selection to include only the third element. +```javascript +$( "p" ).slice( -1 ).wrapInner( "" ); +``` */ slice(start: number, end?: number): this; /** * Display the matched elements with a sliding motion. - * * @param duration A string or number determining how long the animation will run. * @param easing A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/slideDown/} + * @see \`{@link https://api.jquery.com/slideDown/ }\` * @since 1.4.3 */ slideDown(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; /** * Display the matched elements with a sliding motion. - * - * @param duration_easing A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. + * @param duration_easing _@param_ `duration_easing` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/slideDown/} + * @see \`{@link https://api.jquery.com/slideDown/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Animates all inputs to slide down, completing the animation within 1000 milliseconds. Once the animation is done, the input look is changed especially if it is the middle input which gets the focus. +```html + + + + + slideDown demo + + + + +​ +
      Push!
      + + + + ​ + +​ + + +``` */ slideDown(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; /** * Display the matched elements with a sliding motion. - * - * @param duration_easing_complete_options A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. - * A function to call once the animation is complete, called once per matched element. - * A map of additional options to pass to the method. - * @see {@link https://api.jquery.com/slideDown/} + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition.
      + * * `complete` — A function to call once the animation is complete, called once per matched element.
      + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/slideDown/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Animates all divs to slide down and show themselves over 600 milliseconds. +```html + + + + + slideDown demo + + + + +​ +Click me! +
      +
      +
      +​ + +​ + + +``` */ slideDown(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; /** * Display or hide the matched elements with a sliding motion. - * * @param duration A string or number determining how long the animation will run. * @param easing A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/slideToggle/} + * @see \`{@link https://api.jquery.com/slideToggle/ }\` * @since 1.4.3 */ slideToggle(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; /** * Display or hide the matched elements with a sliding motion. - * - * @param duration_easing A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. + * @param duration_easing _@param_ `duration_easing` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/slideToggle/} + * @see \`{@link https://api.jquery.com/slideToggle/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Animates divs between dividers with a toggle that makes some appear and some disappear. +```html + + + + + slideToggle demo + + + + +​ +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      There have been 0 toggled divs.

      +​ + +​ + + +``` */ slideToggle(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; /** * Display or hide the matched elements with a sliding motion. - * - * @param duration_easing_complete_options A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. - * A function to call once the animation is complete, called once per matched element. - * A map of additional options to pass to the method. - * @see {@link https://api.jquery.com/slideToggle/} + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition.
      + * * `complete` — A function to call once the animation is complete, called once per matched element.
      + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/slideToggle/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Animates all paragraphs to slide up or down, completing the animation within 600 milliseconds. +```html + + + + + slideToggle demo + + + + +​ + +

      + This is the paragraph to end all paragraphs. You + should feel lucky to have seen such a paragraph in + your life. Congratulations! +

      +​ + +​ + + +``` */ slideToggle(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; /** * Hide the matched elements with a sliding motion. - * * @param duration A string or number determining how long the animation will run. * @param easing A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/slideUp/} + * @see \`{@link https://api.jquery.com/slideUp/ }\` * @since 1.4.3 */ slideUp(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; /** * Hide the matched elements with a sliding motion. - * - * @param duration_easing A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. + * @param duration_easing _@param_ `duration_easing` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/slideUp/} + * @see \`{@link https://api.jquery.com/slideUp/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Animates the parent paragraph to slide up, completing the animation within 200 milliseconds. Once the animation is done, it displays an alert. +```html + + + + + slideUp demo + + + + +​ +
      + + +
      +​ +
      + + +
      +​ +
      + + +
      +​ +
      +​ + +​ + + +``` */ slideUp(duration_easing: JQuery.Duration | string, complete: (this: TElement) => void): this; /** * Hide the matched elements with a sliding motion. - * - * @param duration_easing_complete_options A string or number determining how long the animation will run. - * A string indicating which easing function to use for the transition. - * A function to call once the animation is complete, called once per matched element. - * A map of additional options to pass to the method. - * @see {@link https://api.jquery.com/slideUp/} + * @param duration_easing_complete_options _@param_ `duration_easing_complete_options` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `easing` — A string indicating which easing function to use for the transition.
      + * * `complete` — A function to call once the animation is complete, called once per matched element.
      + * * `options` — A map of additional options to pass to the method. + * @see \`{@link https://api.jquery.com/slideUp/ }\` * @since 1.0 * @since 1.4.3 + * @example ​ ````Animates all divs to slide up, completing the animation within 400 milliseconds. +```html + + + + + slideUp demo + + + + +​ +Click me! +
      +
      +
      +
      +
      +​ + +​ + + +``` */ slideUp(duration_easing_complete_options?: JQuery.Duration | string | ((this: TElement) => void) | JQuery.EffectsOptions): this; /** * Stop the currently-running animation on the matched elements. - * * @param queue The name of the queue in which to stop animations. * @param clearQueue A Boolean indicating whether to remove queued animation as well. Defaults to false. * @param jumpToEnd A Boolean indicating whether to complete the current animation immediately. Defaults to false. - * @see {@link https://api.jquery.com/stop/} + * @see \`{@link https://api.jquery.com/stop/ }\` * @since 1.7 */ stop(queue: string, clearQueue?: boolean, jumpToEnd?: boolean): this; /** * Stop the currently-running animation on the matched elements. - * * @param clearQueue A Boolean indicating whether to remove queued animation as well. Defaults to false. * @param jumpToEnd A Boolean indicating whether to complete the current animation immediately. Defaults to false. - * @see {@link https://api.jquery.com/stop/} + * @see \`{@link https://api.jquery.com/stop/ }\` * @since 1.2 + * @example ​ ````Click the Go button once to start the animation, then click the STOP button to stop it where it's currently positioned. Another option is to click several buttons to queue them up and see that stop just kills the currently playing one. +```html + + + + + stop demo + + + + +​ + + + +
      +​ + +​ + + +``` + * @example ​ ````Click the slideToggle button to start the animation, then click again before the animation is completed. The animation will toggle the other direction from the saved starting point. +```html + + + + + stop demo + + + + +​ + +
      +​ + +​ + + +``` */ stop(clearQueue?: boolean, jumpToEnd?: boolean): this; /** * Bind an event handler to the "submit" JavaScript event, or trigger that event on an element. - * * @param eventData An object containing data that will be passed to the event handler. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/submit/} + * @see \`{@link https://api.jquery.com/submit/ }\` * @since 1.4.3 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. */ submit(eventData: TData, - handler: JQuery.EventHandler | JQuery.EventHandlerBase>): this; + handler: JQuery.TypeEventHandler): this; /** * Bind an event handler to the "submit" JavaScript event, or trigger that event on an element. - * * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/submit/} + * @see \`{@link https://api.jquery.com/submit/ }\` * @since 1.0 + * @deprecated ​ Deprecated since 3.3. Use \`{@link on }\` or \`{@link trigger }\`. + * + * **Cause**: The `.on()` and `.trigger()` methods can set an event handler or generate an event for any event type, and should be used instead of the shortcut methods. This message also applies to the other event shorthands, including: blur, focus, focusin, focusout, resize, scroll, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, and contextmenu. + * + * **Solution**: Instead of `.click(fn)` use `.on("click", fn)`. Instead of `.click()` use `.trigger("click")`. + * @example ​ ````If you'd like to prevent forms from being submitted unless a flag variable is set, try: +```html + + + + + submit demo + + + + +​ +

      Type 'correct' to validate.

      +
      +
      + + +
      +
      + +​ + +​ + + +``` + * @example ​ ````If you'd like to prevent forms from being submitted unless a flag variable is set, try: +```javascript +$( "form" ).submit(function() { + return this.some_flag_variable; +}); +``` + * @example ​ ````To trigger the submit event on the first form on the page, try: +```javascript +$( "form:first" ).submit(); +``` */ - submit(handler?: JQuery.EventHandler | JQuery.EventHandlerBase> | false): this; + submit(handler?: JQuery.TypeEventHandler | + false): this; /** * Set the content of each element in the set of matched elements to the specified text. - * - * @param text The text to set as the content of each matched element. When Number or Boolean is supplied, it will - * be converted to a String representation. - * A function returning the text content to set. Receives the index position of the element in the set - * and the old text value as arguments. - * @see {@link https://api.jquery.com/text/} + * @param text_function _@param_ `text_function` + *
      + * * `text` — The text to set as the content of each matched element. When Number or Boolean is supplied, it will + * be converted to a String representation.
      + * * `function` — A function returning the text content to set. Receives the index position of the element in the set + * and the old text value as arguments. + * @see \`{@link https://api.jquery.com/text/ }\` * @since 1.0 * @since 1.4 + * @example ​ ````Add text to the paragraph (notice the bold tag is escaped). +```html + + + + + text demo + + + + +​ +

      Test Paragraph.

      +​ + +​ + + +``` */ - text(text: string | number | boolean | ((this: TElement, index: number, text: string) => string | number | boolean)): this; + text(text_function: string | number | boolean | ((this: TElement, index: number, text: string) => string | number | boolean)): this; /** * Get the combined text contents of each element in the set of matched elements, including their descendants. - * - * @see {@link https://api.jquery.com/text/} + * @see \`{@link https://api.jquery.com/text/ }\` * @since 1.0 + * @example ​ ````Find the text in the first paragraph (stripping out the html), then set the html of the last paragraph to show it is just text (the red bold is gone). +```html + + + + + text demo + + + + +​ +

      Test Paragraph.

      +

      +​ + +​ + + +``` */ text(): string; /** * Retrieve all the elements contained in the jQuery set, as an array. - * - * @see {@link https://api.jquery.com/toArray/} + * @see \`{@link https://api.jquery.com/toArray/ }\` * @since 1.4 + * @example ​ ````Select all divs in the document and return the DOM Elements as an Array; then use the built-in reverse() method to reverse that array. +```html + + + + + toArray demo + + + + +​ +Reversed - +​ +
      One
      +
      Two
      +
      Three
      ​ + +​ + + +``` */ toArray(): TElement[]; /** * Display or hide the matched elements. - * * @param duration A string or number determining how long the animation will run. * @param easing A string indicating which easing function to use for the transition. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/toggle/} + * @see \`{@link https://api.jquery.com/toggle/ }\` * @since 1.4.3 */ toggle(duration: JQuery.Duration, easing: string, complete?: (this: TElement) => void): this; /** * Display or hide the matched elements. - * * @param duration A string or number determining how long the animation will run. * @param complete A function to call once the animation is complete, called once per matched element. - * @see {@link https://api.jquery.com/toggle/} + * @see \`{@link https://api.jquery.com/toggle/ }\` * @since 1.0 */ toggle(duration: JQuery.Duration, complete: (this: TElement) => void): this; /** * Display or hide the matched elements. - * - * @param duration_complete_options_display A string or number determining how long the animation will run. - * A function to call once the animation is complete, called once per matched element. - * A map of additional options to pass to the method. - * Use true to show the element or false to hide it. - * @see {@link https://api.jquery.com/toggle/} + * @param duration_complete_options_display _@param_ `duration_complete_options_display` + *
      + * * `duration` — A string or number determining how long the animation will run.
      + * * `complete` — A function to call once the animation is complete, called once per matched element.
      + * * `options` — A map of additional options to pass to the method.
      + * * `display` — Use true to show the element or false to hide it. + * @see \`{@link https://api.jquery.com/toggle/ }\` * @since 1.0 * @since 1.3 + * @example ​ ````Toggles all paragraphs. +```html + + + + + toggle demo + + + +​ + +

      Hello

      +

      Good Bye

      +​ + +​ + + +``` + * @example ​ ````Animates all paragraphs to be shown if they are hidden and hidden if they are visible, completing the animation within 600 milliseconds. +```html + + + + + toggle demo + + + + +​ + +

      Hiya

      +

      Such interesting text, eh?

      +​ + +​ + + +``` + * @example ​ ````Shows all paragraphs, then hides them all, back and forth. +```html + + + + + toggle demo + + + +​ + +

      Hello

      +

      Good Bye

      +​ + +​ + + +``` */ toggle(duration_complete_options_display?: JQuery.Duration | ((this: TElement) => void) | JQuery.EffectsOptions | boolean): this; /** - * Add or remove one or more classes from each element in the set of matched elements, depending on - * either the class's presence or the value of the state argument. - * - * @param className One or more class names (separated by spaces) to be toggled for each element in the matched set. - * A function that returns class names to be toggled in the class attribute of each element in the - * matched set. Receives the index position of the element in the set, the old class value, and the state as arguments. + * Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the state argument. + * @param className_function _@param_ `className_function` + *
      + * * `className` — One or more class names (separated by spaces) to be toggled for each element in the matched set.
      + * * `function` — A function that returns class names to be toggled in the class attribute of each element in the + * matched set. Receives the index position of the element in the set, the old class value, and the state as arguments. * @param state A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed. - * @see {@link https://api.jquery.com/toggleClass/} + * @see \`{@link https://api.jquery.com/toggleClass/ }\` * @since 1.0 * @since 1.3 * @since 1.4 + * @since 3.3 + * @example ​ ````Toggle the class 'highlight' when a paragraph is clicked. +```html + + + + + toggleClass demo + + + + +​ +

      Click to toggle

      +

      highlight

      +

      on these

      +

      paragraphs

      +​ + +​ + + +``` + * @example ​ ````Add the "highlight" class to the clicked paragraph on every third click of that paragraph, remove it every first and second click. +```html + + + + + toggleClass demo + + + + +​ +

      Click to toggle (clicks: 0)

      +

      highlight (clicks: 0)

      +

      on these (clicks: 0)

      +

      paragraphs (clicks: 0)

      +​ + +​ + + +``` + * @example ​ ````Toggle the class name(s) indicated on the buttons for each div. +```html + + + + + toggleClass demo + + + + +​ +
      + + + + + reset +
      +
      +
      +
      +
      +
      +
      +​ + +​ + + +``` */ - toggleClass(className: string | ((this: TElement, index: number, className: string, state: TState) => string), + toggleClass(className_function: JQuery.TypeOrArray | ((this: TElement, index: number, className: string, state: TState) => string), state?: TState): this; /** - * Add or remove one or more classes from each element in the set of matched elements, depending on - * either the class's presence or the value of the state argument. - * + * Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the state argument. * @param state A boolean value to determine whether the class should be added or removed. - * @see {@link https://api.jquery.com/toggleClass/} + * @see \`{@link https://api.jquery.com/toggleClass/ }\` * @since 1.4 - * @deprecated 3.0 + * @deprecated ​ Deprecated since 3.0. See \`{@link https://github.com/jquery/jquery/pull/2618 }\`. + * + * **Cause**: Calling `.toggleClass()` with no arguments, or with a single Boolean `true` or `false` argument, has been deprecated. Its behavior was poorly documented, but essentially the method saved away the current class value in a data item when the class was removed and restored the saved value when it was toggled back. If you do not believe you are specificially trying to use this form of the method, it is possible you are accidentally doing so via an inadvertent undefined value, as `.toggleClass( undefined )` toggles all classes. + * + * **Solution**: If this functionality is still needed, save the current full `.attr( "class" )` value in a data item and restore it when required. */ toggleClass(state?: boolean): this; /** * Execute all handlers and behaviors attached to the matched elements for the given event type. - * - * @param eventType A string containing a JavaScript event type, such as click or submit. - * A jQuery.Event object. + * @param eventType_event _@param_ `eventType_event` + *
      + * * `eventType` — A string containing a JavaScript event type, such as `click` or `submit`.
      + * * `event` — A \`{@link https://api.jquery.com/category/events/event-object/ jQuery.Event}\` object. * @param extraParameters Additional parameters to pass along to the event handler. - * @see {@link https://api.jquery.com/trigger/} + * @see \`{@link https://api.jquery.com/trigger/ }\` * @since 1.0 * @since 1.3 + * @example ​ ````Clicks to button #2 also trigger a click for button #1. +```html + + + + + trigger demo + + + + +​ + + +
      0 button #1 clicks.
      +
      0 button #2 clicks.
      +​ + +​ + + +``` + * @example ​ ````To submit the first form without using the submit() function, try: +```javascript +$( "form:first" ).trigger( "submit" ); +``` + * @example ​ ````To submit the first form without using the submit() function, try: +```javascript +var event = jQuery.Event( "submit" ); +$( "form:first" ).trigger( event ); +if ( event.isDefaultPrevented() ) { + // Perform an action... +} +``` + * @example ​ ````To pass arbitrary data to an event: +```javascript +$( "p" ) + .click(function( event, a, b ) { + // When a normal click fires, a and b are undefined + // for a trigger like below a refers to "foo" and b refers to "bar" + }) + .trigger( "click", [ "foo", "bar" ] ); +``` + * @example ​ ````To pass arbitrary data through an event object: +```javascript +var event = jQuery.Event( "logged" ); +event.user = "foo"; +event.pass = "bar"; +$( "body" ).trigger( event ); +``` + * @example ​ ````Alternative way to pass data through an event object: +```javascript +$( "body" ).trigger({ + type:"logged", + user:"foo", + pass:"bar" +}); +``` */ - trigger(eventType: string | JQuery.Event, extraParameters?: any[] | JQuery.PlainObject | string | number): this; + trigger(eventType_event: string | JQuery.Event, extraParameters?: any[] | JQuery.PlainObject | string | number | boolean): this; /** * Execute all handlers attached to an element for an event. - * - * @param eventType A string containing a JavaScript event type, such as click or submit. - * A jQuery.Event object. + * @param eventType_event _@param_ `eventType_event` + *
      + * * `eventType` — A string containing a JavaScript event type, such as `click` or `submit`.
      + * * `event` — A \`{@link https://api.jquery.com/category/events/event-object/ jQuery.Event}\` object. * @param extraParameters Additional parameters to pass along to the event handler. - * @see {@link https://api.jquery.com/triggerHandler/} + * @see \`{@link https://api.jquery.com/triggerHandler/ }\` * @since 1.2 * @since 1.3 + * @example ​ ````If you called .triggerHandler() on a focus event - the browser's default focus action would not be triggered, only the event handlers bound to the focus event. +```html + + + + + triggerHandler demo + + + +​ + +

      +​ + +​ + +​ + + +``` */ - triggerHandler(eventType: string | JQuery.Event, extraParameters?: any[] | JQuery.PlainObject | string | number): undefined | any; + triggerHandler(eventType_event: string | JQuery.Event, extraParameters?: any[] | JQuery.PlainObject | string | number | boolean): any; /** * Remove a previously-attached event handler from the elements. - * * @param event A string containing one or more DOM event types, such as "click" or "submit," or custom event names. * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/unbind/} + * @see \`{@link https://api.jquery.com/unbind/ }\` * @since 1.0 * @since 1.4.3 - * @deprecated 3.0 + * @deprecated ​ Deprecated since 3.0. Use \`{@link off }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````Can bind and unbind events to the colored button. +```html + + + + + unbind demo + + + + +​ + + + +
      Click!
      +​ + +​ + + +``` + * @example ​ ````To unbind just one previously bound handler, pass the function in as the second argument: +```javascript +var foo = function() { + // Code to handle some kind of event +}; +​ +$( "p" ).bind( "click", foo ); // ... Now foo will be called when paragraphs are clicked ... +​ +$( "p" ).unbind( "click", foo ); // ... foo will no longer be called. +``` */ - unbind(event: string, handler: JQuery.EventHandlerBase> | false): this; + unbind( + event: TType, + handler: JQuery.TypeEventHandler | + false + ): this; /** * Remove a previously-attached event handler from the elements. - * * @param event A string containing one or more DOM event types, such as "click" or "submit," or custom event names. * A jQuery.Event object. - * @see {@link https://api.jquery.com/unbind/} + * @see \`{@link https://api.jquery.com/unbind/ }\` * @since 1.0 - * @deprecated 3.0 - */ - unbind(event?: string | JQuery.Event): this; - /** - * Remove a handler from the event for all elements which match the current selector, based upon a - * specific set of root elements. + * @deprecated ​ Deprecated since 3.0. Use \`{@link off }\`. * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````To unbind all events from all paragraphs, write: +```javascript +$( "p" ).unbind(); +``` + * @example ​ ````To unbind all click events from all paragraphs, write: +```javascript +$( "p" ).unbind( "click" ); +``` + */ + unbind(event?: string | JQuery.TriggeredEvent): this; + /** + * Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. * @param selector A selector which will be used to filter the event results. * @param eventType A string containing a JavaScript event type, such as "click" or "keydown" * @param handler A function to execute each time the event is triggered. - * @see {@link https://api.jquery.com/undelegate/} + * @see \`{@link https://api.jquery.com/undelegate/ }\` * @since 1.4.2 - * @deprecated 3.0 - */ - undelegate(selector: JQuery.Selector, eventType: string, handler: JQuery.EventHandlerBase> | false): this; - /** - * Remove a handler from the event for all elements which match the current selector, based upon a - * specific set of root elements. + * @deprecated ​ Deprecated since 3.0. Use \`{@link off }\`. * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````Can bind and unbind events to the colored button. +```html + + + + + undelegate demo + + + + +​ + + + +
      Click!
      +​ + +​ + + +``` + * @example ​ ````To undelegate just one previously bound handler, pass the function in as the third argument: +```javascript +var foo = function () { + // Code to handle some kind of event +}; +​ +// ... Now foo will be called when paragraphs are clicked ... +$( "body" ).delegate( "p", "click", foo ); +​ +// ... foo will no longer be called. +$( "body" ).undelegate( "p", "click", foo ); +``` + */ + undelegate( + selector: JQuery.Selector, + eventType: TType, + handler: JQuery.TypeEventHandler | + false + ): this; + /** + * Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. * @param selector A selector which will be used to filter the event results. - * @param eventTypes A string containing a JavaScript event type, such as "click" or "keydown" - * An object of one or more event types and previously bound functions to unbind from them. - * @see {@link https://api.jquery.com/undelegate/} + * @param eventType_events _@param_ `eventType_events` + *
      + * * `eventType` — A string containing a JavaScript event type, such as "click" or "keydown"
      + * * `events` — An object of one or more event types and previously bound functions to unbind from them. + * @see \`{@link https://api.jquery.com/undelegate/ }\` * @since 1.4.2 * @since 1.4.3 - * @deprecated 3.0 - */ - undelegate(selector: JQuery.Selector, eventTypes: string | JQuery.PlainObject> | false>): this; - /** - * Remove a handler from the event for all elements which match the current selector, based upon a - * specific set of root elements. + * @deprecated ​ Deprecated since 3.0. Use \`{@link off }\`. * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + */ + undelegate(selector: JQuery.Selector, + eventType_events: string | + JQuery.TypeEventHandlers): this; + /** + * Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. * @param namespace A selector which will be used to filter the event results. - * @see {@link https://api.jquery.com/undelegate/} + * @see \`{@link https://api.jquery.com/undelegate/ }\` * @since 1.4.2 * @since 1.6 - * @deprecated 3.0 + * @deprecated ​ Deprecated since 3.0. Use \`{@link off }\`. + * + * **Cause**: These event binding methods have been deprecated in favor of the `.on()` and `.off()` methods which can handle both delegated and direct event binding. Although the older methods are still present in jQuery 3.0, they may be removed as early as the next major-version update. + * + * **Solution**: Change the method call to use `.on()` or `.off()`, the documentation for the old methods include specific instructions. In general, the `.bind()` and `.unbind()` methods can be renamed directly to `.on()` and `.off()` respectively since the argument orders are identical. + * @example ​ ````To unbind all delegated events from all paragraphs, write: +```javascript +$( "p" ).undelegate(); +``` + * @example ​ ````To unbind all delegated click events from all paragraphs, write: +```javascript +$( "p" ).undelegate( "click" ); +``` + * @example ​ ````To unbind all delegated events by their namespace: +```javascript +var foo = function() { + // Code to handle some kind of event +}; +​ +// Delegate events under the ".whatever" namespace +$( "form" ).delegate( ":button", "click.whatever", foo ); +​ +$( "form" ).delegate( "input[type='text'] ", "keypress.whatever", foo ); +​ +// Unbind all events delegated under the ".whatever" namespace +$( "form" ).undelegate( ".whatever" ); +``` */ undelegate(namespace?: string): this; /** * Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place. - * * @param selector A selector to check the parent element against. If an element's parent does not match the selector, * the element won't be unwrapped. - * @see {@link https://api.jquery.com/unwrap/} + * @see \`{@link https://api.jquery.com/unwrap/ }\` * @since 1.4 * @since 3.0 + * @example ​ ````Wrap/unwrap a div around each of the paragraphs. +```html + + + + + unwrap demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      ​ + +​ + + +``` */ unwrap(selector?: string): this; /** * Set the value of each element in the set of matched elements. - * - * @param value A string of text, a number, or an array of strings corresponding to the value of each matched - * element to set as selected/checked. - * A function returning the value to set. this is the current element. Receives the index position of - * the element in the set and the old value as arguments. - * @see {@link https://api.jquery.com/val/} + * @param value_function _@param_ `value_function` + *
      + * * `value` — A string of text, a number, or an array of strings corresponding to the value of each matched + * element to set as selected/checked.
      + * * `function` — A function returning the value to set. `this` is the current element. Receives the index position of + * the element in the set and the old value as arguments. + * @see \`{@link https://api.jquery.com/val/ }\` * @since 1.0 * @since 1.4 + * @example ​ ````Set the value of an input box. +```html + + + + + val demo + + + + +​ +
      + + + +
      + +​ + +​ + + +``` + * @example ​ ````Use the function argument to modify the value of an input box. +```html + + + + + val demo + + + +​ +

      Type something and then click or tab out of the input.

      + +​ + +​ + + +``` + * @example ​ ````Set a single select, a multiple select, checkboxes and a radio button . +```html + + + + + val demo + + + + +​ + +​ + +​ +
      + check1 + check2 + radio1 + radio2 +​ + +​ + + +``` */ - val(value: string | number | string[] | ((this: TElement, index: number, value: string) => string)): this; + val(value_function: string | number | string[] | ((this: TElement, index: number, value: string) => string)): this; /** * Get the current value of the first element in the set of matched elements. - * - * @see {@link https://api.jquery.com/val/} + * @see \`{@link https://api.jquery.com/val/ }\` * @since 1.0 + * @example ​ ````Get the single value from a single select and an array of values from a multiple select and display their values. +```html + + + + + val demo + + + + +​ +

      +​ + +​ + +​ + +​ + + +``` + * @example ​ ````Find the value of an input box. +```html + + + + + val demo + + + + +​ + +

      +​ + +​ + + +``` */ val(): string | number | string[] | undefined; /** * Set the CSS width of each element in the set of matched elements. - * - * @param value An integer representing the number of pixels, or an integer along with an optional unit of measure - * appended (as a string). - * A function returning the width to set. Receives the index position of the element in the set and the - * old width as arguments. Within the function, this refers to the current element in the set. - * @see {@link https://api.jquery.com/width/} + * @param value_function _@param_ `value_function` + *
      + * * `value` — An integer representing the number of pixels, or an integer along with an optional unit of measure + * appended (as a string).
      + * * `function` — A function returning the width to set. Receives the index position of the element in the set and the + * old width as arguments. Within the function, `this` refers to the current element in the set. + * @see \`{@link https://api.jquery.com/width/ }\` * @since 1.0 * @since 1.4.1 + * @example ​ ````Change the width of each div the first time it is clicked (and change its color). +```html + + + + + width demo + + + + +​ +
      d
      +
      d
      +
      d
      +
      d
      +
      d
      +​ + +​ + + +``` */ - width(value: string | number | ((this: TElement, index: number, value: number) => string | number)): this; + width(value_function: string | number | ((this: TElement, index: number, value: number) => string | number)): this; /** * Get the current computed width for the first element in the set of matched elements. - * - * @see {@link https://api.jquery.com/width/} + * @see \`{@link https://api.jquery.com/width/ }\` * @since 1.0 + * @example ​ ````Show various widths. Note the values are from the iframe so might be smaller than you expected. The yellow highlight shows the iframe body. +```html + + + + + width demo + + + + +​ + + + +
       
      +

      + Sample paragraph to test width +

      +​ + +​ + + +``` */ width(): number | undefined; /** * Wrap an HTML structure around each element in the set of matched elements. - * - * @param wrappingElement A selector, element, HTML string, or jQuery object specifying the structure to wrap around the - * matched elements. When you pass a jQuery collection containing more than one element, or a selector - * matching more than one element, the first element will be used. - * A callback function returning the HTML content or jQuery object to wrap around the matched elements. - * Receives the index position of the element in the set as an argument. Within the function, this - * refers to the current element in the set. - * @see {@link https://api.jquery.com/wrap/} + * @param wrappingElement_function _@param_ `wrappingElement_function` + *
      + * * `wrappingElement` — A selector, element, HTML string, or jQuery object specifying the structure to wrap around the + * matched elements. When you pass a jQuery collection containing more than one element, or a selector + * matching more than one element, the first element will be used.
      + * * `function` — A callback function returning the HTML content or jQuery object to wrap around the matched elements. + * Receives the index position of the element in the set as an argument. Within the function, `this` + * refers to the current element in the set. + * @see \`{@link https://api.jquery.com/wrap/ }\` * @since 1.0 * @since 1.4 + * @example ​ ````Wrap a new div around all of the paragraphs. +```html + + + + + wrap demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Wraps a newly created tree of objects around the spans. Notice anything in between the spans gets left out like the <strong> (red text) in this example. Even the white space between spans is left out. Click View Source to see the original html.> +```html + + + + + wrap demo + + + + +​ +Span Text +What about me? +Another One +​ + +​ + + +``` + * @example ​ ````Wrap a new div around all of the paragraphs. +```html + + + + + wrap demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Wrap a jQuery object double depth div around all of the paragraphs. Notice it doesn't move the object but just clones it to wrap around its target. +```html + + + + + wrap demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +
      +​ + +​ + + +``` */ - wrap(wrappingElement: JQuery.Selector | JQuery.htmlString | Element | JQuery | ((this: TElement, index: number) => string | JQuery)): this; + wrap(wrappingElement_function: JQuery.Selector | JQuery.htmlString | Element | JQuery | ((this: TElement, index: number) => string | JQuery)): this; /** * Wrap an HTML structure around all elements in the set of matched elements. - * - * @param wrappingElement A selector, element, HTML string, or jQuery object specifying the structure to wrap around the matched elements. - * A callback function returning the HTML content or jQuery object to wrap around all the matched - * elements. Within the function, this refers to the first element in the set. Prior to jQuery 3.0, the - * callback was incorrectly called for every element in the set and received the index position of the - * element in the set as an argument. - * @see {@link https://api.jquery.com/wrapAll/} + * @param wrappingElement_function _@param_ `wrappingElement_function` + *
      + * * `wrappingElement` — A selector, element, HTML string, or jQuery object specifying the structure to wrap around the matched elements.
      + * * `function` — A callback function returning the HTML content or jQuery object to wrap around all the matched + * elements. Within the function, `this` refers to the first element in the set. **Prior to jQuery + * 3.0**, the callback was incorrectly called for every element in the set and received the index + * position of the element in the set as an argument. + * @see \`{@link https://api.jquery.com/wrapAll/ }\` * @since 1.2 * @since 1.4 + * @example ​ ````Wrap a new div around all of the paragraphs. +```html + + + + + wrapAll demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Wraps a newly created tree of objects around the spans. Notice anything in between the spans gets left out like the <strong> (red text) in this example. Even the white space between spans is left out. Click View Source to see the original html. +```html + + + + + wrapAll demo + + + + +​ +Span Text +What about me? +Another One +​ + +​ + + +``` + * @example ​ ````Wrap a new div around all of the paragraphs. +```html + + + + + wrapAll demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Wrap a jQuery object double depth div around all of the paragraphs. Notice it doesn't move the object but just clones it to wrap around its target. +```html + + + + + wrapAll demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +
      +​ + +​ + + +``` */ - wrapAll(wrappingElement: JQuery.Selector | JQuery.htmlString | Element | JQuery | ((this: TElement) => string | JQuery)): this; + wrapAll(wrappingElement_function: JQuery.Selector | JQuery.htmlString | Element | JQuery | ((this: TElement) => string | JQuery)): this; /** * Wrap an HTML structure around the content of each element in the set of matched elements. - * - * @param wrappingElement An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap - * around the content of the matched elements. - * A callback function which generates a structure to wrap around the content of the matched elements. - * Receives the index position of the element in the set as an argument. Within the function, this - * refers to the current element in the set. - * @see {@link https://api.jquery.com/wrapInner/} + * @param wrappingElement_function _@param_ `wrappingElement_function` + *
      + * * `wrappingElement` — An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap + * around the content of the matched elements.
      + * * `function` — A callback function which generates a structure to wrap around the content of the matched elements. + * Receives the index position of the element in the set as an argument. Within the function, `this` + * refers to the current element in the set. + * @see \`{@link https://api.jquery.com/wrapInner/ }\` * @since 1.2 * @since 1.4 + * @example ​ ````Selects all paragraphs and wraps a bold tag around each of its contents. +```html + + + + + wrapInner demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Wraps a newly created tree of objects around the inside of the body. +```html + + + + + wrapInner demo + + + + +​ +Plain old text, or is it? +​ + +​ + + +``` + * @example ​ ````Selects all paragraphs and wraps a bold tag around each of its contents. +```html + + + + + wrapInner demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` + * @example ​ ````Selects all paragraphs and wraps a jQuery object around each of its contents. +```html + + + + + wrapInner demo + + + + +​ +

      Hello

      +

      cruel

      +

      World

      +​ + +​ + + +``` */ - wrapInner(wrappingElement: JQuery.Selector | JQuery.htmlString | Element | JQuery | ((this: TElement, index: number) => string | JQuery | Element)): this; + wrapInner(wrappingElement_function: JQuery.Selector | JQuery.htmlString | Element | JQuery | ((this: TElement, index: number) => string | JQuery | Element)): this; [n: number]: TElement; } - -// ES5 compatibility -interface Iterable { } - -declare namespace JQuery { - type TypeOrArray = T | T[]; - type Node = Element | Text | Comment; - - /** - * A string is designated htmlString in jQuery documentation when it is used to represent one or more - * DOM elements, typically to be created and inserted in the document. When passed as an argument of - * the jQuery() function, the string is identified as HTML if it starts with ) and is parsed - * as such until the final > character. Prior to jQuery 1.9, a string was considered to be HTML if it - * contained anywhere within the string. - */ - type htmlString = string; - /** - * A selector is used in jQuery to select DOM elements from a DOM document. That document is, in most - * cases, the DOM document present in all browsers, but can also be an XML document received via Ajax. - */ - type Selector = string; - - /** - * The PlainObject type is a JavaScript object containing zero or more key-value pairs. The plain - * object is, in other words, an Object object. It is designated "plain" in jQuery documentation to - * distinguish it from other kinds of JavaScript objects: for example, null, user-defined arrays, and - * host objects such as document, all of which have a typeof value of "object." - */ - interface PlainObject { - [key: string]: T; - } - - // region Ajax - - interface AjaxSettings extends Ajax.AjaxSettingsBase { - /** - * A string containing the URL to which the request is sent. - */ - url?: string; - /** - * A pre-request callback function that can be used to modify the jqXHR (in jQuery 1.4.x, - * XMLHTTPRequest) object before it is sent. Use this to set custom headers, etc. The jqXHR and - * settings objects are passed as arguments. This is an Ajax Event. Returning false in the beforeSend - * function will cancel the request. As of jQuery 1.5, the beforeSend option will be called regardless - * of the type of request. - */ - beforeSend?(this: TContext, jqXHR: jqXHR, settings: AjaxSettings): false | void; - } - - interface UrlAjaxSettings extends Ajax.AjaxSettingsBase { - /** - * A string containing the URL to which the request is sent. - */ - url: string; - /** - * A pre-request callback function that can be used to modify the jqXHR (in jQuery 1.4.x, - * XMLHTTPRequest) object before it is sent. Use this to set custom headers, etc. The jqXHR and - * settings objects are passed as arguments. This is an Ajax Event. Returning false in the beforeSend - * function will cancel the request. As of jQuery 1.5, the beforeSend option will be called regardless - * of the type of request. - */ - beforeSend?(this: TContext, jqXHR: jqXHR, settings: UrlAjaxSettings): false | void; - } - - namespace Ajax { - type SuccessTextStatus = 'success' | 'notmodified' | 'nocontent'; - type ErrorTextStatus = 'timeout' | 'error' | 'abort' | 'parsererror'; - type TextStatus = SuccessTextStatus | ErrorTextStatus; - - interface SuccessCallback { - (this: TContext, data: any, textStatus: SuccessTextStatus, jqXHR: JQuery.jqXHR): void; - } - - interface ErrorCallback { - (this: TContext, jqXHR: jqXHR, textStatus: ErrorTextStatus, errorThrown: string): void; - } - - interface CompleteCallback { - (this: TContext, jqXHR: jqXHR, textStatus: TextStatus): void; - } - - /** - * @see {@link http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings} - */ - interface AjaxSettingsBase { - /** - * A set of key/value pairs that map a given dataType to its MIME type, which gets sent in the Accept - * request header. This header tells the server what kind of response it will accept in return. - */ - accepts?: PlainObject; - /** - * By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need - * synchronous requests, set this option to false. Cross-domain requests and dataType: "jsonp" requests - * do not support synchronous operation. Note that synchronous requests may temporarily lock the - * browser, disabling any actions while the request is active. As of jQuery 1.8, the use of async: - * false with jqXHR ($.Deferred) is deprecated; you must use the success/error/complete callback - * options instead of the corresponding methods of the jqXHR object such as jqXHR.done(). - */ - async?: boolean; - /** - * A pre-request callback function that can be used to modify the jqXHR (in jQuery 1.4.x, - * XMLHTTPRequest) object before it is sent. Use this to set custom headers, etc. The jqXHR and - * settings objects are passed as arguments. This is an Ajax Event. Returning false in the beforeSend - * function will cancel the request. As of jQuery 1.5, the beforeSend option will be called regardless - * of the type of request. - */ - beforeSend?(this: TContext, jqXHR: jqXHR, settings: AjaxSettingsBase): false | void; - /** - * If set to false, it will force requested pages not to be cached by the browser. Note: Setting cache - * to false will only work correctly with HEAD and GET requests. It works by appending "_={timestamp}" - * to the GET parameters. The parameter is not needed for other types of requests, except in IE8 when a - * POST is made to a URL that has already been requested by a GET. - */ - cache?: boolean; - /** - * A function to be called when the request finishes (after success and error callbacks are executed). - * The function gets passed two arguments: The jqXHR (in jQuery 1.4.x, XMLHTTPRequest) object and a - * string categorizing the status of the request ("success", "notmodified", "nocontent", "error", - * "timeout", "abort", or "parsererror"). As of jQuery 1.5, the complete setting can accept an array of - * functions. Each function will be called in turn. This is an Ajax Event. - */ - complete?: TypeOrArray>; - /** - * An object of string/regular-expression pairs that determine how jQuery will parse the response, - * given its content type. - */ - contents?: PlainObject; - /** - * When sending data to the server, use this content type. Default is - * "application/x-www-form-urlencoded; charset=UTF-8", which is fine for most cases. If you explicitly - * pass in a content-type to $.ajax(), then it is always sent to the server (even if no data is sent). - * As of jQuery 1.6 you can pass false to tell jQuery to not set any content type header. Note: The W3C - * XMLHttpRequest specification dictates that the charset is always UTF-8; specifying another charset - * will not force the browser to change the encoding. Note: For cross-domain requests, setting the - * content type to anything other than application/x-www-form-urlencoded, multipart/form-data, or - * text/plain will trigger the browser to send a preflight OPTIONS request to the server. - */ - contentType?: string | false; - /** - * This object will be the context of all Ajax-related callbacks. By default, the context is an object - * that represents the Ajax settings used in the call ($.ajaxSettings merged with the settings passed to $.ajax). - */ - context?: TContext; - /** - * An object containing dataType-to-dataType converters. Each converter's value is a function that - * returns the transformed value of the response. - */ - converters?: PlainObject<((value: any) => any) | true>; - /** - * If you wish to force a crossDomain request (such as JSONP) on the same domain, set the value of - * crossDomain to true. This allows, for example, server-side redirection to another domain. - */ - crossDomain?: boolean; - /** - * Data to be sent to the server. It is converted to a query string, if not already a string. It's - * appended to the url for GET-requests. See processData option to prevent this automatic processing. - * Object must be Key/Value pairs. If value is an Array, jQuery serializes multiple values with same - * key based on the value of the traditional setting (described below). - */ - data?: PlainObject | string; - /** - * A function to be used to handle the raw response data of XMLHttpRequest. This is a pre-filtering - * function to sanitize the response. You should return the sanitized data. The function accepts two - * arguments: The raw data returned from the server and the 'dataType' parameter. - */ - dataFilter?(data: string, type: string): any; - /** - * The type of data that you're expecting back from the server. If none is specified, jQuery will try - * to infer it based on the MIME type of the response (an XML MIME type will yield XML, in 1.4 JSON - * will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be - * returned as a string). The available types (and the result passed as the first argument to your - * success callback) are: - * - * "xml": Returns a XML document that can be processed via jQuery. - * - * "html": Returns HTML as plain text; included script tags are evaluated when inserted in the DOM. - * - * "script": Evaluates the response as JavaScript and returns it as plain text. Disables caching by - * appending a query string parameter, _=[TIMESTAMP], to the URL unless the cache option is set to - * true. Note: This will turn POSTs into GETs for remote-domain requests. - * - * "json": Evaluates the response as JSON and returns a JavaScript object. Cross-domain "json" requests - * are converted to "jsonp" unless the request includes jsonp: false in its request options. The JSON - * data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. As of - * jQuery 1.9, an empty response is also rejected; the server should return a response of null or {} - * instead. (See json.org for more information on proper JSON formatting.) - * - * "jsonp": Loads in a JSON block using JSONP. Adds an extra "?callback=?" to the end of your URL to - * specify the callback. Disables caching by appending a query string parameter, "_=[TIMESTAMP]", to - * the URL unless the cache option is set to true. - * - * "text": A plain text string. - * - * multiple, space-separated values: As of jQuery 1.5, jQuery can convert a dataType from what it - * received in the Content-Type header to what you require. For example, if you want a text response to - * be treated as XML, use "text xml" for the dataType. You can also make a JSONP request, have it - * received as text, and interpreted by jQuery as XML: "jsonp text xml". Similarly, a shorthand string - * such as "jsonp xml" will first attempt to convert from jsonp to xml, and, failing that, convert from - * jsonp to text, and then from text to xml. - */ - dataType?: 'xml' | 'html' | 'script' | 'json' | 'jsonp' | 'text' | string; - /** - * A function to be called if the request fails. The function receives three arguments: The jqXHR (in - * jQuery 1.4.x, XMLHttpRequest) object, a string describing the type of error that occurred and an - * optional exception object, if one occurred. Possible values for the second argument (besides null) - * are "timeout", "error", "abort", and "parsererror". When an HTTP error occurs, errorThrown receives - * the textual portion of the HTTP status, such as "Not Found" or "Internal Server Error." As of jQuery - * 1.5, the error setting can accept an array of functions. Each function will be called in turn. Note: - * This handler is not called for cross-domain script and cross-domain JSONP requests. This is an Ajax Event. - */ - error?: TypeOrArray>; - /** - * Whether to trigger global Ajax event handlers for this request. The default is true. Set to false to - * prevent the global handlers like ajaxStart or ajaxStop from being triggered. This can be used to - * control various Ajax Events. - */ - global?: boolean; - /** - * An object of additional header key/value pairs to send along with requests using the XMLHttpRequest - * transport. The header X-Requested-With: XMLHttpRequest is always added, but its default - * XMLHttpRequest value can be changed here. Values in the headers setting can also be overwritten from - * within the beforeSend function. - */ - headers?: PlainObject; - /** - * Allow the request to be successful only if the response has changed since the last request. This is - * done by checking the Last-Modified header. Default value is false, ignoring the header. In jQuery - * 1.4 this technique also checks the 'etag' specified by the server to catch unmodified data. - */ - ifModified?: boolean; - /** - * Allow the current environment to be recognized as "local," (e.g. the filesystem), even if jQuery - * does not recognize it as such by default. The following protocols are currently recognized as local: - * file, *-extension, and widget. If the isLocal setting needs modification, it is recommended to do so - * once in the $.ajaxSetup() method. - */ - isLocal?: boolean; - /** - * Override the callback function name in a JSONP request. This value will be used instead of - * 'callback' in the 'callback=?' part of the query string in the url. So {jsonp:'onJSONPLoad'} would - * result in 'onJSONPLoad=?' passed to the server. As of jQuery 1.5, setting the jsonp option to false - * prevents jQuery from adding the "?callback" string to the URL or attempting to use "=?" for - * transformation. In this case, you should also explicitly set the jsonpCallback setting. For example, - * { jsonp: false, jsonpCallback: "callbackName" }. If you don't trust the target of your Ajax - * requests, consider setting the jsonp property to false for security reasons. - */ - jsonp?: string | false; - /** - * Specify the callback function name for a JSONP request. This value will be used instead of the - * random name automatically generated by jQuery. It is preferable to let jQuery generate a unique name - * as it'll make it easier to manage the requests and provide callbacks and error handling. You may - * want to specify the callback when you want to enable better browser caching of GET requests. As of - * jQuery 1.5, you can also use a function for this setting, in which case the value of jsonpCallback - * is set to the return value of that function. - */ - jsonpCallback?: string | ((this: TContext) => string); - /** - * The HTTP method to use for the request (e.g. "POST", "GET", "PUT"). - */ - method?: string; - /** - * A mime type to override the XHR mime type. - */ - mimeType?: string; - /** - * A password to be used with XMLHttpRequest in response to an HTTP access authentication request. - */ - password?: string; - /** - * By default, data passed in to the data option as an object (technically, anything other than a - * string) will be processed and transformed into a query string, fitting to the default content-type - * "application/x-www-form-urlencoded". If you want to send a DOMDocument, or other non-processed data, - * set this option to false. - */ - processData?: boolean; - /** - * Only applies when the "script" transport is used (e.g., cross-domain requests with "jsonp" or - * "script" dataType and "GET" type). Sets the charset attribute on the script tag used in the request. - * Used when the character set on the local page is not the same as the one on the remote script. - */ - scriptCharset?: string; - /** - * An object of numeric HTTP codes and functions to be called when the response has the corresponding - * code. - * - * If the request is successful, the status code functions take the same parameters as the success - * callback; if it results in an error (including 3xx redirect), they take the same parameters as the error callback. - */ - statusCode?: StatusCodeCallbacks; - /** - * A function to be called if the request succeeds. The function gets passed three arguments: The data - * returned from the server, formatted according to the dataType parameter or the dataFilter callback - * function, if specified; a string describing the status; and the jqXHR (in jQuery 1.4.x, - * XMLHttpRequest) object. As of jQuery 1.5, the success setting can accept an array of functions. Each - * function will be called in turn. This is an Ajax Event. - */ - success?: TypeOrArray>; - /** - * Set a timeout (in milliseconds) for the request. A value of 0 means there will be no timeout. This - * will override any global timeout set with $.ajaxSetup(). The timeout period starts at the point the - * $.ajax call is made; if several other requests are in progress and the browser has no connections - * available, it is possible for a request to time out before it can be sent. In jQuery 1.4.x and - * below, the XMLHttpRequest object will be in an invalid state if the request times out; accessing any - * object members may throw an exception. In Firefox 3.0+ only, script and JSONP requests cannot be - * cancelled by a timeout; the script will run even if it arrives after the timeout period. - */ - timeout?: number; - /** - * Set this to true if you wish to use the traditional style of param serialization. - */ - traditional?: boolean; - /** - * An alias for method. You should use type if you're using versions of jQuery prior to 1.9.0. - */ - type?: string; - /** - * A username to be used with XMLHttpRequest in response to an HTTP access authentication request. - */ - username?: string; - // ActiveXObject requires "lib": ["scripthost"] which consumers would also require - /** - * Callback for creating the XMLHttpRequest object. Defaults to the ActiveXObject when available (IE), - * the XMLHttpRequest otherwise. Override to provide your own implementation for XMLHttpRequest or - * enhancements to the factory. - */ - xhr?(): XMLHttpRequest; - /** - * An object of fieldName-fieldValue pairs to set on the native XHR object. - * - * In jQuery 1.5, the withCredentials property was not propagated to the native XHR and thus CORS - * requests requiring it would ignore this flag. For this reason, we recommend using jQuery 1.5.1+ - * should you require the use of it. - */ - xhrFields?: XHRFields; - } - - type StatusCodeCallbacks = { - // region Success Status Codes - - // jQuery treats 2xx and 304 status codes as a success - - 200?: SuccessCallback; - 201?: SuccessCallback; - 202?: SuccessCallback; - 203?: SuccessCallback; - 204?: SuccessCallback; - 205?: SuccessCallback; - 206?: SuccessCallback; - 207?: SuccessCallback; - 208?: SuccessCallback; - 209?: SuccessCallback; - 210?: SuccessCallback; - 211?: SuccessCallback; - 212?: SuccessCallback; - 213?: SuccessCallback; - 214?: SuccessCallback; - 215?: SuccessCallback; - 216?: SuccessCallback; - 217?: SuccessCallback; - 218?: SuccessCallback; - 219?: SuccessCallback; - 220?: SuccessCallback; - 221?: SuccessCallback; - 222?: SuccessCallback; - 223?: SuccessCallback; - 224?: SuccessCallback; - 225?: SuccessCallback; - 226?: SuccessCallback; - 227?: SuccessCallback; - 228?: SuccessCallback; - 229?: SuccessCallback; - 230?: SuccessCallback; - 231?: SuccessCallback; - 232?: SuccessCallback; - 233?: SuccessCallback; - 234?: SuccessCallback; - 235?: SuccessCallback; - 236?: SuccessCallback; - 237?: SuccessCallback; - 238?: SuccessCallback; - 239?: SuccessCallback; - 240?: SuccessCallback; - 241?: SuccessCallback; - 242?: SuccessCallback; - 243?: SuccessCallback; - 244?: SuccessCallback; - 245?: SuccessCallback; - 246?: SuccessCallback; - 247?: SuccessCallback; - 248?: SuccessCallback; - 249?: SuccessCallback; - 250?: SuccessCallback; - 251?: SuccessCallback; - 252?: SuccessCallback; - 253?: SuccessCallback; - 254?: SuccessCallback; - 255?: SuccessCallback; - 256?: SuccessCallback; - 257?: SuccessCallback; - 258?: SuccessCallback; - 259?: SuccessCallback; - 260?: SuccessCallback; - 261?: SuccessCallback; - 262?: SuccessCallback; - 263?: SuccessCallback; - 264?: SuccessCallback; - 265?: SuccessCallback; - 266?: SuccessCallback; - 267?: SuccessCallback; - 268?: SuccessCallback; - 269?: SuccessCallback; - 270?: SuccessCallback; - 271?: SuccessCallback; - 272?: SuccessCallback; - 273?: SuccessCallback; - 274?: SuccessCallback; - 275?: SuccessCallback; - 276?: SuccessCallback; - 277?: SuccessCallback; - 278?: SuccessCallback; - 279?: SuccessCallback; - 280?: SuccessCallback; - 281?: SuccessCallback; - 282?: SuccessCallback; - 283?: SuccessCallback; - 284?: SuccessCallback; - 285?: SuccessCallback; - 286?: SuccessCallback; - 287?: SuccessCallback; - 288?: SuccessCallback; - 289?: SuccessCallback; - 290?: SuccessCallback; - 291?: SuccessCallback; - 292?: SuccessCallback; - 293?: SuccessCallback; - 294?: SuccessCallback; - 295?: SuccessCallback; - 296?: SuccessCallback; - 297?: SuccessCallback; - 298?: SuccessCallback; - 299?: SuccessCallback; - 304?: SuccessCallback; - - // endregion - - // region Error Status Codes - - 300?: ErrorCallback; - 301?: ErrorCallback; - 302?: ErrorCallback; - 303?: ErrorCallback; - 305?: ErrorCallback; - 306?: ErrorCallback; - 307?: ErrorCallback; - 308?: ErrorCallback; - 309?: ErrorCallback; - 310?: ErrorCallback; - 311?: ErrorCallback; - 312?: ErrorCallback; - 313?: ErrorCallback; - 314?: ErrorCallback; - 315?: ErrorCallback; - 316?: ErrorCallback; - 317?: ErrorCallback; - 318?: ErrorCallback; - 319?: ErrorCallback; - 320?: ErrorCallback; - 321?: ErrorCallback; - 322?: ErrorCallback; - 323?: ErrorCallback; - 324?: ErrorCallback; - 325?: ErrorCallback; - 326?: ErrorCallback; - 327?: ErrorCallback; - 328?: ErrorCallback; - 329?: ErrorCallback; - 330?: ErrorCallback; - 331?: ErrorCallback; - 332?: ErrorCallback; - 333?: ErrorCallback; - 334?: ErrorCallback; - 335?: ErrorCallback; - 336?: ErrorCallback; - 337?: ErrorCallback; - 338?: ErrorCallback; - 339?: ErrorCallback; - 340?: ErrorCallback; - 341?: ErrorCallback; - 342?: ErrorCallback; - 343?: ErrorCallback; - 344?: ErrorCallback; - 345?: ErrorCallback; - 346?: ErrorCallback; - 347?: ErrorCallback; - 348?: ErrorCallback; - 349?: ErrorCallback; - 350?: ErrorCallback; - 351?: ErrorCallback; - 352?: ErrorCallback; - 353?: ErrorCallback; - 354?: ErrorCallback; - 355?: ErrorCallback; - 356?: ErrorCallback; - 357?: ErrorCallback; - 358?: ErrorCallback; - 359?: ErrorCallback; - 360?: ErrorCallback; - 361?: ErrorCallback; - 362?: ErrorCallback; - 363?: ErrorCallback; - 364?: ErrorCallback; - 365?: ErrorCallback; - 366?: ErrorCallback; - 367?: ErrorCallback; - 368?: ErrorCallback; - 369?: ErrorCallback; - 370?: ErrorCallback; - 371?: ErrorCallback; - 372?: ErrorCallback; - 373?: ErrorCallback; - 374?: ErrorCallback; - 375?: ErrorCallback; - 376?: ErrorCallback; - 377?: ErrorCallback; - 378?: ErrorCallback; - 379?: ErrorCallback; - 380?: ErrorCallback; - 381?: ErrorCallback; - 382?: ErrorCallback; - 383?: ErrorCallback; - 384?: ErrorCallback; - 385?: ErrorCallback; - 386?: ErrorCallback; - 387?: ErrorCallback; - 388?: ErrorCallback; - 389?: ErrorCallback; - 390?: ErrorCallback; - 391?: ErrorCallback; - 392?: ErrorCallback; - 393?: ErrorCallback; - 394?: ErrorCallback; - 395?: ErrorCallback; - 396?: ErrorCallback; - 397?: ErrorCallback; - 398?: ErrorCallback; - 399?: ErrorCallback; - 400?: ErrorCallback; - 401?: ErrorCallback; - 402?: ErrorCallback; - 403?: ErrorCallback; - 404?: ErrorCallback; - 405?: ErrorCallback; - 406?: ErrorCallback; - 407?: ErrorCallback; - 408?: ErrorCallback; - 409?: ErrorCallback; - 410?: ErrorCallback; - 411?: ErrorCallback; - 412?: ErrorCallback; - 413?: ErrorCallback; - 414?: ErrorCallback; - 415?: ErrorCallback; - 416?: ErrorCallback; - 417?: ErrorCallback; - 418?: ErrorCallback; - 419?: ErrorCallback; - 420?: ErrorCallback; - 421?: ErrorCallback; - 422?: ErrorCallback; - 423?: ErrorCallback; - 424?: ErrorCallback; - 425?: ErrorCallback; - 426?: ErrorCallback; - 427?: ErrorCallback; - 428?: ErrorCallback; - 429?: ErrorCallback; - 430?: ErrorCallback; - 431?: ErrorCallback; - 432?: ErrorCallback; - 433?: ErrorCallback; - 434?: ErrorCallback; - 435?: ErrorCallback; - 436?: ErrorCallback; - 437?: ErrorCallback; - 438?: ErrorCallback; - 439?: ErrorCallback; - 440?: ErrorCallback; - 441?: ErrorCallback; - 442?: ErrorCallback; - 443?: ErrorCallback; - 444?: ErrorCallback; - 445?: ErrorCallback; - 446?: ErrorCallback; - 447?: ErrorCallback; - 448?: ErrorCallback; - 449?: ErrorCallback; - 450?: ErrorCallback; - 451?: ErrorCallback; - 452?: ErrorCallback; - 453?: ErrorCallback; - 454?: ErrorCallback; - 455?: ErrorCallback; - 456?: ErrorCallback; - 457?: ErrorCallback; - 458?: ErrorCallback; - 459?: ErrorCallback; - 460?: ErrorCallback; - 461?: ErrorCallback; - 462?: ErrorCallback; - 463?: ErrorCallback; - 464?: ErrorCallback; - 465?: ErrorCallback; - 466?: ErrorCallback; - 467?: ErrorCallback; - 468?: ErrorCallback; - 469?: ErrorCallback; - 470?: ErrorCallback; - 471?: ErrorCallback; - 472?: ErrorCallback; - 473?: ErrorCallback; - 474?: ErrorCallback; - 475?: ErrorCallback; - 476?: ErrorCallback; - 477?: ErrorCallback; - 478?: ErrorCallback; - 479?: ErrorCallback; - 480?: ErrorCallback; - 481?: ErrorCallback; - 482?: ErrorCallback; - 483?: ErrorCallback; - 484?: ErrorCallback; - 485?: ErrorCallback; - 486?: ErrorCallback; - 487?: ErrorCallback; - 488?: ErrorCallback; - 489?: ErrorCallback; - 490?: ErrorCallback; - 491?: ErrorCallback; - 492?: ErrorCallback; - 493?: ErrorCallback; - 494?: ErrorCallback; - 495?: ErrorCallback; - 496?: ErrorCallback; - 497?: ErrorCallback; - 498?: ErrorCallback; - 499?: ErrorCallback; - 500?: ErrorCallback; - 501?: ErrorCallback; - 502?: ErrorCallback; - 503?: ErrorCallback; - 504?: ErrorCallback; - 505?: ErrorCallback; - 506?: ErrorCallback; - 507?: ErrorCallback; - 508?: ErrorCallback; - 509?: ErrorCallback; - 510?: ErrorCallback; - 511?: ErrorCallback; - 512?: ErrorCallback; - 513?: ErrorCallback; - 514?: ErrorCallback; - 515?: ErrorCallback; - 516?: ErrorCallback; - 517?: ErrorCallback; - 518?: ErrorCallback; - 519?: ErrorCallback; - 520?: ErrorCallback; - 521?: ErrorCallback; - 522?: ErrorCallback; - 523?: ErrorCallback; - 524?: ErrorCallback; - 525?: ErrorCallback; - 526?: ErrorCallback; - 527?: ErrorCallback; - 528?: ErrorCallback; - 529?: ErrorCallback; - 530?: ErrorCallback; - 531?: ErrorCallback; - 532?: ErrorCallback; - 533?: ErrorCallback; - 534?: ErrorCallback; - 535?: ErrorCallback; - 536?: ErrorCallback; - 537?: ErrorCallback; - 538?: ErrorCallback; - 539?: ErrorCallback; - 540?: ErrorCallback; - 541?: ErrorCallback; - 542?: ErrorCallback; - 543?: ErrorCallback; - 544?: ErrorCallback; - 545?: ErrorCallback; - 546?: ErrorCallback; - 547?: ErrorCallback; - 548?: ErrorCallback; - 549?: ErrorCallback; - 550?: ErrorCallback; - 551?: ErrorCallback; - 552?: ErrorCallback; - 553?: ErrorCallback; - 554?: ErrorCallback; - 555?: ErrorCallback; - 556?: ErrorCallback; - 557?: ErrorCallback; - 558?: ErrorCallback; - 559?: ErrorCallback; - 560?: ErrorCallback; - 561?: ErrorCallback; - 562?: ErrorCallback; - 563?: ErrorCallback; - 564?: ErrorCallback; - 565?: ErrorCallback; - 566?: ErrorCallback; - 567?: ErrorCallback; - 568?: ErrorCallback; - 569?: ErrorCallback; - 570?: ErrorCallback; - 571?: ErrorCallback; - 572?: ErrorCallback; - 573?: ErrorCallback; - 574?: ErrorCallback; - 575?: ErrorCallback; - 576?: ErrorCallback; - 577?: ErrorCallback; - 578?: ErrorCallback; - 579?: ErrorCallback; - 580?: ErrorCallback; - 581?: ErrorCallback; - 582?: ErrorCallback; - 583?: ErrorCallback; - 584?: ErrorCallback; - 585?: ErrorCallback; - 586?: ErrorCallback; - 587?: ErrorCallback; - 588?: ErrorCallback; - 589?: ErrorCallback; - 590?: ErrorCallback; - 591?: ErrorCallback; - 592?: ErrorCallback; - 593?: ErrorCallback; - 594?: ErrorCallback; - 595?: ErrorCallback; - 596?: ErrorCallback; - 597?: ErrorCallback; - 598?: ErrorCallback; - 599?: ErrorCallback; - - // endregion - } & { - // Status codes not listed require type annotations when defining the callback - [index: number]: SuccessCallback | ErrorCallback; - }; - - // Writable properties on XMLHttpRequest - interface XHRFields extends Partial> { } - } - - interface Transport { - send(headers: PlainObject, completeCallback: Transport.SuccessCallback): void; - abort(): void; - } - - namespace Transport { - interface SuccessCallback { - (status: number, statusText: Ajax.TextStatus, responses?: PlainObject, headers?: string): void; - } - } - - /** - * @see {@link http://api.jquery.com/jquery.ajax/#jqXHR} - */ - interface jqXHR extends Promise3, never, - Ajax.SuccessTextStatus, Ajax.ErrorTextStatus, never, - jqXHR, string, never>, - Pick, - Partial> { - responseJSON?: any; - - /** - * Determine the current state of a Deferred object. - * - * @see {@link https://api.jquery.com/deferred.state/} - * @since 1.7 - */ - state(): 'pending' | 'resolved' | 'rejected'; - statusCode(map: Ajax.StatusCodeCallbacks): void; - } - - namespace jqXHR { - /** - * @deprecated - */ - interface DoneCallback> extends Deferred.Callback3 { } - - /** - * @deprecated - */ - interface FailCallback extends Deferred.Callback3 { } - - /** - * @deprecated - */ - interface AlwaysCallback> extends Deferred.Callback3 { } - } - - // endregion - - // region Callbacks - - interface Callbacks { - /** - * Add a callback or a collection of callbacks to a callback list. - * - * @param callback A function, or array of functions, that are to be added to the callback list. - * @param callbacks A function, or array of functions, that are to be added to the callback list. - * @see {@link https://api.jquery.com/callbacks.add/} - * @since 1.7 - */ - add(callback: TypeOrArray, ...callbacks: Array>): this; - /** - * Disable a callback list from doing anything more. - * - * @see {@link https://api.jquery.com/callbacks.disable/} - * @since 1.7 - */ - disable(): this; - /** - * Determine if the callbacks list has been disabled. - * - * @see {@link https://api.jquery.com/callbacks.disabled/} - * @since 1.7 - */ - disabled(): boolean; - /** - * Remove all of the callbacks from a list. - * - * @see {@link https://api.jquery.com/callbacks.empty/} - * @since 1.7 - */ - empty(): this; - /** - * Call all of the callbacks with the given arguments. - * - * @param args The argument or list of arguments to pass back to the callback list. - * @see {@link https://api.jquery.com/callbacks.fire/} - * @since 1.7 - */ - fire(...args: any[]): this; - /** - * Call all callbacks in a list with the given context and arguments. - * - * @param context A reference to the context in which the callbacks in the list should be fired. - * @param args An argument, or array of arguments, to pass to the callbacks in the list. - * @see {@link https://api.jquery.com/callbacks.fireWith/} - * @since 1.7 - */ - fireWith(context: object, args?: ArrayLike): this; - /** - * Determine if the callbacks have already been called at least once. - * - * @see {@link https://api.jquery.com/callbacks.fired/} - * @since 1.7 - */ - fired(): boolean; - /** - * Determine whether or not the list has any callbacks attached. If a callback is provided as an - * argument, determine whether it is in a list. - * - * @param callback The callback to search for. - * @see {@link https://api.jquery.com/callbacks.has/} - * @since 1.7 - */ - has(callback?: T): boolean; - /** - * Lock a callback list in its current state. - * - * @see {@link https://api.jquery.com/callbacks.lock/} - * @since 1.7 - */ - lock(): this; - /** - * Determine if the callbacks list has been locked. - * - * @see {@link https://api.jquery.com/callbacks.locked/} - * @since 1.7 - */ - locked(): boolean; - /** - * Remove a callback or a collection of callbacks from a callback list. - * - * @param callbacks A function, or array of functions, that are to be removed from the callback list. - * @see {@link https://api.jquery.com/callbacks.remove/} - * @since 1.7 - */ - remove(...callbacks: T[]): this; - } - - // endregion - - // region CSS - - interface CSSHook { - get(this: this, elem: TElement, computed: any, extra: any): any; - set(this: this, elem: TElement, value: any): void; - } - - // endregion - - // region Deferred - - /** - * Any object that has a then method. - */ - interface Thenable extends PromiseLike { } - - // Type parameter guide - // -------------------- - // Each type parameter represents a parameter in one of the three possible callbacks. - // - // The first letter indicates which position the parameter is in. - // - // T = A = 1st position - // U = B = 2nd position - // V = C = 3rd position - // S = R = rest position - // - // The second letter indicates which whether it is a [R]esolve, Re[J]ect, or [N]otify value. - // - // The third letter indicates whether the value is returned in the [D]one filter, [F]ail filter, or [P]rogress filter. - - /** - * This object provides a subset of the methods of the Deferred object (then, done, fail, always, - * pipe, progress, state and promise) to prevent users from changing the state of the Deferred. - * - * @see {@link http://api.jquery.com/Types/#Promise} - * @deprecated Experimental. Avoid referncing this type directly in your code. - */ - interface PromiseBase extends _Promise, PromiseLike { - /** - * Add handlers to be called when the Deferred object is either resolved or rejected. - * - * @param alwaysCallback A function, or array of functions, that is called when the Deferred is resolved or rejected. - * @param alwaysCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected. - * @see {@link https://api.jquery.com/deferred.always/} - * @since 1.6 - */ - always(alwaysCallback: TypeOrArray>, - ...alwaysCallbacks: Array>>): this; - /** - * Add handlers to be called when the Deferred object is resolved. - * - * @param doneCallback A function, or array of functions, that are called when the Deferred is resolved. - * @param doneCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is resolved. - * @see {@link https://api.jquery.com/deferred.done/} - * @since 1.5 - */ - done(doneCallback: TypeOrArray>, - ...doneCallbacks: Array>>): this; - /** - * Add handlers to be called when the Deferred object is rejected. - * - * @param failCallback A function, or array of functions, that are called when the Deferred is rejected. - * @param failCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is rejected. - * @see {@link https://api.jquery.com/deferred.fail/} - * @since 1.5 - */ - fail(failCallback: TypeOrArray>, - ...failCallbacks: Array>>): this; - /** - * Add handlers to be called when the Deferred object generates progress notifications. - * - * @param progressCallback A function, or array of functions, to be called when the Deferred generates progress notifications. - * @param progressCallbacks Optional additional functions, or arrays of functions, to be called when the Deferred generates - * progress notifications. - * @see {@link https://api.jquery.com/deferred.progress/} - * @since 1.7 - */ - progress(progressCallback: TypeOrArray>, - ...progressCallbacks: Array>>): this; - /** - * Return a Deferred's Promise object. - * - * @param target Object onto which the promise methods have to be attached - * @see {@link https://api.jquery.com/deferred.promise/} - * @since 1.5 - */ - promise(target: TTarget): this & TTarget; - /** - * Return a Deferred's Promise object. - * - * @see {@link https://api.jquery.com/deferred.promise/} - * @since 1.5 - */ - promise(): this; - /** - * Determine the current state of a Deferred object. - * - * @see {@link https://api.jquery.com/deferred.state/} - * @since 1.7 - */ - state(): 'pending' | 'resolved' | 'rejected'; - - // region pipe - - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, - failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | AJF, - progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: null, - failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | AJF, - progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, - failFilter: null, - progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: null, - failFilter: null, - progressFilter?: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, - failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | AJF, - progressFilter?: null): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: null, - failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | AJF, - progressFilter?: null): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, - failFilter?: null, - progressFilter?: null): PromiseBase; - - // endregion - - // region then - - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, - failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | ARF, - progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: null, - failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | ARF, - progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, - failFilter: null, - progressFilter: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: null, - failFilter: null, - progressFilter?: (t: TN, u: UN, v: VN, ...s: SN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, - failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | ARF, - progressFilter?: null): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: null, - failFilter: (t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | ARF, - progressFilter?: null): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: (t: TR, u: UR, v: VR, ...s: SR[]) => PromiseBase | Thenable | ARD, - failFilter?: null, - progressFilter?: null): PromiseBase; - - // endregion - - /** - * Add handlers to be called when the Deferred object is rejected. - * - * @param failFilter A function that is called when the Deferred is rejected. - * @see {@link https://api.jquery.com/deferred.catch/} - * @since 3.0 - */ - catch - (failFilter?: ((t: TJ, u: UJ, v: VJ, ...s: SJ[]) => PromiseBase | Thenable | ARF) | null): PromiseBase; - } - - /** - * This object provides a subset of the methods of the Deferred object (then, done, fail, always, - * pipe, progress, state and promise) to prevent users from changing the state of the Deferred. - * - * @see {@link http://api.jquery.com/Types/#Promise} - */ - interface Promise3 extends PromiseBase { } - - /** - * This object provides a subset of the methods of the Deferred object (then, done, fail, always, - * pipe, progress, state and promise) to prevent users from changing the state of the Deferred. - * - * @see {@link http://api.jquery.com/Types/#Promise} - */ - interface Promise2 extends PromiseBase { } - - /** - * This object provides a subset of the methods of the Deferred object (then, done, fail, always, - * pipe, progress, state and promise) to prevent users from changing the state of the Deferred. - * - * @see {@link http://api.jquery.com/Types/#Promise} - */ - interface Promise extends PromiseBase { } - - interface DeferredStatic { - // https://jquery.com/upgrade-guide/3.0/#callback-exit - exceptionHook: any; - (beforeStart?: (this: JQuery.Deferred, deferred: JQuery.Deferred) => void): JQuery.Deferred; - } - - interface Deferred { - /** - * Call the progressCallbacks on a Deferred object with the given args. - * - * @param args Optional arguments that are passed to the progressCallbacks. - * @see {@link https://api.jquery.com/deferred.notify/} - * @since 1.7 - */ - notify(...args: TN[]): this; - /** - * Call the progressCallbacks on a Deferred object with the given context and args. - * - * @param context Context passed to the progressCallbacks as the this object. - * @param args An optional array of arguments that are passed to the progressCallbacks. - * @see {@link https://api.jquery.com/deferred.notifyWith/} - * @since 1.7 - */ - notifyWith(context: object, args?: ArrayLike): this; - /** - * Reject a Deferred object and call any failCallbacks with the given args. - * - * @param args Optional arguments that are passed to the failCallbacks. - * @see {@link https://api.jquery.com/deferred.reject/} - * @since 1.5 - */ - reject(...args: TJ[]): this; - /** - * Reject a Deferred object and call any failCallbacks with the given context and args. - * - * @param context Context passed to the failCallbacks as the this object. - * @param args An optional array of arguments that are passed to the failCallbacks. - * @see {@link https://api.jquery.com/deferred.rejectWith/} - * @since 1.5 - */ - rejectWith(context: object, args?: ArrayLike): this; - /** - * Resolve a Deferred object and call any doneCallbacks with the given args. - * - * @param args Optional arguments that are passed to the doneCallbacks. - * @see {@link https://api.jquery.com/deferred.resolve/} - * @since 1.5 - */ - resolve(...args: TR[]): this; - /** - * Resolve a Deferred object and call any doneCallbacks with the given context and args. - * - * @param context Context passed to the doneCallbacks as the this object. - * @param args An optional array of arguments that are passed to the doneCallbacks. - * @see {@link https://api.jquery.com/deferred.resolveWith/} - * @since 1.5 - */ - resolveWith(context: object, args?: ArrayLike): this; - - /** - * Add handlers to be called when the Deferred object is either resolved or rejected. - * - * @param alwaysCallback A function, or array of functions, that is called when the Deferred is resolved or rejected. - * @param alwaysCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected. - * @see {@link https://api.jquery.com/deferred.always/} - * @since 1.6 - */ - always(alwaysCallback: TypeOrArray>, - ...alwaysCallbacks: Array>>): this; - /** - * Add handlers to be called when the Deferred object is resolved. - * - * @param doneCallback A function, or array of functions, that are called when the Deferred is resolved. - * @param doneCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is resolved. - * @see {@link https://api.jquery.com/deferred.done/} - * @since 1.5 - */ - done(doneCallback: TypeOrArray>, - ...doneCallbacks: Array>>): this; - /** - * Add handlers to be called when the Deferred object is rejected. - * - * @param failCallback A function, or array of functions, that are called when the Deferred is rejected. - * @param failCallbacks Optional additional functions, or arrays of functions, that are called when the Deferred is rejected. - * @see {@link https://api.jquery.com/deferred.fail/} - * @since 1.5 - */ - fail(failCallback: TypeOrArray>, - ...failCallbacks: Array>>): this; - /** - * Add handlers to be called when the Deferred object generates progress notifications. - * - * @param progressCallback A function, or array of functions, to be called when the Deferred generates progress notifications. - * @param progressCallbacks Optional additional functions, or arrays of functions, to be called when the Deferred generates - * progress notifications. - * @see {@link https://api.jquery.com/deferred.progress/} - * @since 1.7 - */ - progress(progressCallback: TypeOrArray>, - ...progressCallbacks: Array>>): this; - /** - * Return a Deferred's Promise object. - * - * @param target Object onto which the promise methods have to be attached - * @see {@link https://api.jquery.com/deferred.promise/} - * @since 1.5 - */ - promise(target: TTarget): JQuery.Promise & TTarget; - /** - * Return a Deferred's Promise object. - * - * @see {@link https://api.jquery.com/deferred.promise/} - * @since 1.5 - */ - promise(): JQuery.Promise; - /** - * Determine the current state of a Deferred object. - * - * @see {@link https://api.jquery.com/deferred.state/} - * @since 1.7 - */ - state(): 'pending' | 'resolved' | 'rejected'; - - // region pipe - - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, - failFilter: (...t: TJ[]) => PromiseBase | Thenable | AJF, - progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: null, - failFilter: (...t: TJ[]) => PromiseBase | Thenable | AJF, - progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, - failFilter: null, - progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: null, - failFilter: null, - progressFilter?: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, - failFilter: (...t: TJ[]) => PromiseBase | Thenable | AJF, - progressFilter?: null): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: null, - failFilter: (...t: TJ[]) => PromiseBase | Thenable | AJF, - progressFilter?: null): PromiseBase; - /** - * Utility method to filter and/or chain Deferreds. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.pipe/} - * @since 1.6 - * @since 1.7 - * @deprecated 1.8 - */ - pipe - (doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, - failFilter?: null, - progressFilter?: null): PromiseBase; - - // endregion - - // region then - - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter A function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, - failFilter: (...t: TJ[]) => PromiseBase | Thenable | ARF, - progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter A function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: null, - failFilter: (...t: TJ[]) => PromiseBase | Thenable | ARF, - progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter A function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, - failFilter: null, - progressFilter: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter A function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: null, - failFilter: null, - progressFilter?: (...t: TN[]) => PromiseBase | Thenable | ANP): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, - failFilter: (...t: TJ[]) => PromiseBase | Thenable | ARF, - progressFilter?: null): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: null, - failFilter: (...t: TJ[]) => PromiseBase | Thenable | ARF, - progressFilter?: null): PromiseBase; - /** - * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - * - * @param doneFilter An optional function that is called when the Deferred is resolved. - * @param failFilter An optional function that is called when the Deferred is rejected. - * @param progressFilter An optional function that is called when progress notifications are sent to the Deferred. - * @see {@link https://api.jquery.com/deferred.then/} - * @since 1.8 - */ - then - (doneFilter: (...t: TR[]) => PromiseBase | Thenable | ARD, - failFilter?: null, - progressFilter?: null): PromiseBase; - - // endregion - - /** - * Add handlers to be called when the Deferred object is rejected. - * - * @param failFilter A function that is called when the Deferred is rejected. - * @see {@link https://api.jquery.com/deferred.catch/} - * @since 3.0 - */ - catch - (failFilter?: ((...t: TJ[]) => PromiseBase | Thenable | ARF) | null): PromiseBase; - } - - namespace Deferred { - interface CallbackBase { - (t: T, u: U, v: V, ...r: R[]): void; - } - - interface Callback3 extends CallbackBase { } - - interface Callback { - (...args: T[]): void; - } - - /** - * @deprecated - */ - interface DoneCallback extends Callback { } - - /** - * @deprecated - */ - interface FailCallback extends Callback { } - - /** - * @deprecated - */ - interface AlwaysCallback extends Callback { } - - /** - * @deprecated - */ - interface ProgressCallback extends Callback { } - } - - // endregion - - // region Effects - - type Duration = number | 'fast' | 'slow'; - // TODO: Is the first element always a string or is that specific to the 'fx' queue? - type Queue = { 0: string; } & Array>; - - interface QueueFunction { - (this: TElement, next: () => void): void; - } - - /** - * @see {@link https://api.jquery.com/animate/#animate-properties-options} - */ - interface EffectsOptions { - /** - * A function to be called when the animation on an element completes or stops without completing (its - * Promise object is either resolved or rejected). - */ - always?(this: TElement, animation: JQuery.Promise, jumpedToEnd: boolean): void; - /** - * A function that is called once the animation on an element is complete. - */ - complete?(this: TElement): void; - /** - * A function to be called when the animation on an element completes (its Promise object is resolved). - */ - done?(this: TElement, animation: JQuery.Promise, jumpedToEnd: boolean): void; - /** - * A string or number determining how long the animation will run. - */ - duration?: Duration; - /** - * A string indicating which easing function to use for the transition. - */ - easing?: string; - /** - * A function to be called when the animation on an element fails to complete (its Promise object is rejected). - */ - fail?(this: TElement, animation: JQuery.Promise, jumpedToEnd: boolean): void; - /** - * A function to be called after each step of the animation, only once per animated element regardless - * of the number of animated properties. - */ - progress?(this: TElement, animation: JQuery.Promise, progress: number, remainingMs: number): void; - /** - * A Boolean indicating whether to place the animation in the effects queue. If false, the animation - * will begin immediately. As of jQuery 1.7, the queue option can also accept a string, in which case - * the animation is added to the queue represented by that string. When a custom queue name is used the - * animation does not automatically start; you must call .dequeue("queuename") to start it. - */ - queue?: boolean | string; - /** - * An object containing one or more of the CSS properties defined by the properties argument and their - * corresponding easing functions. - */ - specialEasing?: PlainObject; - /** - * A function to call when the animation on an element begins. - */ - start?(this: TElement, animation: JQuery.Promise): void; - /** - * A function to be called for each animated property of each animated element. This function provides - * an opportunity to modify the Tween object to change the value of the property before it is set. - */ - step?(this: TElement, now: number, tween: Tween): void; - } - - interface SpeedSettings { - /** - * A string or number determining how long the animation will run. - */ - duration?: Duration; - /** - * A string indicating which easing function to use for the transition. - */ - easing?: string; - /** - * A function to call once the animation is complete. - */ - complete?(this: TElement): void; - } - - // This should be a class but doesn't work correctly under the JQuery namespace. Tween should be an inner class of jQuery. - // Undocumented - // https://github.com/jquery/api.jquery.com/issues/391 - // https://github.com/jquery/api.jquery.com/issues/61 - interface Tween { - easing: string; - elem: TElement; - end: number; - now: number; - options: EffectsOptions; - pos: number; - prop: string; - start: number; - unit: string; - } - - interface AnimationHook { - (fx: JQuery.Tween): void; - } - - // endregion - - // region Events - - // region Event - - // This should be a class but doesn't work correctly under the JQuery namespace. Event should be an inner class of jQuery. - - // Static members - interface EventStatic { - (event: string, properties?: T): JQuery.Event & T; - (properties: T): JQuery.Event & T; - new (event: string, properties?: T): JQuery.Event & T; - new (properties: T): JQuery.Event & T; - } - - // Instance members - interface Event { - /** - * Indicates whether the META key was pressed when the event fired. - * - * @see {@link https://api.jquery.com/event.metaKey/} - * @since 1.0.4 - */ - metaKey: boolean; - /** - * The namespace specified when the event was triggered. - * - * @see {@link https://api.jquery.com/event.namespace/} - * @since 1.4.3 - */ - namespace: string; - /** - * The mouse position relative to the left edge of the document. - * - * @see {@link https://api.jquery.com/event.pageX/} - * @since 1.0.4 - */ - pageX: number; - /** - * The mouse position relative to the top edge of the document. - * - * @see {@link https://api.jquery.com/event.pageY/} - * @since 1.0.4 - */ - pageY: number; - /** - * The last value returned by an event handler that was triggered by this event, unless the value was undefined. - * - * @see {@link https://api.jquery.com/event.result/} - * @since 1.3 - */ - result: any; - /** - * The difference in milliseconds between the time the browser created the event and January 1, 1970. - * - * @see {@link https://api.jquery.com/event.timeStamp/} - * @since 1.2.6 - */ - timeStamp: number; - /** - * Describes the nature of the event. - * - * @see {@link https://api.jquery.com/event.type/} - * @since 1.0 - */ - type: string; - /** - * For key or mouse events, this property indicates the specific key or button that was pressed. - * - * @see {@link https://api.jquery.com/event.which/} - * @since 1.1.3 - */ - which: number; - /** - * Returns whether event.preventDefault() was ever called on this event object. - * - * @see {@link https://api.jquery.com/event.isDefaultPrevented/} - * @since 1.3 - */ - isDefaultPrevented(): boolean; - /** - * Returns whether event.stopImmediatePropagation() was ever called on this event object. - * - * @see {@link https://api.jquery.com/event.isImmediatePropagationStopped/} - * @since 1.3 - */ - isImmediatePropagationStopped(): boolean; - /** - * Returns whether event.stopPropagation() was ever called on this event object. - * - * @see {@link https://api.jquery.com/event.isPropagationStopped/} - * @since 1.3 - */ - isPropagationStopped(): boolean; - /** - * If this method is called, the default action of the event will not be triggered. - * - * @see {@link https://api.jquery.com/event.preventDefault/} - * @since 1.0 - */ - preventDefault(): void; - /** - * Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree. - * - * @see {@link https://api.jquery.com/event.stopImmediatePropagation/} - * @since 1.3 - */ - stopImmediatePropagation(): void; - /** - * Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event. - * - * @see {@link https://api.jquery.com/event.stopPropagation/} - * @since 1.0 - */ - stopPropagation(): void; - } - - // Generic members - interface Event extends Partial> { - /** - * The current DOM element within the event bubbling phase. - * - * @see {@link https://api.jquery.com/event.currentTarget/} - * @since 1.3 - */ - currentTarget: TTarget; - /** - * An optional object of data passed to an event method when the current executing handler is bound. - * - * @see {@link https://api.jquery.com/event.data/} - * @since 1.1 - */ - data: TData; - /** - * The element where the currently-called jQuery event handler was attached. - * - * @see {@link https://api.jquery.com/event.delegateTarget/} - * @since 1.7 - */ - delegateTarget: TTarget; - originalEvent: _Event; - /** - * The other DOM element involved in the event, if any. - * - * @see {@link https://api.jquery.com/event.relatedTarget/} - * @since 1.1.4 - */ - relatedTarget: TTarget | null; - /** - * The DOM element that initiated the event. - * - * @see {@link https://api.jquery.com/event.target/} - * @since 1.0 - */ - target: TTarget; - } - - interface EventLike { - type: string; - } - - // endregion - - interface EventHandler extends EventHandlerBase> { } - - interface EventHandlerBase { - // Extra parameters can be passed from trigger() - (this: TContext, t: T, ...args: any[]): void | false | any; - } - - // Provided for convenience for use with jQuery.Event.which - const enum Mouse { - None = 0, - Left = 1, - Middle = 2, - Right = 3 - } - - // Provided for convenience for use with jQuery.Event.which - const enum Key { - Backspace = 8, - Tab = 9, - Enter = 13, - Shift = 16, - Control = 17, - Alt = 18, - CapsLock = 20, - Escape = 27, - Space = 32, - PageUp = 33, - PageDown = 34, - End = 35, - Home = 36, - ArrowLeft = 37, - ArrowUp = 38, - ArrowRight = 39, - ArrowDown = 40, - - Semicolon = 186, - Colon = 186, - EqualsSign = 187, - Plus = 187, - Comma = 188, - LessThanSign = 188, - Minus = 189, - Underscore = 189, - Period = 190, - GreaterThanSign = 190, - ForwardSlash = 191, - QuestionMark = 191, - Backtick = 192, - Tilde = 192, - OpeningSquareBracket = 219, - OpeningCurlyBrace = 219, - Backslash = 220, - Pipe = 220, - ClosingSquareBracket = 221, - ClosingCurlyBrace = 221, - SingleQuote = 222, - DoubleQuote = 222, - - Pause = 19, - PrintScreen = 44, - Insert = 45, - Delete = 46, - Num0 = 48, - Num1 = 49, - Num2 = 50, - Num3 = 51, - Num4 = 52, - Num5 = 53, - Num6 = 54, - Num7 = 55, - Num8 = 56, - Num9 = 57, - A = 65, - B = 66, - C = 67, - D = 68, - E = 69, - F = 70, - G = 71, - H = 72, - I = 73, - J = 74, - K = 75, - L = 76, - M = 77, - N = 78, - O = 79, - P = 80, - Q = 81, - R = 82, - S = 83, - T = 84, - U = 85, - V = 86, - W = 87, - X = 88, - Y = 89, - Z = 90, - MetaLeft = 91, - MetaRight = 92, - ContextMenu = 93, - Numpad0 = 96, - Numpad1 = 97, - Numpad2 = 98, - Numpad3 = 99, - Numpad4 = 100, - Numpad5 = 101, - Numpad6 = 102, - Numpad7 = 103, - Numpad8 = 104, - Numpad9 = 105, - NumpadMultiply = 106, - NumpadAdd = 107, - NumpadSubtract = 109, - NumpadDecimal = 110, - NumpadDivide = 111, - F1 = 112, - F2 = 113, - F3 = 114, - F4 = 115, - F5 = 116, - F6 = 117, - F7 = 118, - F8 = 119, - F9 = 120, - F10 = 121, - F11 = 122, - F12 = 123, - NumLock = 144, - ScrollLock = 145 - } - - // endregion - - interface NameValuePair { - name: string; - value: string; - } - - interface Coordinates { - left: number; - top: number; - } - - interface ValHook { - get?(elem: TElement): any; - set?(elem: TElement, value: any): any; - } -} - -// region Legacy types - -interface JQueryCallback extends JQuery.Callbacks { } -interface JQueryDeferred extends JQuery.Deferred { } -interface JQueryEventConstructor extends JQuery.Event { } -interface JQueryDeferred extends JQuery.Deferred { } -interface JQueryAjaxSettings extends JQuery.AjaxSettings { } -interface JQueryAnimationOptions extends JQuery.EffectsOptions { } -interface JQueryCoordinates extends JQuery.Coordinates { } -interface JQueryGenericPromise extends JQuery.Thenable { } -interface JQueryXHR extends JQuery.jqXHR { } -interface JQueryPromise extends JQuery.Promise { } -interface JQuerySerializeArrayElement extends JQuery.NameValuePair { } - -/** - * @deprecated 1.9 - */ -interface JQuerySupport extends JQuery.PlainObject { } - -// Legacy types that are not represented in the current type definitions are marked deprecated. - -/** - * @deprecated - */ -interface JQueryPromiseCallback { - (value?: T, ...args: any[]): void; -} -/** - * @deprecated - */ -interface JQueryParam { - /** - * Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request. - * - * @param obj An array or object to serialize. - * @param traditional A Boolean indicating whether to perform a traditional "shallow" serialization. - */ - (obj: any, traditional?: boolean): string; -} -/** - * @deprecated - */ -interface BaseJQueryEventObject extends Event { - /** - * The current DOM element within the event bubbling phase. - * @see {@link https://api.jquery.com/event.currentTarget/} - */ - currentTarget: Element; - /** - * An optional object of data passed to an event method when the current executing handler is bound. - * @see {@link https://api.jquery.com/event.data/} - */ - data: any; - /** - * The element where the currently-called jQuery event handler was attached. - * @see {@link https://api.jquery.com/event.delegateTarget/} - */ - delegateTarget: Element; - /** - * Returns whether event.preventDefault() was ever called on this event object. - * @see {@link https://api.jquery.com/event.isDefaultPrevented/} - */ - isDefaultPrevented(): boolean; - /** - * Returns whether event.stopImmediatePropagation() was ever called on this event object. - * @see {@link https://api.jquery.com/event.isImmediatePropagationStopped/} - */ - isImmediatePropagationStopped(): boolean; - /** - * Returns whether event.stopPropagation() was ever called on this event object. - * @see {@link https://api.jquery.com/event.isPropagationStopped/} - */ - isPropagationStopped(): boolean; - /** - * The namespace specified when the event was triggered. - * @see {@link https://api.jquery.com/event.namespace/} - */ - namespace: string; - /** - * The browser's original Event object. - * @see {@link https://api.jquery.com/category/events/event-object/} - */ - originalEvent: Event; - /** - * If this method is called, the default action of the event will not be triggered. - * @see {@link https://api.jquery.com/event.preventDefault/} - */ - preventDefault(): any; - /** - * The other DOM element involved in the event, if any. - * @see {@link https://api.jquery.com/event.relatedTarget/} - */ - relatedTarget: Element; - /** - * The last value returned by an event handler that was triggered by this event, unless the value was undefined. - * @see {@link https://api.jquery.com/event.result/} - */ - result: any; - /** - * Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree. - * @see {@link https://api.jquery.com/event.stopImmediatePropagation/} - */ - stopImmediatePropagation(): void; - /** - * Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event. - * @see {@link https://api.jquery.com/event.stopPropagation/} - */ - stopPropagation(): void; - /** - * The DOM element that initiated the event. - * @see {@link https://api.jquery.com/event.target/} - */ - target: Element; - /** - * The mouse position relative to the left edge of the document. - * @see {@link https://api.jquery.com/event.pageX/} - */ - pageX: number; - /** - * The mouse position relative to the top edge of the document. - * @see {@link https://api.jquery.com/event.pageY/} - */ - pageY: number; - /** - * For key or mouse events, this property indicates the specific key or button that was pressed. - * @see {@link https://api.jquery.com/event.which/} - */ - which: number; - /** - * Indicates whether the META key was pressed when the event fired. - * @see {@link https://api.jquery.com/event.metaKey/} - */ - metaKey: boolean; -} -/** - * @deprecated - */ -interface JQueryInputEventObject extends BaseJQueryEventObject { - altKey: boolean; - ctrlKey: boolean; - metaKey: boolean; - shiftKey: boolean; -} -/** - * @deprecated - */ -interface JQueryMouseEventObject extends JQueryInputEventObject { - button: number; - clientX: number; - clientY: number; - offsetX: number; - offsetY: number; - pageX: number; - pageY: number; - screenX: number; - screenY: number; -} -/** - * @deprecated - */ -interface JQueryKeyEventObject extends JQueryInputEventObject { - char: any; - charCode: number; - key: any; - keyCode: number; -} -/** - * @deprecated - */ -interface JQueryEventObject extends BaseJQueryEventObject, JQueryInputEventObject, JQueryMouseEventObject, JQueryKeyEventObject { } -/** - * @deprecated - */ -interface JQueryPromiseOperator { - (callback1: JQuery.TypeOrArray>, - ...callbacksN: Array>>): JQueryPromise; -} -/** - * @deprecated - */ -interface JQueryEasingFunction { - (percent: number): number; -} -/** - * @deprecated - */ -interface JQueryEasingFunctions { - [name: string]: JQueryEasingFunction; - linear: JQueryEasingFunction; - swing: JQueryEasingFunction; -} - -// endregion diff --git a/res/static/typescript/lib/uploader.ts b/res/static/typescript/lib/uploader.ts index 90aef1b..3e36296 100644 --- a/res/static/typescript/lib/uploader.ts +++ b/res/static/typescript/lib/uploader.ts @@ -5,7 +5,7 @@ interface FileUpload { name: string onProgress(progress: number) onFinished(id: string) - onFailure(response: JQuery.Ajax.ErrorTextStatus, error: string) + onFailure(errorID: string, errorMessage: string) } class UploadManager { @@ -84,37 +84,38 @@ class UploadWorker { formData.append("name", file.name) formData.append('file', file.file) - $.ajax({ - type: 'POST', - url: apiEndpoint+"/file", - data: formData, - timeout: 21600000, // 6 hours, to account for slow connections - cache: false, - async: true, - crossDomain: false, - contentType: false, - processData: false, - xhr: function () { - var xhr = new XMLHttpRequest(); - xhr.upload.addEventListener("progress", function (evt) { - if (evt.lengthComputable) { - file.onProgress(evt.loaded / evt.total) - } - }, false); - return xhr; - }, - success: function (data) { - file.onFinished(data.id) - that.setHistoryCookie(data.id) - console.log("Done: " + data.id) + var xhr = new XMLHttpRequest() + xhr.open("POST", apiEndpoint+"/file") + xhr.timeout = 21600000 // 6 hours, to account for slow connections + // Update progess bar on progress + xhr.upload.addEventListener("progress", function (evt) { + if (evt.lengthComputable) { + file.onProgress(evt.loaded / evt.total) + } + }); + + xhr.onreadystatechange = function(){ + if (xhr.readyState !== 4) {return;} + console.log("status: "+xhr.status) + + if (xhr.status >= 100 && xhr.status < 400) { + var resp = JSON.parse(xhr.response); + // Request is a success + file.onFinished(resp.id) + that.setHistoryCookie(resp.id) that.newFile() // Continue uploading on this thread - }, - error: function (xhr, status, error){ - console.log("status: "+status+" error: "+error) + } else { + var value, message + if (xhr.status >= 400) { + var resp = JSON.parse(xhr.response); + value = resp.value + message = resp.message + } + console.log("Upload error. status: "+xhr.status+" response: "+xhr.response) if (that.tries === 3) { - file.onFailure(status, error) + file.onFailure(value, message) setTimeout(function(){that.newFile()}, 2000) // Try to continue return; // Upload failed @@ -122,9 +123,11 @@ class UploadWorker { // Try again that.tries++ - setTimeout(function(){that.upload(file)}, that.tries*3000) + setTimeout(function(){that.upload(file)}, that.tries*5000) } - }); + } + + xhr.send(formData) } private setHistoryCookie(id: string){ diff --git a/res/static/yo.html b/res/static/yo.html deleted file mode 100644 index b920295..0000000 --- a/res/static/yo.html +++ /dev/null @@ -1 +0,0 @@ -yo \ No newline at end of file diff --git a/res/template/admin.html b/res/template/admin.html index 50b7a73..7a21eb5 100644 --- a/res/template/admin.html +++ b/res/template/admin.html @@ -4,7 +4,6 @@ {{template "meta_tags" "Administrator panel"}} {{template "user_style" .}} - {{$isAdmin := .PixelAPI.UserIsAdmin}} @@ -24,9 +23,11 @@
      + - + {{.OGData}} @@ -26,7 +24,7 @@
      - Back to the Home page @@ -49,19 +47,19 @@
      N/A
      {{template "advertisement" .}} @@ -75,33 +73,34 @@
      Share on:
      - + +
      {{template "spinner.svg"}}
      @@ -162,12 +161,16 @@
      - + - - - - - - @@ -23,7 +21,7 @@
      {{template "page_bottom" .}} - + {{template "analytics"}} {{end}} diff --git a/res/template/home.html b/res/template/home.html index 9ca7e06..ae3eb81 100644 --- a/res/template/home.html +++ b/res/template/home.html @@ -4,7 +4,6 @@ {{template "meta_tags" "Free file sharing service"}} {{template "user_style" .}} - {{template "page_top" .}} @@ -65,9 +64,12 @@ {{template "page_bottom"}} - - - + + {{template "analytics"}} diff --git a/res/template/paste.html b/res/template/paste.html index a318c65..e0fa230 100644 --- a/res/template/paste.html +++ b/res/template/paste.html @@ -4,7 +4,6 @@ {{template "meta_tags" "Text Upload"}} {{template "user_style" .}} -