点击“提交”,发送数据,但不要将网页重定向到新网址

时间:2016-06-02 16:29:30

标签: javascript loops google-chrome-extension reload

我的脚本的作用:

  • 我打开https://mylink.com/#script

    • 我的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控制台旁边的“网络”标签中看到它。

Edit_1:

我尝试使用谷歌一段时间了,发现了一个我试图修改的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()”);

Edit_2:

使它成功:

我将此添加到我的'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();来调用它。它似乎工作,但它仍然重定向到新页面。我在这里做错了什么?

0 个答案:

没有答案