在网站上启用 "paste" 的脚本

Script to enable "paste" on Website

问题涉及特定站点:tickets order on NS.nl。在该页面上有用于输入电子邮件的文本输入字段,并且该字段已禁用 Ctrl-V(粘贴)。

问题:什么 Greasemonkey 脚本可以在字段上启用粘贴?

我研究了各种解决方案,即:

并得出以下脚本(不幸的是)不适用于给定站点(使用 FF v40、Greasemonkey v3.4 进行测试):

// Taken from http://userscripts-mirror.org/scripts/review/40760
unsafeWindow.disable_paste = function() { return true; };

// jQuery is already available on the page:
var $j = jQuery.noConflict();

// Site generates the form on-the-fly, so we schedule the necessary modifications for later:
setTimeout(function() {
    $j(document).off('copy paste', '[data-regex=email], [data-regex=emailRepeat]');
    $j(document).off('keyup keydown keypress cut copy paste');

    // Taken from 
    $j('*').each(function(){                                                
        $j(this).unbind('paste');
    });
}, 2000);

使用延迟执行(通过 setTimeout())是因为网站动态构建表单。 "problematic" 元素显示在以下屏幕截图中:

  • 要取消绑定您应该提供页面设置的原始处理程序的事件:

    // ==UserScript==
    // @name         Re-enable copy/paste of emails
    // @include      https://www.ns.nl/producten/s/railrunner*
    // @grant        none
    // ==/UserScript==
    
    $(function() {
        $(document).off("copy paste",
                        "[data-regex=email], [data-regex=emailRepeat]", 
                        $._data(document, "events").paste[0].handler);
    });
    
  • 另一种仅在 Chrome 中有效的方法是为 oncopy/onpaste 元素属性分配一个直接事件侦听器,因此它将比附加到 document 的站点侦听器具有更高的优先级。在您的听众中防止其他听众通过 stopImmediatePropagation:

    看到该事件
    var input = document.querySelector("[data-regex=email], [data-regex=emailRepeat]");
    input.onpaste = input.oncopy = function(event) { event.stopImmediatePropagation() };
    

所选答案对我无效。我发现这个简单的脚本确实有效:

document.addEventListener('paste', function(e) {
  e.stopImmediatePropagation();
  return true;
}, true);

在此处找到:https://www.howtogeek.com/251807/how-to-enable-pasting-text-on-sites-that-block-it/

编辑:可能需要为 keydown 以及某些网站停止传播。

document.addEventListener('keydown', function(e) {
  e.stopImmediatePropagation();
  return true;
}, true);