Hey guys,

i am having problems with some refactoring:

I have some html-tables to which i add an onclick-handler like this:

CODE:
addClickHandler('myTableID',myFunction);

'addClickHandler' looks like this:

CODE:
function addClickHandler(tableId, functionName) {
        jQuery('#' + tableId + ' ' + 'tbody').children('tr').click
(functionName);
}

Now, all the functions i pass to this onclick-Handler look almost the
same :

CODE:
function clickOnTableRowResultSet() {
        var row = jQuery(this);
        var songUrl = trimAll(row.find('td:last form input
[name=hidden_url_field]').val());
        var trackID = trimAll(row.find('td:last form input
[name=hidden_id_field]').val());
        var trackInfoUrl = "/tracks/track_info/" + trackID;
        sendPlayEventToPlayer(songUrl);
        jQuery.ajax({success:function(request){$('#track_info').html
(request);}, url:trackInfoUrl, async:false});
}
CODE

with trimAll being:

CODE
/*
 * trimAll replaces all whitespace and newlines from a string
 */
function trimAll(str) {
        return str.replace(/\n+|\s+/g,"");
}

All of these functions basically do the same: they read out hidden
fields in the last column of the table row, send an event to a flash-
player and update a certain part of the website.

The only thing in which they differ, is this part:

        var trackInfoUrl = "/tracks/track_info/" + trackID;

So i wanted to summarize all my almost identical functions into one by
passing the above mentioned url to them.

I tried it like this:

Call to addClickHandler on the website:

CODE
   addClickHandler('list_tracks_table',clickOnTableRowResultSet, '/
tracks/track_info/' );

Then I changed my addClickHandler like this:

CODE
function addClickHandler(tableId, functionName, myUrl)  {
        jQuery('#' + tableId + ' ' + 'tbody').children('tr').click(function()
{
                functionName(myUrl);
        });
}

And finally summarized my clickOnTable...-functions like this:


function clickOnTableRowResultSet(url) {
        var row = jQuery(this);
        var songUrl = trimAll(row.find('td:last form input
[name=hidden_url_field]').val());
        var trackID = trimAll(row.find('td:last form input
[name=hidden_id_field]').val());
        var trackInfoUrl = url + trackID;
        sendPlayEventToPlayer(songUrl);
        jQuery.ajax({success:function(request){$('#track_info').html
(request);}, url:trackInfoUrl, async:false});
}


So far, this looks good to me, but unfortunately it doesn't work.
Using debugging i see that 'clickOnTableRowResultSet' gets passed the
correct url, but then the line afterwards:

CODE
        var songUrl = trimAll(row.find('td:last form input
[name=hidden_url_field]').val());

gives me the JS-error:
Error: str is undefined

in function trimAll, which basically means that

      row.find('td:last form input[name=hidden_url_field]').val()

yields undef.

This is what i don't get, i didn't change any part of the logic which
deals with finding the fields, etc.

None of my changes affected these parts - at least in my eyes. But
somehow the jquery-selectors seem to be unable to find my rows?

Does anybody see what's the problem here?

Reply via email to