Scott
Scott

Reputation: 43

Passing a Variable into jQuery AJAX

I'm stuck in a rut. I hope some one can help.

Basically, I am building an AJAX mobile web app with jQuery. I am able to parse a specific XML file just fine, but I want the option to parse other XML files based on the link they were clicked on and load them on the fly into the same DIV or UL.

So:

click on Link1, loads XML1
click on Link2, loads XML2

I would like to be able to do this all client side, so no PHP (or is that a bad idea?). This the jquery code I've been using:

$(document).ready(function() {          

        $("a.load_ajax").click(loadAjax());

        function loadAjax() {
            var fileID = get('?lineID=');

            var dataID = "xml/" + fileID + ".xml"

            $.ajax({
                type: "GET",
                url: dataID,
                dataType: "xml",
                success: parseXml
            });

            function parseXml(xml) {
                $(xml).find("train").each(function() {
                    $("ul#ajax-output").append('<li>' + $(this).find("time").text() + '</li>');
                });
            }
        }           

});

Its just not working at all. I have been passing the variable using GET in the url. So the link in the HTML goes to /?lineID=SBD_to_Union and it should load the XML file called SBD_to_Union.xml

Making sense to anyone? I'd appreciate some help.

Upvotes: 2

Views: 970

Answers (4)

tvanfosson
tvanfosson

Reputation: 532665

What you seem to be struggling with is obtaining the line from the url in the anchor. Use $(this) to get the href attribute of the clicked link. You could then use a regex, if the url is as described, to remove all but the line id to use in constructing the link for the XML. I presume that the XML is server side and relative to the current url. If not, then you'll need to adjust the path. I've taken the liberty to compress things a bit by putting the functions inline. Edit: and the click handler should return false to prevent the link from actually performing its default action.

$(function() {          

    $("a.load_ajax").click( function() {
        var fileID = $(this).attr('href').replace(/.*?lineID=/,'');

        var dataID = "xml/" + fileID + ".xml"

        $.ajax({
            type: "GET",
            url: dataID,
            dataType: "xml",
            success:  function(xml) {
                $(xml).find("train").each(function() {
                    $("ul#ajax-output").append('<li>' + $(this).find("time").text() + '</li>');
                });
            }
        });
        return false;
    });          
});

Upvotes: 1

bobsoap
bobsoap

Reputation: 5114

On first glance, I think your ajax() syntax is a little off.

Are you using query strings for a particular reason? If no, I'd try giving the HTML links the absolute URL to the XML file you are trying to fetch:

<a href="xml/file123.xml"></a>

Then try this:

$("a.load_ajax").click(function(e) {
 e.preventDefault();
 var url = $(this).attr('href');

            $.ajax({
                type: 'GET',
                url: url,
                dataType: 'xml',
                success: function(response) {
                    $(response).find('train').each(function() {
                        $('ul#ajax-output').append('<li>' + $(this).find('time').text() + '</li>');
                }
            });

        });

I haven't tested this, but it should do what you want.

Upvotes: 1

Gabriele Petrioli
Gabriele Petrioli

Reputation: 196236

Have you checked if the get function returns the correct data ?

add an alert(fileID); right after the get(..); line..

But why don't you create the urls to point directly to the xml files instead of parsing and creating urls on the fly ?

just make the link in the html to point to xml/SBD_to_Union.xml

Upvotes: 1

CRice
CRice

Reputation: 12567

<a href="#" id="link1" class="load_ajax">Link1</a>
<a href="#" id="link2" class="load_ajax">Link2</a>

You can do things depending on the id of the href (or another of its attributes or its href value).

$(function() {
    $("a.load_ajax").click(loadAjax); 
});

function loadAjax()
{
  if ($(this).attr("id") == "link1")
  {
    alert("link1"); //load xml1
  }
  else
  {
    alert("link2"); //load xml2
  };
}

Upvotes: 0

Related Questions