Как я могу изменить переменную JavaScript, используя Greasemonkey? - PullRequest
1 голос
/ 20 апреля 2011

Это страница, которую я пытаюсь изменить, я хочу обойти таймер обратного отсчета, как мне написать скрипт?Можно ли изменить переменную document.licenseform.btnSubmit.disabled на yes с помощью Greasemonkey?


<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>dsfsdf</title>
</head>
<body>
<form name="licenseform" method="post" action="">
<input name="btnSubmit" type="button" value="我同意">
</form>
<SCRIPT language=javascript type=text/javascript>
    <!--
                     var secs = 9;
                     var wait = secs * 1000;
                     document.licenseform.btnSubmit.value = "我同意 [" + secs + "]";
                     document.licenseform.btnSubmit.disabled = true;

                     for(i = 1; i <= secs; i++)
                     {
                           window.setTimeout("Update(" + i + ")", i * 1000);
                                   //这一句很关键,记得参数写法为("update("+i+")",i*1000)
                     }
                     window.setTimeout("Timer()", wait);


                     function Update(num)
                     {
                           if(num != secs)
                           {
                                 printnr = (wait / 1000) - num;
                                 document.licenseform.btnSubmit.value = "我同意 [" + printnr + "]";
                           }
                     }

                     function Timer()
                     {
                           document.licenseform.btnSubmit.disabled = false;
                           document.licenseform.btnSubmit.value = " 我同意 ";
                     }
                     -->
                     </SCRIPT>
    </td>
    <!--网页中部中栏代码结束-->
</body>
</html>

Ответы [ 4 ]

4 голосов
/ 20 апреля 2011

Более безопасной альтернативой использованию unsafeWindow является внедрение кода в документ.Внедренный вами код будет работать в том же контексте, что и код страницы, поэтому он будет иметь прямой доступ ко всем переменным там.Но у него не будет доступа к переменным или функциям в других частях кода вашего пользовательского скрипта.

Другое преимущество внедрения кода заключается в том, что написанный таким образом пользовательский скрипт будет работать как в Chrome, так и в Firefox.Chrome вообще не поддерживает unsafeWindow.

Мой любимый способ ввода кода - написать функцию, а затем использовать этот повторно используемый код для возврата исходного кода функции:

// 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);

Помните, что при использовании сериализованной формы функции таким образом нормальная область закрытия не будет работать.Введенная вами функция не будет иметь доступа к переменным в вашем скрипте, если они не определены внутри этой функции.

0 голосов
/ 20 апреля 2011

Не обращайте внимания на все, что сказано о «небезопасной», потому что операция записи в скрипт -> совершенно безопасна.

unsafeWindow.document.licenseform.btnSubmit.disabled = false;

(используйте метод mkoryak для подавления обратного вызова timeout).возможно, захотите обойти это полностью:

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

Видите?

0 голосов
/ 20 апреля 2011

Это возможно. Короткий ответ: вы можете использовать объект unsafeWindow, например

unsafeWindow.document.licenseform.btnSubmit.disabled = true;

Однако делать это не рекомендуется, потому что это небезопасно. Больше информации об этом здесь: http://wiki.greasespot.net/UnsafeWindow

0 голосов
/ 20 апреля 2011

попробуйте вызвать функцию Timer (), поскольку в любом случае вы хотите, чтобы она происходила:

unsafeWindow.Timer();

, пока вы находитесь в ней, измените функцию обновления, чтобы ничего не делать:

unsafeWindow.update = function(){}
...