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