views:

259

answers:

3

I'm trying to get a jsonp callback working using jquery within a greasemonkey script. Here's my jquery:

$.ajax({
    url: "http://mydomain.com/MyWebService?callback=?",
    data: { authkey: "temphash" },
    type: "get",
    dataType: "json",
    cache: false,
    success: function(data) {
        console.log(data);
    }
});

in my webservice (asp.net) I'm returning the response with a content type of application/javascript. The response the server is actually sending back is:

jsonp1276109314602({"message":"I'm getting tired of this not working"})

The jsonp1276109314602 method name is being randomly generated by jquery, and I'm grabbing it with Request.QueryString["callback"]

However my success function is never called and the firebug console gives me an error saying jsonp1276109314602 is not defined.

What am I doing wrong?

NOTE I'm making this call from a greasemonkey script on a craigslist page. It's a cross-domain request, but I can see the request is actually making it to the server and returning a good response, but for whatever reason the registered callback that jquery creates appears to not exist when the response comes back. It works fine if I run the script in the firebug console from the craigslist page, but not when it's run from the greasemonkey script.

+2  A: 

Have you already tried:

$.ajax({
    url: "http://mydomain.com/MyWebService",
    data: { authkey: "temphash" },
    type: "get",
    dataType: "jsonp",
    cache: false,
    success: function(data) {
        console.log(data);
    }
});

From docs:

"jsonp": Loads in a JSON block using JSONP. Will add an extra "?callback=?" to the end of your URL to specify the callback.

I haven't examined jQuery's source code but it's possible that the callback function isn't created unless you specify jsonp for the dataType option.

Ken Browning
+1  A: 

It turns out that you have to do some extra monkeying around (pun intended) to get it to work inside a greasemonkey script.

The long answer can be found here: http://stackoverflow.com/questions/1647519/jquery-getjson-inside-a-greasemonkey-user-script.

The short answer is to ditch the JSONP approach and include this in your script:

// @require http://courses.ischool.berkeley.edu/i290-4/f09/resources/gm_jq_xhr.js

Not sure I understand it all, but nonetheless it works like a champ and I'm able to make cross domain requests from my script.

Micah
If you're interested in how the `gm_jq_xhr.js` script works, you can read [an explanation](http://ryangreenberg.com/archives/2010/03/greasemonkey_jquery.php) I wrote.
Ryan