I believe I have figured out how to make things work.  I don't think this 
is actually a problem with scope and script vs page permissions.  I think 
it's an issue with jQuery not doing something correctly.    I was able to 
replace my code that called $(object).click() with a function written by 
myself (in script scope obviously) that actually clicks the link.     That 
function runs properly, no error, and I was able to get the script 
functional again.  I didn't have to insert anything into the page and the 
script seems to be functioning well again. 

What I found odd was I was not asking to run anything inside the page that 
was trying to get back to the script level.  I was simply trying to click 
on a link in the page and jquery couldn't click it.   Perhaps jQuery tries 
to call itself recursively after the click or something - as a callback?? 
 That might cause the click (in jQuery) to try to call back to the script 
scope? 

Anyway - I was able to solve the problem I was having with the script.  I 
do want to gain more understanding about how to use cloneInto.

I also found another change from GM 1.5 to GM 2.0 -- it appears that it's 
either leaner or cleans things up better because executing behavior on 
objects in the page in a setTimeout doesn't function the same way every 
time in both versions.  I had to explicitly trap all of my delayed clicks 
in enclosures to insure they stay defined.  The objects were still on the 
page but Greasemonkey appears to whack defined variables  before the 
setTimeout occurs now.  (the full scope of the script isn't available to 
the setTImeout routine). 

On Saturday, July 19, 2014 7:05:24 AM UTC-4, Daniel Wynalda wrote:
>
> You obviously understand this way better than I do.  I usually think of 
> myself as a fairly competent programmer but the talk about scope loses me I 
> guess.  I am simply trying to click something in a page.  There is jQuery 
> *in the page* and there is jQuery in my script (different instances).  I'm 
> simply looking to find out how I can click the button.  
>
> In my really basic example I have set up a webpage:
> http://hithuntheal.com/x.php
>
> and I have set up a script to click on the button
> http://hithuntheal.com/x.user.js
>
> I'm trying to get the script to click the button - and allow for 
> GM_setValue/GM_getValue.
>
> How can I click an element in the page?   I find it odd that I can get the 
> onClick attribute just fine but I can't click the element. 
>
>
> On Friday, July 18, 2014 10:56:38 AM UTC-4, TheVindicar wrote:
>>
>> >So if jQuery isn't allowed to touch things in the page
>> Not quite... script scope jQuery CAN touch things in the page scope just 
>> fine, but if it tries to call functions from the page scope (callback, 
>> event handlers, whatever!) and feed them objects in the script scope (since 
>> it doesn't know about scopes), then error happens.
>>
>> >Interestingly if I use jQuery to modify elements in the page I don't 
>> have any issue.   I change text, I rearrange things, etc.   
>> Regular DOM manipulations are fine, since all objects involved belong to 
>> page scope. So it's script scope function accessing page scope (which works 
>> since script scope is more privileged). Problems arise when it's the other 
>> way around - page scope function trying to access script scope.
>>
>> >I could call the jQuery in the page - if I knew how to do it.
>>     var $ = unsafeWindow.jQuery;
>> That's all! You can work with that jQuery, but again, once you give it 
>> object, array, or function created in script scope, it will choke. 
>>
>> >My basic problem remains the same - I don't understand how to call 
>> something in the page when I have @grant set.
>> What do you mean by "call"?
>> You can call a function from the page just fine, as long as you give it 
>> only primitive values (strings and numbers) and objects from page scope 
>> (either exported or created there) to work with. So:
>>
>>   unsafeWindow.PageFunction( {data:1} ); //error, object is in the script 
>> scope
>>
>>   var myobj = new unsafeWindow.Object(); //creating object in page scope
>>   myobj['data'] = 1; //if value was an object/array, you'd have to export 
>> it too, or create in page scope as above
>>   unsafeWindow.PageFunction(myobj); //should work
>>
>>   unsafeWindow.PageFunction( cloneInto({data:1}, unsafeWindow) ); 
>> //should work
>>
>> If you mean "execute your code with privileges of page scope", though... 
>> On #greasemonkey at FreeNode I've been told that the most practical way to 
>> actually run code in page scope is to inject script tag into the page. Let 
>> me quote myself:
>>
>>   function RunInPage(func) {
>>       var s = document.createElement("script"); 
>>       s.textContent = "(" + func + ")();"; 
>>       document.body.appendChild(s);
>>       setTimeout(function(){document.body.removeChild(s)}, 0);
>>   }
>>   RunInPage(function(){
>>       //you can use page-scope code (like jQuery if the page uses it) 
>> here freely - entirety of this script is run in page scope.
>>       var $ = window.jQuery;    
>>       $.each([], function(){});
>>   });
>>
>> Exporting homebrew jQuery into the page would be hard, though... 
>> exportFunction() only lets you call function from page scope, but it 
>> doesn't seem to open access to any defined properties on that function. Of 
>> course, you could just inject another script tag to load your jQuery into 
>> page scope (don't forget to back up and restore original jQuery if page 
>> needs it), and then (if necessary) run some code to apply your patches to 
>> it, but I'm not sure how well it would work.
>>
>>
>>
>>
>> 2014-07-18 17:24 GMT+04:00 Anthony Lieuallen <[email protected]>:
>>
>>> On Fri, Jul 18, 2014 at 7:39 AM, Daniel Wynalda <[email protected]> 
>>> wrote:
>>> > I don't understand how to call something in the page when I have 
>>> @grant set.
>>>
>>> http://wiki.greasespot.net/Location_hack ?
>>>
>>> --
>>> You received this message because you are subscribed to a topic in the 
>>> Google Groups "greasemonkey-users" group.
>>> To unsubscribe from this topic, visit 
>>> https://groups.google.com/d/topic/greasemonkey-users/SXfpyvcQofQ/unsubscribe
>>> .
>>> To unsubscribe from this group and all its topics, send an email to 
>>> [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at http://groups.google.com/group/greasemonkey-users.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"greasemonkey-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/greasemonkey-users.
For more options, visit https://groups.google.com/d/optout.

Reply via email to