fixing Google AdSense

Discussion in 'Javascript' started by Roedy Green, Jan 21, 2006.

  1. Roedy Green

    Roedy Green Guest

    Google Adsense is a scheme where by Google pays you to put ads on your
    website. see http://mindprod.com/jgloss/google.html#ADSENSE

    The catch is, the javascript they use makes the pages unusable when
    the adserver is not available either because google is down, the link
    to Google is down, or you are browsing pages offline.

    I know nothing of JavaScript. I have written to google about the
    problem and got one of those thanks for sharing form letters.

    I wondered if it what I want them to do is technically possible --
    suppress the ads when offline or the server does not respond in say 3
    seconds.

    Presuming Google does not fix the problem, I wondered if I could wrap
    or modify the JavaScript myself to make this work, or perhaps use some
    other technique.


    Here is the JavaScript they use:

    (function(){

    function m(b){return b!=null?'"'+b+'"':'""'}

    function C(b){if(typeof
    encodeURIComponent=="function"){return
    encodeURIComponent(b)}else{return escape(b)}}

    function B(b,a,d){var f=a.indexOf("?");
    var e="http://pagead2.googlesyndication.com/pagead/imp.gif?event=";
    e+=d;
    if(f!=-1&&f+1<a.length){e+="&"+a.substring(f+1)}var h='<img height="1"
    width="1" border="0" src='+m(e)+"/>";
    b.write(h)}

    function c(b,a){if(a){window.google_ad_url+="&"+b+"="+a}}

    function g(b,a){if(a){c(b,C(a))}}

    function l(b,a,d){if(a&&typeof
    a=="object"){a=a[d%a.length]}c("color_"+b,a)}

    function E(b,a){var d=b.screen;
    var f=navigator.javaEnabled();
    var e=-a.getTimezoneOffset();
    if(d){c("u_h",d.height);
    c("u_w",d.width);
    c("u_ah",d.availHeight);
    c("u_aw",d.availWidth);
    c("u_cd",d.colorDepth)}c("u_tz",e);
    c("u_his",history.length);
    c("u_java",f);
    if(navigator.plugins){c("u_nplug",navigator.plugins.length)}if(navigator.mimeTypes){c("u_nmime",navigator.mimeTypes.length)}}

    function
    y(b){b=b.toLowerCase();
    if(b.substring(0,3)!="ca-"){b="ca-"+b}return
    b}

    function
    H(b,a,d){d=d.substring(0,1000);
    d=d.replace(/%\w?$/,"");
    if(b.google_ad_output=="js"&&(b.google_ad_request_done||b.google_radlink_request_done)){a.write('<script
    language="JavaScript1.1" src='+m(d)+"></"+"script>")}else
    if(b.google_ad_output=="html"){if(b.name=="google_ads_frame"){B(a,d,"reboundredirect")}else{a.write('<iframe
    name="google_ads_frame" width='+m(b.google_ad_width)+"
    height="+m(b.google_ad_height)+"
    frameborder="+m(b.google_ad_frameborder)+" src="+m(d)+'
    marginwidth="0"'+' marginheight="0"'+' vspace="0"'+'
    hspace="0"'+' allowtransparency="true"'+'
    scrolling="no">');
    B(a,d,"noiframe");
    a.write("</iframe>")}}}

    function G(b){var a=null;
    b.google_ad_frameborder=a;
    b.google_ad_format=a;
    b.google_page_url=a;
    b.google_language=a;
    b.google_gl=a;
    b.google_country=a;
    b.google_region=a;
    b.google_city=a;
    b.google_hints=a;
    b.google_safe=a;
    b.google_encoding=a;
    b.google_ad_output=a;
    b.google_max_num_ads=a;
    b.google_ad_channel=a;
    b.google_contents=a;
    b.google_alternate_ad_url=a;
    b.google_alternate_color=a;
    b.google_color_bg=a;
    b.google_color_text=a;
    b.google_color_link=a;
    b.google_color_url=a;
    b.google_color_border=a;
    b.google_color_line=a;
    b.google_adtest=a;
    b.google_kw_type=a;
    b.google_kw=a;
    b.google_num_radlinks=a;
    b.google_max_radlink_len=a;
    b.google_rl_filtering=a;
    b.google_rl_mode=a;
    b.google_rt=a;
    b.google_ad_type=a;
    b.google_image_size=a;
    b.google_feedback=a;
    b.google_skip=a;
    b.google_page_location=a;
    b.google_referrer_url=a;
    b.google_ad_region=a;
    b.google_ad_section=a;
    b.google_bid=a;
    b.google_cpa_choice=a}

    function A(){var b=null;
    var a=window;
    var d=document;
    var f=new Date();
    var e=f.getTime();
    var h=a.google_ad_format;
    if(a.google_cpa_choice){a.google_ad_url="http://pagead2.googlesyndication.com/cpa/ads?";
    a.google_ad_url+="client="+escape(y(a.google_ad_client));
    a.google_ad_region="_google_cpa_region_";
    c("cpa_choice",a.google_cpa_choice)}else{a.google_ad_url="http://pagead2.googlesyndication.com/pagead/ads?";
    a.google_ad_url+="client="+escape(y(a.google_ad_client))}var
    k=a.google_num_slots_by_client;
    var w=a.google_num_slots_by_channel;
    var j=a.google_prev_ad_formats_by_region;
    a.onerror=a.google_org_error_handler;
    if(a.google_ad_region==b&&a.google_ad_section!=b){a.google_ad_region=a.google_ad_section}var
    i=a.google_ad_region==b?"":a.google_ad_region;
    var q=false;
    if(h){q=h.indexOf("_0ads")>0}if(q){if(a.google_num_0ad_slots){a.google_num_0ad_slots=a.google_num_0ad_slots+1}else{a.google_num_0ad_slots=1}if(a.google_num_0ad_slots>1){return}}else
    if(!a.google_cpa_choice){if(a.google_num_ad_slots){a.google_num_ad_slots=a.google_num_ad_slots+1}else{a.google_num_ad_slots=1}if(a.google_num_slots_to_rotate){j=b;
    if(a.google_num_slot_to_show==b){a.google_num_slot_to_show=e%a.google_num_slots_to_rotate+1}if(a.google_num_slot_to_show!=a.google_num_ad_slots){return}}else
    if(a.google_num_ad_slots>3&&i==""){return}}c("dt",f.getTime());
    c("hl",a.google_language);
    if(a.google_country){c("gl",a.google_country)}else{c("gl",a.google_gl)}c("gr",a.google_region);
    g("gcs",a.google_city);
    g("hints",a.google_hints);
    c("adsafe",a.google_safe);
    c("oe",a.google_encoding);
    c("lmt",a.google_last_modified_time);
    g("alternate_ad_url",a.google_alternate_ad_url);
    c("alt_color",a.google_alternate_color);
    c("skip",a.google_skip);
    var n=a.google_ad_client;
    if(!k[n]){k[n]=1;
    k.length+=1}else{k[n]+=1}if(j){g("prev_fmts",j.toLowerCase());
    if(k.length>1){c("slot",k[n])}}if(h){g("format",h.toLowerCase());
    if(j){j=j+","+h}else{j=h}}c("num_ads",a.google_max_num_ads);
    c("output",a.google_ad_output);
    c("adtest",a.google_adtest);
    if(a.google_ad_channel){var r=a.google_ad_channel.toLowerCase();
    g("channel",r);
    var s="";
    var t=r.split("+");
    for(var o=0;
    o<t.length;
    o++){var p=t[o];
    if(!w[p]){w[p]=1}else{s+=p+"+"}}g("pv_ch",s)}g("url",a.google_page_url);
    l("bg",a.google_color_bg,e);
    l("text",a.google_color_text,e);
    l("link",a.google_color_link,e);
    l("url",a.google_color_url,e);
    l("border",a.google_color_border,e);
    l("line",a.google_color_line,e);
    c("kw_type",a.google_kw_type);
    g("kw",a.google_kw);
    g("contents",a.google_contents);
    c("num_radlinks",a.google_num_radlinks);
    c("max_radlink_len",a.google_max_radlink_len);
    c("rl_filtering",a.google_rl_filtering);
    c("rl_mode",a.google_rl_mode);
    c("rt",a.google_rt);
    c("ad_type",a.google_ad_type);
    c("image_size",a.google_image_size);
    c("region",a.google_ad_region);
    c("feedback_link",a.google_feedback);
    g("ref",a.google_referrer_url);
    g("loc",a.google_page_location);
    c("bid",a.google_bid);
    if(z(a,d)&&d.body){var u=d.body.scrollHeight;
    var v=d.body.clientHeight;
    if(v&&u){g("cc",Math.round(v*100/u))}}E(a,f);
    H(a,d,a.google_ad_url);
    G(a)}

    function D(b,a,d){A();
    return true}

    function z(b,a){return b.top.location==a.location}

    function x(b,a){var d=a.documentElement;
    if(z(b,a))return
    false;
    if(b.google_ad_width&&b.google_ad_height){var f=1;
    var e=1;
    if(b.innerHeight){f=b.innerWidth;
    e=b.innerHeight}else
    if(d&&d.clientHeight){f=d.clientWidth;
    e=d.clientHeight}else
    if(a.body){f=a.body.clientWidth;
    e=a.body.clientHeight}if(e>2*b.google_ad_height||f>2*b.google_ad_width){return
    false}}return true}

    function F(){var b=window;
    var a=document;
    var d=a.location;
    var f=a.referrer;
    var e=null;
    b.google_org_error_handler=b.onerror;
    b.onerror=D;
    if(b.google_ad_frameborder==e){b.google_ad_frameborder=0}if(b.google_ad_output==e){b.google_ad_output="html"}if(b.google_ad_format==e&&b.google_ad_output=="html"){b.google_ad_format=b.google_ad_width+"x"+b.google_ad_height}if(b.google_page_url==e){b.google_page_url=f;
    if(!x(b,a)){b.google_page_url=d;
    b.google_last_modified_time=Date.parse(a.lastModified)/1000;
    b.google_referrer_url=f}}else{b.google_page_location=f;
    if(!x(b,a)){b.google_page_location=d}}if(b.google_num_slots_by_channel==e){b.google_num_slots_by_channel=new
    Array()}if(b.google_num_slots_by_client==e){b.google_num_slots_by_client=new
    Array()}if(b.google_prev_ad_formats_by_region==e){b.google_prev_ad_formats_by_region=new
    Array()}}

    F();
    A();
    })()
    --
    Canadian Mind Products, Roedy Green.
    http://mindprod.com Java custom programming, consulting and coaching.
     
    Roedy Green, Jan 21, 2006
    #1
    1. Advertising

  2. Roedy Green wrote:

    > Google Adsense is a scheme where by Google pays you to put ads on your
    > website. see http://mindprod.com/jgloss/google.html#ADSENSE
    >
    > The catch is, the javascript they use makes the pages unusable when
    > the adserver is not available either because google is down, the link
    > to Google is down, or you are browsing pages offline.


    Browsers like IE or Firefox have a setting to browse offline, I don't
    think they will make any requests to servers in that setting, be that
    for script files, ad images or other resources. So browsing offline with
    the proper setting on the browser shouldn't be the problem.

    And what does unusable mean? I could understand that page display is
    much delayed when such a script is not available, the browser has to
    wait with further rendering until it has the script and has it executed
    so there can be delays then until the connection times out and the
    browser continues without having the script.




    --

    Martin Honnen
    http://JavaScript.FAQTs.com/
     
    Martin Honnen, Jan 21, 2006
    #2
    1. Advertising

  3. Roedy Green

    Roedy Green Guest

    On Sat, 21 Jan 2006 16:01:55 +0100, Martin Honnen <>
    wrote, quoted or indirectly quoted someone who said :

    >And what does unusable mean? I could understand that page display is
    >much delayed when such a script is not available, the browser has to
    >wait with further rendering until it has the script and has it executed
    >so there can be delays then until the connection times out and the
    >browser continues without having the script.


    In the Opera browser which I use most often, it won't completely
    render the page below the ad until it has the ad contents. It will sit
    there for a very long time before it gives up maybe a minute or so.
    It does not "finish" rendering the page and give control back to you.

    I have 24-7 internet access, so most of the time it works fine.
    However I encourage people to mirror my site with the Replicator
    software and browse offline for speed.

    I run into a similar problem with webrings. See
    http://mindprod.com/jgloss/webring.html
    --
    Canadian Mind Products, Roedy Green.
    http://mindprod.com Java custom programming, consulting and coaching.
     
    Roedy Green, Jan 21, 2006
    #3
  4. Roedy Green

    VK Guest

    Roedy Green wrote:
    > I wondered if it what I want them to do is technically possible --
    > suppress the ads when offline or the server does not respond in say 3
    > seconds.


    Technically possible if it's for offline browsing - thus it's run on
    local drive - thus you may bypass cross-domain security limitations for
    ads iframe (say getting error messages from it).

    By did you try more simple way by setting defer flag?

    for conventional HTML:
    <script type="text/javascript" src="myScript.js" defer></script>
    or for XHTML (if you bother to use it):
    <script type="text/javascript" src="myScript.js"
    defer="defer"></script>

    This way the page will be rendered w/o delay, and script will fail
    seemlessly on the background.
     
    VK, Jan 21, 2006
    #4
  5. Roedy Green

    Roedy Green Guest

    On 21 Jan 2006 08:08:33 -0800, "VK" <> wrote,
    quoted or indirectly quoted someone who said :

    >By did you try more simple way by setting defer flag?


    I did not write that code. Google did. I don't even know how to read
    it, other than in a generic way since I speak Java, and many other
    computer languages, but not JavaScript.
    --
    Canadian Mind Products, Roedy Green.
    http://mindprod.com Java custom programming, consulting and coaching.
     
    Roedy Green, Jan 21, 2006
    #5
  6. Roedy Green

    VK Guest

    Roedy Green wrote:
    > On 21 Jan 2006 08:08:33 -0800, "VK" <> wrote,
    > quoted or indirectly quoted someone who said :
    >
    > >By did you try more simple way by setting defer flag?

    >
    > I did not write that code. Google did. I don't even know how to read
    > it, other than in a generic way since I speak Java, and many other
    > computer languages, but not JavaScript.


    I did not mean to change the code itself but set the "defer" flag for
    interpreter. In Java terms it would be like javac myProg.java -defer
    (there is not such flag in Java but the mechanics is close).
    "defer" is supported by the majority of browsers made over the last few
    years (IE, FF and Opera 8.x inclusive). It tells to interpreter that
    the code to execute doesn't change the page immediately during initial
    loading and that it doesn't provide any vital parts needed to render
    the page during the initial loading. This way the page is being
    rendered at the normal speed w/o waiting script results.

    JavaScript code is being inserted into page in two ways: either inline
    or as separate .js file:

    <script type="text/javascript" defer>
    // your code
    // ...
    </script>

    <script type="text/javascript" src="myScript.js" defer></script>

    Again: no changes needed in the code itself. If any problems please
    give us a link to some HTML page you want to destribute.
     
    VK, Jan 21, 2006
    #6
  7. Roedy Green wrote:

    > On 21 Jan 2006 08:08:33 -0800, "VK" <> wrote,
    > quoted or indirectly quoted someone who said :
    >
    >
    >>By did you try more simple way by setting defer flag?

    >
    >
    > I did not write that code. Google did.


    He was simply suggesting to use
    <script type="text/javascript" defer>
    // script code goes here
    </script>
    respectively
    <script type="text/javascript" src="file.js" defer></script>
    in your HTML documents where you include the script. Not a change to the
    script itself.
    That defer attribute however is something only IE supports and anything
    the script will output (with document.write) then will end up at a
    different location than before as IE will treat the script differently
    <http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/defer.asp>
    and defer its execution till the HTML of the page has been parsed.

    --

    Martin Honnen
    http://JavaScript.FAQTs.com/
     
    Martin Honnen, Jan 21, 2006
    #7
  8. Roedy Green

    Matt Kruse Guest

    Roedy Green wrote:
    > The catch is, the javascript they use makes the pages unusable when
    > the adserver is not available either because google is down, the link
    > to Google is down, or you are browsing pages offline.


    I've never seen evidence that a page becomes 'unusable'.

    What I do hate about AdSense, though, is that the body's onLoad doesn't fire
    until it's loaded, and it's often slow.

    A while ago, I messed around with a consistent way to defer the loading of
    the iframe by re-assigning the document.write function to actually store the
    google content in a variable, which I then wrote out later after the page
    was loaded. It was quite a hack, though.

    Is there a more solid solution for consistently deferring the adsense
    content load so the body's onLoad event fires without waiting for the google
    content to load?

    --
    Matt Kruse
    http://www.JavascriptToolbox.com
    http://www.AjaxToolbox.com
     
    Matt Kruse, Jan 21, 2006
    #8
  9. Roedy Green

    Jim Ley Guest

    On Sat, 21 Jan 2006 14:41:58 -0600, "Matt Kruse"
    <> wrote:

    >Is there a more solid solution for consistently deferring the adsense
    >content load so the body's onLoad event fires without waiting for the google
    >content to load?


    Your better bet is to just avoid doing stuff onload - there's very
    little that's relevant to onload other than doing "is all content
    available so hide the loading... div", which use case requires the
    google ads are loaded too.

    Jim.
     
    Jim Ley, Jan 21, 2006
    #9
  10. Roedy Green

    Matt Kruse Guest

    Jim Ley wrote:
    > Your better bet is to just avoid doing stuff onload - there's very
    > little that's relevant to onload other than doing "is all content
    > available so hide the loading... div", which use case requires the
    > google ads are loaded too.


    A lot of "unobtrusive javascript" techniques wait until the page is loaded
    to then go back and alter the page contents with extended js functionality.

    The alternative is to just load the script at the bottom of the page after
    your content, but
    1) Loading all scripts in the <head> is cleaner
    and
    2) There is no spec that says the DOM objects must be available to script as
    soon as they are parsed, so waiting until the document is loaded and
    available is the best approach

    Or do you have a differing opinion?

    --
    Matt Kruse
    http://www.JavascriptToolbox.com
    http://www.AjaxToolbox.com
     
    Matt Kruse, Jan 21, 2006
    #10
  11. Roedy Green

    Jim Ley Guest

    On Sat, 21 Jan 2006 15:38:56 -0600, "Matt Kruse"
    <> wrote:

    >Jim Ley wrote:
    >> Your better bet is to just avoid doing stuff onload - there's very
    >> little that's relevant to onload other than doing "is all content
    >> available so hide the loading... div", which use case requires the
    >> google ads are loaded too.

    >
    >A lot of "unobtrusive javascript" techniques wait until the page is loaded
    >to then go back and alter the page contents with extended js functionality.


    Yes, they're flawed, because the user gets inconsistent,
    non-deterministic behaviour until after all the content comes in. As
    you have noticed with adsense on slow connections it's really poor.

    The "head is cleaner" is just silly, if we were actually going for
    cleanliness we wouldn't be using the mess that is HTML/JS developing,
    if it's really a problem for you, just generate a pre-processor. But
    I refuse to accept:

    <html>
    <head><script ... ></head>
    <body>
    ... content ... content ...
    <script ...>
    page_load()
    </script>
    </body>
    </html>

    is going to significantly impact any cleanliness measure. Of course
    even that isn't perfect you still get delays, but at least it's
    considerably less delays as there's no images etc. being downloaded.

    The lack of a standard argument is also pretty silly, you can easily
    deal with that by object detection and also doing it onload.

    Jim.
     
    Jim Ley, Jan 21, 2006
    #11
  12. Roedy Green

    Matt Kruse Guest

    Jim Ley wrote:
    > The "head is cleaner" is just silly


    I disagree.
    If for no other reason than distribution of generalized scripts to a large
    audience. Including a script before </body> is, in my experience, something
    that confuses a lot of people. Also, in some web applications the user may
    have access to adding scripts to the <head> but that's it, because the rest
    of the page is driven by a template engine or something.

    But I also realize those are pretty weak arguments ;)

    > The lack of a standard argument is also pretty silly, you can easily
    > deal with that by object detection and also doing it onload.


    I'm not sure that's possible. If your script scans the document for items
    with a certain class, for example, the user agent may allow you to see the
    'document' object and run getElementsByTagName but return no results. At
    that point, it's impossible to know whether it needs to be run again on page
    load or if there just aren't any elements in the page.

    Nevertheless, in many applications and web sites onLoad is used frequently.
    I would still be interested in knowing about a better method of deferring
    the adsense load so it doesn't delay the firing of the onload event.

    --
    Matt Kruse
    http://www.JavascriptToolbox.com
    http://www.AjaxToolbox.com
     
    Matt Kruse, Jan 21, 2006
    #12
  13. Roedy Green

    Jim Ley Guest

    On Sat, 21 Jan 2006 16:56:55 -0600, "Matt Kruse"
    <> wrote:

    >Jim Ley wrote:
    >> The lack of a standard argument is also pretty silly, you can easily
    >> deal with that by object detection and also doing it onload.

    >
    >I'm not sure that's possible. If your script scans the document for items
    >with a certain class, for example, the user agent may allow you to see the
    >'document' object and run getElementsByTagName but return no results. At
    >that point, it's impossible to know whether it needs to be run again on page
    >load or if there just aren't any elements in the page.


    Of course you can, you just run it again regardless, and only perform
    the action on those you didn't the first time.

    >Nevertheless, in many applications and web sites onLoad is used frequently.


    Yes, but it's better to fix that, which will improve your users
    experience rather than try to solve a symptom:

    >I would still be interested in knowing about a better method of deferring
    >the adsense load so it doesn't delay the firing of the onload event.


    All content delays firing the onload event, so I hope you're also
    doing things like empty images which you swap in place on load too.

    Jim.
     
    Jim Ley, Jan 21, 2006
    #13
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Trevor

    Google Announces Adsense

    Trevor, Jun 24, 2003, in forum: HTML
    Replies:
    5
    Views:
    950
    Jerry Muelver
    Jun 26, 2003
  2. John D.

    Google - adsense

    John D., May 14, 2004, in forum: HTML
    Replies:
    6
    Views:
    508
    Denis McMahon
    Dec 30, 2012
  3. Looking
    Replies:
    15
    Views:
    999
  4. shapper
    Replies:
    1
    Views:
    955
    Ken Cox [Microsoft MVP]
    Oct 3, 2006
  5. Dr. Clue
    Replies:
    4
    Views:
    132
    Bill H
    Aug 27, 2007
Loading...

Share This Page