如何使用Greasemonkey更改JavaScript变量?

如何使用Greasemonkey更改JavaScript变量?,javascript,variables,greasemonkey,Javascript,Variables,Greasemonkey,这是我试图修改的页面,我想绕过倒计时,我应该如何编写脚本? 是否有办法使用Greasemonkey将变量document.licenseform.btnSubmit.disabled更改为yes 尝试调用计时器函数,因为这正是您想要的: unsafeWindow.Timer(); 执行此操作时,请将更新功能更改为不执行任何操作: unsafeWindow.update = function(){} 这是可能的。简单的回答是,例如,您可以使用对象窗口 unsafeWindow.document

这是我试图修改的页面,我想绕过倒计时,我应该如何编写脚本? 是否有办法使用Greasemonkey将变量document.licenseform.btnSubmit.disabled更改为yes


尝试调用计时器函数,因为这正是您想要的:

unsafeWindow.Timer();
执行此操作时,请将更新功能更改为不执行任何操作:

unsafeWindow.update = function(){}

这是可能的。简单的回答是,例如,您可以使用对象窗口

unsafeWindow.document.licenseform.btnSubmit.disabled = true;
但是,不建议这样做,因为这是不安全的。有关这方面的更多信息,请点击此处:
使用unsafeWindow的一个更安全的替代方法是将代码注入文档。您注入的代码将在与页面代码相同的上下文中运行,因此它将直接访问其中的所有变量。但它将无法访问用户脚本代码其他部分中的变量或函数

注入代码的另一个好处是,以这种方式编写的用户脚本可以在Chrome和Firefox中工作。Chrome根本不支持非安全窗口

我最喜欢的代码注入方式是编写函数,然后使用此可重用代码获取函数的源代码:

// Inject function so that in will run in the same context as other
// scripts on the page.
function inject(func) {
    var source = func.toString();
    var script = document.createElement('script');
    // Put parenthesis after source so that it will be invoked.
    script.innerHTML = "("+ source +")()";
    document.body.appendChild(script);
}
要切换btnSubmit,可以编写如下脚本:

function enableBtnSubmit() {
    document.licenseform.btnSubmit.disabled = false;
    document.licenseform.btnSubmit.value = " 我同意 ";
    // Or just invoke Timer()
}

function inject(func) {
    var source = func.toString();
    var script = document.createElement('script');
    script.innerHTML = "("+ source +")()";
    document.body.appendChild(script);
}

inject(enableBtnSubmit);

请记住,当您以这种方式使用函数的序列化形式时,正常的闭包作用域将不起作用。您注入的函数将无法访问脚本中的变量,除非这些变量是在该函数中定义的。

忽略任何关于不安全的说法,因为脚本->文档写入操作是完全安全的

unsafeWindow.document.licenseform.btnSubmit.disabled = false;
使用mkoryak的方法抑制超时回调 该给定表单只包含超时,因此您可能希望完全绕过它:

// this example is INSECURE 
unsafeWindow.document.licenseform.submit();

看到了吗

恢复:任何涉及不安全的事情都是不安全的。其他一切都是安全的。看见
// this example is INSECURE 
unsafeWindow.document.licenseform.submit();