Paste sample text into each field and observe. Green outline pulse = PasteNinja intervened. No pulse = browser-native paste worked (or nothing happened).
The classic: onpaste="return false" or its equivalent addEventListener("paste", (e) => e.preventDefault())
Simulates a controlled component that reverts when inputType === "insertFromPaste". Immune to solutions that stop propagation of paste events (eg the "Don't F*** With Paste" extension).
Select "Good" and paste "Great".
The Great Gatsby. Blocked field gets a green pulse. Undo works in both.<input type="number">Number inputs attempt to convert incoming text to numeric values. Behavior is quirky but should be the same in both fields.
A web component wrapping its own <input>, the shape Chase's mds-text-input uses. Shadow DOM retargets the paste event on its way out, so a listener on document sees the host custom element rather than the field — the bug that made PasteNinja fail silently on a Chase wire transfer.
Some inputs intercept paste events to implement some sort of desired functionality. Anti-paste-blocker tools that suppress propagation of paste events (eg "Don't F*** With Paste") can break these. PasteNinja doesn't.
This example detects URLs and turns them into markdown links.
[https://...](https://...) markdown links. No green pulse — PasteNinja stays out of the way.