Scott Tomaszewski
Scott Tomaszewski

Reputation: 1019

Javascript modify parameters of an element's event function

I'm wondering if there is a more elegant means of modifying the parameter of an onclick event. I have a table that I am dynamically adding/removing elements from and I re-index the rows. Each row has a delete link that has the row's index (and a duplicate link) that needs to update its parameter to match the modified row id.

Currently my code looks like (simplified)

<a onclick="delRow(1)">delete</a>

and the javascript: ...

html = element.innerHTML;

html = html.replace(/dupRow(\\d+)/g, "dupRow(" + newIndex + ")");
html = html.replace(/delRow(\\d+)/g, "delRow(" + newIndex + ")");

element.innerHTML = html

and I would like it to become something along the lines of

if (element.onclick != null) {
    element.onclick.params[0] = newIndex;
}

Any such way of accomplishing this? I also have jQuery if this helps.

Updates:

So thanks to the glorious help of @rich.okelly I have solved my issue

<script>
...

var newRow = '\
        <tr>\
        <td class="index" col="0">0</td>\
        <td>this is content...</td>\
        <td><a href="#" row-delete="true">Del</a></td>\
        </tr>';

// re-index table indices in a non-efficient manner
function reIndexTable() {
    $("#rpc-builder-table").find('.index').each(function (i) {
        $(this).html(i)
    })
}

// add row
function addRow() {
    for (i = 0; i < $('#addRowCount').attr("value"); i++) {
        $("#rpc-builder-table").append(newRow);
    }
    reIndexTable();
}

$(document).ready(function () {

    // add row button
    $('#addRowsButton').on('click', function () {
        addRow();
    });

    // delete row
    $('#rpc-builder-table').on('click', 'td a[row-delete="true"]', function () {
        $(this).closest('tr').remove();
        reIndexTable();
    });

    ...
}
</script>

...

<div>
    <label>Rows to add: </label>
    <input id="addRowCount" value="1" size="2" />
    <button id="addRowsButton">Add Row(s)</button>
</div> 

<div><table id="rpc-builder-table"><tbody>
    <tr>
        <th>Idx </th>
        <th>Some content (1)</td>
    </tr>
</tbody></table></div>

...

I used the .on() function instead of the suggested .delegate() function since it is deprecated. Solution works well - hope it helps someone :)

Upvotes: 1

Views: 535

Answers (3)

Rich O&#39;Kelly
Rich O&#39;Kelly

Reputation: 41767

If you change your html to something similar to:

<tr>
  <td>
    <a href="#" data-delete="true">delete</a>
  </td>
</tr>

Then your javascript can be something like:

$('td a[data-delete="true"]').on('click', function() {
  $(this).closest('tr').remove();
});

Update

If rows are added dynamically to a pre-exising table (table is interchangeable for any parent element), you can use the delegate method like so:

$('table').delegate('td a[data-delete="true"]', 'click', function() {
  $(this).closest('tr').remove();
});

Upvotes: 2

Dennis
Dennis

Reputation: 32608

Instead of inline handlers, use event delegation to attach event handlers

$("#tableID").delegate("a", "click", delRow);

$("#tableID").on("click", "a", delRow); //jQuery 1.7

Inside the handler,

var row = $(this).closest("tr").index(); //Get the index of the parent row

Inline handlers get parsed into a function:

function onclick() {
    delRow(1);
}

so changing them is difficult. Your example rewrites the entire row with the new parameter, which is bad practice.

Upvotes: 1

hugomg
hugomg

Reputation: 69994

The most brain dead solution is getting rid of the parameters and setting a variable isntead.

var row_to_dup = 42;

$("#a_row_dupper").bind('click', function (){
    dupItem(row_to_dup);
});

//changing the row to dup
row_to_dup = 17;

Upvotes: 0

Related Questions