beforeinstallprompt
prompt()
let installPromptEvent; window.addEventListener('beforeinstallprompt', (event) => { // Prevent Chrome <= 67 from automatically showing the prompt event.preventDefault(); // Stash the event so it can be triggered later. installPromptEvent = event; // Update UI notify the user they can add to home screen document.querySelector('#install-button').disabled = false; });
beforeinstallpromptevent
const request = new PaymentRequest([{ // Your custom payment method identifier comes here supportedMethods: 'https://bobpay.xyz/pay' }], { total: { label: 'total', amount: { value: '10', currency: 'USD' } } });
sandbox
iframe
freeze
resume
document.wasDiscarded
chrome://discards
overflow
overflow-x
overflow-y
object-position
perspective-origin
"top right 20%"
'x'
'dppx'
Gamepad.timestamp
DOMHighResTimeStamp
PerformanceTiming.navigationStart
innerHTML
Cmd-Tab
Alt-Tab
Esc
PointerEvents
fromElement
toElement
MouseEvent
PointerEvent
target
relatedTarget
TouchEvent
navigator.vibrate()
AudioParam.automationRate
AudioParam
BiquadFilterNode
importScripts
ServiceWorkerRegistration.updateViaCache
brightness()
document.createTouch()
Touch()
Document.selectedStylesheetSet
Document.preferredStylesheetSet
<foreignObject>
DOMTokenList.replace()
contains()
mousedown
auxclick
mouseup
keydown
keypress
keyup
BigInt()
n'
shape-outside
flex
Accept-CH-Lifetime
TransformStream
ReadableStream
WritableStream
function textDecodeTransform() { const decoder = new TextDecoder(); return new TransformStream({ transform(chunk, controller) { controller.enqueue(decoder.decode(chunk, { stream: true })); } }); } fetch(url).then(response => { // response.body is a stream of Uint8Array chunks. // But if we want chunks of text: const stream = response.body.pipeThrough(textDecodeTransform()); // … });
<slot>
display: contents
Expect-CT
-webkit-box
<img>
ImageBitmap
ImageBitmapRenderingContext
<canvas>
const image = await createImageBitmap(imageBlob); const canvas = document.createElement('canvas'); const context = canvas.getContext('bitmaprenderer'); context.transferFromImageBitmap(image); canvas.toBlob((outputJPEGBlob) => { // Do something with outputJPEGBlob. }, 'image/jpeg');
createImageBitmap()
imageBlob
el.style.opacity = 0.3; el.style.opacity === "0.3"
el.attributeStyleMap.set("opacity", CSS.number("0.3")); el.attributeStyleMap.get("opacity").value === 0.3
CSSUnitValue
execCommand('copy')
try { await navigator.clipboard.writeText("Hello, clipboard."); } catch { console.error("Unable to write to clipboard."); }
const data = await navigator.clipboard.readText(); console.log("From the clipboard:", data);
ScriptProcessorNode
AudioWorklet
PaintWorklet
AnimationWorklet
add
accumulate
calc(),
min()
max()
rgb()
rgba()
deviceorientation
deviceorientationabsolute
devicemotion
'self'
<textarea>
<select>
autocomplete
click
input
change
window.focus(),
MediaStreamTrack
getCapabilities()
MediaTrackCapabilities
Function.prototype.toString()
catch
try
String.prototype.trimStart()
String.prototype.trimEnd()
String.prototype.trim()
trimLeft()
trimRight()
Array.prototype.values()
grid-gap
gap
grid-row-gap
row-gap
grid-column-gap
column-gap
The default value for all three is normal and the prefixed properties are aliases of the new ones. Note that column-gap property already exists and is used by css-multicol.
normal
css-multicol
table-row
table-row-group
table-header-group
table-footer-group
table-cell
table-caption
<tr>
<tbody>
<tfoot>
<thead>
autoplay
keepalive
sendBeacon()
AbortSignal
AbortController
fetch
abortController.abort()
const controller = new AbortController(); const signal = controller.signal; const requestPromise = fetch(url, { signal }); // Abort the fetch: controller.abort();
same-origin
CORS
FetchEvent.clientId
RTCRtpSender.dtmf
CreateDTMFSender()
top right 20%
ImageCapture.prototype.setOptions()
document.createTouchList()
AudioParam.prototype.value
AudioParam.prototype.setTargetAtTime()