[Greasemonkey] Arrgghh!!! it runs asynch!!!

chris feldmann cfeldmann at gmail.com
Wed Jun 28 10:12:13 EDT 2006


On 6/28/06, Tom Emerson <osnut at pacbell.net> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Anton Berezin wrote:
> > On Wed, Jun 28, 2006 at 01:06:35AM -0700, Tom Emerson wrote:
> >
> >> by the the first "GM_xmlhttprequest" completes, the script is over and
> >> done with the entire page -- only the last image gets updated!
> >
> > The closures bite!  The closures bite!  Tom is confused.  :-)
>
> no, just annoyed at the concept of a free-floating function embedded as
> a parameter to another function... (where did I leave the tylenol?)
>
> >> Now that I'm down to that last niggling detail, here is the
> >> script-thus-far:
> >
> > You just need a separate instance of thisCell variable by the time onload
> > function fires up.  So basically, replace
>
> I'm not entirely certain what you propose would work either -- I finally
> came to the realization that I needed to pass "my own parameter" to the
> callback, something along the lines of
>
>    onload: function(responseDetails,thisCell){...}
>
> so the particular instance (event/wakeup/whatever) of the called-back
> function would "know" which anchor to update.
>
> On that note... I'm happy to announce that as of 3:00am local time, I
> finally managed to monkey up my first page :) (woo-hoo!)
>
> What I finally realized is that there IS a bit of information that I can
> (logically) "pass" to the anonymous function -- the pass itself is
> indirect, but it seems to work.  Basically, the multi-digit ID that I
> use to retrieve the "details" page is ALSO on the details page, and by
> extension contained within the "refText" extracted out of the response.
>  This gives me a common "ID" between the icon/anchor to replace, and the
> replacement URL (and, in fact, solves another problem: the aspect ratio
> of the photos -- the "icon" is fixed at 15x15, which is obviously too
> small for most photos; at the same time, the information contained in
> the member details page includes a height/width specification, so as a
> result I can do this:
>
>   var Height  =
> refText.match(/http:\/\/photos.eharmony.com\/.+height="([0-9]+)"/)[1];
>   var Width   =
> refText.match(/http:\/\/photos.eharmony.com\/.+width="([0-9]+)"/)[1];
>   var id2     = refText.match(/<input type="hidden" name="set"
> value="([0-9]+)">/)[1];
>       id2     = 'id' + id2;
>
> (this brings up another headache that makes no sense -- the program gets
> "the entire raw response" in a string as follows:
>
>     onload: function(responseDetails) {
>         var refText = responseDetails.responseText;
>
> and refText.match(/some-expression/) works.
>
> If I then try to do this:
>
>         var newIMG = refText.match(/some extraction/g);
>         var imgWidth = newIMG.match(/some sub-extraction/g);
>
> I get the error that "newIMG.match" is not a function.  Several trials
> later I hit upon the solution above, but the inconsistency drove me nuts
> for quite some time)
>
> In any case, what I did to solve this was create a GLOBAL
> associative-array to store the "anchors" as they are extracted by the
> document.evaluate function, using the 9-digit "member-id" as the key to
> the array.  Then within the anonymous function, I create id2 using the
> same methodology, this then re-creates the "key" needed to find the
> "proper" anchor to replace.
>
> Now that I've scratched my own itch -- who else would like a copy of the
> final script?
>

I would indeed like to see the finished script.


More information about the Greasemonkey mailing list