Charaf JRA
Charaf JRA

Reputation: 8334

automatic clicks on links and doing something with every page's DOM

i have some links in a web page ,what i want to do :

What i have tried :

function start(){

    $('.category a').each(function(i){

         $.when($(this).trigger('click')).done(function() {

              fillProducts() ;
        });
     })
}

Thanks

Upvotes: 0

Views: 136

Answers (4)

megawac
megawac

Reputation: 11353

Here's a solution that may work for you if they are sending their ajax requests using jQuery. If they aren't you're going to need to get devilishly hacky to accomplish what you're asking (eg overriding the XMLHttpRequest object and creating a global observer queue for ajax requests). As you haven't specified how they're sending the ajax request I hope this approach works for you.

$.ajaxSetup({
    complete: function(jQXHR) {
        if(interested)
        //do your work
    }
});

The code below will click a link, wait for the ajax request to be sent and be completed, run you fillProducts function and then click the next link. Adapting it to run all the clicks wouldn't be difficult

function start(){
    var links = $('.category a');
    var i = 0;
    var done = function() {
        $.ajaxSetup({
            complete: $.noop//remove your handler
        });
    }
    var clickNext = function() {
        $(links.get(i++)).click();//click current link then increment i
    }
    $.ajaxSetup({
        complete: function(jQXHR) {
            if(i < links.length) {
                fillProducts();
                clickNext();
            } else {
                done();
            }
        }
    });
    clickNext();
}

If this doesn't work for you try hooking into the other jqXHR events before hacking up the site too much.

Edit here's a more reliable method in case they override the complete setting

(function() {
    var $ajax = $.ajax;
    var $observer = $({});

    //observer pattern from addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjquery
    var obs = window.ajaxObserver = {
        subscribe: function() {
            $observer.on.apply($observer, arguments);
        },
        unsubscribe: function() {
            $observer.off.apply($observer, arguments);
        },
        once: function() {
            $observer.one.apply($observer, arguments);
        },
        publish: function() {
            $observer.trigger.apply($observer, arguments);
        }
    };

    $.ajax = function() {
        var $promise = $ajax.apply(null, arguments);
        obs.publish("start", $promise);
        return $promise;
    };
})();

Now you can hook into $.ajax calls via

ajaxObserver.on("start", function($xhr) {//whenever a $.ajax call is started
    $xhr.done(function(data) {
        //do stuff
    })
});

So you can adapt the other snippet like

function start(){
    var links = $('.category a');
    var i = 0;

    var clickNextLink = function() {
        ajaxObserver.one("start", function($xhr) {
            $xhr.done(function(data) {
                if(i < links.length) {
                    fillProducts();
                    clickNextLink();
                } else {
                    done();
                }

            });
        })
        $(links.get(i++)).click();//click current link then increment i
    }
    clickNextLink();
}

Upvotes: 0

davethecoder
davethecoder

Reputation: 3932

I get ya now. This is like say:

when facebook loads, I want to remove the adverts by targeting specific class, and then alter the view that i actually see.

https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/

Is a plugin for firefox, this will allow you to create a javascript file, will then allow you to target a specific element or elements within the html rendered content.

IN order to catch the ajax request traffic, you just need to catcher that within your console.

I can not give you a tutorial on greasemonkey, but you can get the greasemonkey script for facebook, and use that as a guide.

http://mashable.com/2008/12/25/facebook-greasemonkey-scripts/

hope this is it

Upvotes: 0

RobH
RobH

Reputation: 3612

What you want to do is much more complicated than you seem to be giving it credit for. If you could scrape webpages, including AJAX content, in 7 lines of js in the console of a web browser you'd put Google out of business.

I'm guessing at what you want a bit, but I think you want to look at using a headless browser, e.g. PhantomJs. You'll then be able to scrape the target pages and write the results to a JSON file (other formats exist) and use that to fillProducts - whatever that does.

Also, are you stealing data from someone else's website? Cause that isn't cool.

Upvotes: 1

semirturgay
semirturgay

Reputation: 4201

try this:

function start(){

        $('.category a').each(function(i){

              $(this).click(); 
              fillProducts() ;

         })
    }

Upvotes: 0

Related Questions