简体   繁体   中英

Javascript modify parameters of an element's event function

Im 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 reindex 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. Thanks!

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 :)

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();
});

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.

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM