我的脚本的作用:
我的chrome扩展程序中的脚本会检查URL中的#script并调用函数
该功能点击一些复选框,然后点击“提交”按钮
3秒后,脚本会使用#标签刷新网站以创建无限循环
问题:
复选框/ submit中的数据需要经过服务器 - 这就是我需要等待一段时间才能刷新的原因。 3秒似乎就足够了。
有时网站需要15秒才会在提交后将其重定向到新网站,但有时它会快速闪电并在重新加载之前的3秒之前打开新网站 - 因为打开的网站没有拥有#script
,我的循环停止工作。
我需要帮助:
从表单发送信息需要多长时间才能进入服务器?我知道我不必等待服务器的答案和重定向到新页面,但我想我无法立即刷新。
有没有办法检测新网站将在何时打开,以便脚本可以在此之前调用函数并使用#标签重定向到URL?甚至更好:检测从客户端完全发送信息然后立即刷新的时刻。
我想保持整个循环所需的时间尽可能短!
理解代码:
网站上的提交表单:
<form action="/withdraw-request" method="post">
<input type="hidden" name="_csrf" value="YEZknGzr-HW1ThkFrf9bO1M_IuQRJSVk-W6M">
<div id="items">...contains checkboxes...</div>
<input class="button right blue" type="submit" value="Withdraw selected items">
</form>
我的content.js(在Chrome扩展程序中):
chrome.extension.sendMessage({}, function(response) {
var readyStateCheckInterval = setInterval(function() {
if (document.readyState === "complete") {
clearInterval(readyStateCheckInterval);
if(window.location.hash=="#script") {
var tradestatus = document.getElementsByTagName("td");
console.log("Offer-status: " + tradestatus[8].innerHTML);
var oneKeyOnly = true;
function checkItem() {
var itemsArray = ["Apples", "Bananas", "Melons", ];
var matchingItems = [];
var x = document.getElementsByClassName("item");
for(var y = 0; y < x.length; y++){
if(itemsArray.indexOf(x[y].getAttribute("data-name")) >= 0){
var id = x[y].getElementsByClassName("item-checkbox")[0].getAttribute("id");
matchingItems.push(id);
}
}
return matchingItems;
}
function randomIntFromInterval(min,max)
{
return Math.floor(Math.random()*(max-min+1)+min);
}
function clickButton(val)
{
var buttons = document.getElementsByTagName('input');
for(var i = 0; i < buttons.length; i++)
{
if(buttons[i].type == 'submit' && buttons[i].value == val)
{
buttons[i].click();
console.log("Trying to withdraw!");
break;
}
}
}
var result = checkItem();
var lengthOfArray = result.length - 1;
if (oneKeyOnly == true) {
var rand = randomIntFromInterval(0,lengthOfArray);
document.getElementById(result[rand]).checked = true
console.log("Found: " + result[rand]);
}
else {
for(index=0, len = result.length; index < len; ++index) {
document.getElementById(result[index]).checked = true
keynr = index + 1;
console.log("Found " + result.length + " fruits - Selected Nr. " + keynr + "!");
}
}
clickButton("Withdraw selected items");
unloadready = true;
setTimeout((function(){ location.reload(true) }), 3000);
}
}
}, 10);
});
Withdraw.js:
Pastebin:http://pastebin.com/9q72Ti2b
它从某个地方被调用。我可以在chrome控制台旁边的“网络”标签中看到它。
我尝试使用谷歌一段时间了,发现了一个我试图修改的ajax文档和一段代码,所以它对我有用。还有一些我不理解的基本内容。
代码:
$('#submit').click(function()
{
$.ajax({
url: withdraw-request,
type:'POST',
data:
{
items,
_csrf
},
success: function(msg)
{
alert('Success!');
location.reload(true);
}
});
});
以下是该网站的表格,其中添加了一个复选框。
<form action="/withdraw-request" method="post">
<input type="hidden" name="_csrf" value="YEZknGzr-HW1ThkFrf9bO1M_IuQRJSVk-W6M">
<input type="checkbox" name="items" value="34155017" class="item-checkbox" id="item-34155017" data-price="562500">
<input class="button right blue" type="submit" value="Withdraw selected items">
</form>
因此,如果我理解正确,那么网站使用POST将“_csrf”和“items”发送到“撤回请求”(在代码中将名称添加到“数据”)。
为什么“撤回请求”中没有“.php”之类的内容?
如果表单没有自己的名称,如何调用此代码?
如何将“onClick”或“onSubmit”等内容添加到不属于我自己的网站,以及我无法更改实际代码的网站? 自己解决了这个问题!
document.getElementsByTagName(“FORM”)[1] .setAttribute(“onsubmit”,“specialFunction()”);
使它成功:
我将此添加到我的'content.js'中,为表单和ajax函数添加名称:
var formAdd = document.getElementsByTagName('FORM');
formAdd[1].setAttribute("id", "submitthisform");
var $form = $("#submitthisform");
// register handler for submit first
$form.submit(function (event) {
$.ajax({
type: $form.attr("method"),
url: $form.attr("action"),
data: $form.serialize()
})
.done(function (data) {
})
.fail(function (r, s, e) {
});
event.preventDefault();
});
我可以通过$form.submit();
来调用它。它似乎工作,但它仍然重定向到新页面。我在这里做错了什么?