ajax() function doesn't work properly (returns parent page)

Showing 1-2 of 2 messages
ajax() function doesn't work properly (returns parent page) Wave Plays 5/2/12 12:09 AM
Hello,
I am trying to make the echo example work which is in the online book.
It works fine in my index function, but it doesn't work in any other function.
I use the same callback method in both views:

def echo():
   
return request.vars.keyword


and the methods (one is index, the other is called storeadmin) have identical code and views as well:

def index(): #as well as def: storeadmin():


   
return dict(
                form
= FORM (
                      INPUT
(
                          _name
='keyword',
                          _onkeyup
="ajax('echo', ['keyword'], 'target');"
                     
)
                 
),
                  target_div
=DIV(_id='target'))


the view is:


{{extend 'layout.html'}}


{{=form}}


<br />


{{=target_div}}

In index, the ajax call works as it should, but in storeadmin, I get the entire page pasted into the target div.
I put 2 screenshots of the pages for both methods to make it more clear.

do you have any idea why this could be?

Re: ajax() function doesn't work properly (returns parent page) Anthony 5/2/12 9:15 AM
Try going to http://127.0.0.1:8000/inventoryapp/default/index/ (note the trailing "/"), and you should see the same problem. On the storeadmin page, the problem should go away if you exclude the trailing "/" from the URL.

The problem is, in the call to ajax(), the URL is just 'echo'. Because it doesn't start with a "/", the browser interprets that as being relative to the current URL path, which it assumes ends after the last "/". If the current URL ends in a "/", the browser just adds "echo" to that and makes the Ajax call to the current URL (web2py will just see "echo" as a URL argument rather than a function). If you check the network traffic on the storeadmin example, you should see the Ajax call going to http://127.0.0.1:8000/inventoryapp/default/storeadmin/echo.

The best approach is to use the full URL in the Ajax call, using the URL() function:

_onkeyup="ajax(%s, ['keyword'], 'target');" % URL('default', 'echo')

We should probably change that in the book.

Anthony