Javascript 如何拦截读取文本输入的值?

Javascript 如何拦截读取文本输入的值?,javascript,jquery,greasemonkey,tampermonkey,Javascript,Jquery,Greasemonkey,Tampermonkey,我正在为各种第三方网站编写一些Greasemonkey/Tampermonkey脚本。(添加越南语文本输入的Unicode标准化,并按照网站预期将字符组合为预合成字符。) 在简单的站点上,我能够找到它们捕获、通常提交的事件,并在站点脚本处理之前处理文本输入的内容 但在AJAXy网站上,他们可能会做一些事情,比如在每个按键或定时器上测试输入。(我不想在键入时更改文本规范化,因为更改音调标记会弄乱退格的语义) 每次站点脚本试图从DOM获取输入元素中的文本时,是否有一种方法可以捕获这些文本?可能是我以

我正在为各种第三方网站编写一些Greasemonkey/Tampermonkey脚本。(添加越南语文本输入的Unicode标准化,并按照网站预期将字符组合为预合成字符。)

在简单的站点上,我能够找到它们捕获、通常提交的事件,并在站点脚本处理之前处理文本输入的内容

但在AJAXy网站上,他们可能会做一些事情,比如在每个按键或定时器上测试输入。(我不想在键入时更改文本规范化,因为更改音调标记会弄乱退格的语义)

每次站点脚本试图从DOM获取输入元素中的文本时,是否有一种方法可以捕获这些文本?可能是我以前从未使用过的带有
原型的东西,或者不会,因为它处理的是DOM/主机对象,等等


我目前正在使用的站点似乎总是使用jQuery
.val()
来获取文本输入的文本值。我猜至少有一些深奥的方法可以拦截jQuery,但如果可能的话,我真的很想知道在最低级别拦截jQuery的方法。

我已经找到了jQuery案例的答案,但还没有找到低级别/非jQuery案例的答案

jQuery:

jQuery.valHooks.text = {
  get: function (elem) {
    // check fields of elem if only intercepting specific text elements
    return doSomeTransformation(elem.value);
  }
};

我通过使用jQuery的
valHooks

特性找到了解决方案。您可以通过覆盖
属性的
值来更改页面javascript所看到的内容2。请注意,这个覆盖也会更改jQuery和其他库所看到的内容:

Object.defineProperty (HTMLInputElement.prototype, "value", {
    get: function () {
        return "xxx";
        //return this.value;  //-- Warning! This causes infinite recursion.
    }
} );

下面的代码片段显示了一个更实用的示例(仅限Firefox。我认为在Chrome中没有一种可行的方法可以做到这一点,而不会带来严重的并发症——请参阅下面的参考错误。)

此示例正常报告输入值,直到您按下“欺骗”按钮。按“列表”按钮查看javascript认为输入值是什么:

window.fakeInput=false;
$(文件).ready(jQueryMain);
函数列表值(序言){
$(“#输出”).append(“
  • ”+序言+$(“#inpTarg”).val()+”
  • ); } 函数jQueryMain(){ //--这适用于Firefox,但不适用于Chrome! var oldInpValDescriptor=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,“值”); if(oldInpValDescriptor==null){ //参见Chrome发行版43394和许多相关内容。 警报(“此浏览器不支持覆盖value属性”); 返回; } Object.defineProperty(HTMLInputElement.prototype,“值”{ get:function(){ if(window.fakeInput&&this.id==“inpTarg”){ console.log(“欺骗…”); return document.getElementById(“inpsopof”).value; } 返回oldInpValDescriptor.get.call(this); } } ); $(“#btnPrint”)。单击(函数(){ ListValue(“”); } ); $(“#btnHijack”)。单击(函数(){ window.fakeInput=!window.fakeInput; var onOffStr=window.fakeInput?“开”:“关”; if(window.fakeInput) $(“#btnHijack”).text('Restore Input'); 其他的 $(“#btnHijack”).text(‘劫持输入’); ListValue('Hijack'+onOffStr+'.Value='); } ); }
    
    
    目标值:
    欺骗值:

    劫持输入
    列表值


    如果您愿意,可以随意添加一些答案,或者关于以非“x Y”方式回答的评论。不确定您的意思,但是没有足够的信息来回答相关问题。这个问题需要一个MCVE来解决。至于以非“x-y”方式回答问题,则包括在内。我回答了这个问题:(1)因为这是一个有趣的问题,可能是一个安全问题,(2)以防万一我不认为在不了解第三方网站的内部工作原理的情况下,我能想出一个MCVE,我正在用一个用户脚本进行修补\-: