jQuery Plugin Events werden zu oft gefeuert

  • JavaScript

    jQuery Plugin Events werden zu oft gefeuert

    Ich habe folgenden Code, mit dem an einem bestimmten Element bei Rechtsclick ein Contextmenü angezeigt wird.

    Code

    PHP-Quellcode

    1. (function($) {
    2. $.fn.extend({
    3. /**
    4. * Stellt ein Contextmenu dar
    5. * @param {type} options Optionen für den Aufruf
    6. * @returns {undefined} nothing
    7. */
    8. contextmenu: function(options) {
    9. /**
    10. * Default Variablen
    11. */
    12. var defaults = {
    13. };
    14. var options = $.extend(defaults, options);
    15. // ID des Elements, an dem das Contextmenu angezeigt wird
    16. var createrId;
    17. // return this.each(function() {
    18. var o = options;
    19. var obj = $(this);
    20. /**
    21. * Wenn Rechtsclick auf das Element
    22. */
    23. $(obj).on('contextmenu', function(e) {
    24. ShowContext(e);
    25. return false;
    26. });
    27. /**
    28. * Wenn Click auf ein Items des Menus
    29. */
    30. $(document).on('click', '.contextitem', function(e) {
    31. var clickedId = $(e.target).closest('li').attr('id');
    32. if (options.selected)
    33. options.selected(clickedId, createrId);
    34. });
    35. /**
    36. * Wenn Click auf Document
    37. */
    38. $(document).on('click', function(e) {
    39. $('.context-menu').remove();
    40. });
    41. /**
    42. * Zeugt das Contextmenu an
    43. * @param {type} e Clickevent
    44. * @returns {undefined} nothing
    45. */
    46. function ShowContext(e) {
    47. var id = $(e.target).closest('tr').attr('id');
    48. createrId = id;
    49. if (e.button === 2)
    50. {
    51. $('body').append('<ul role="menu" class="context-menu"id="' + "" + '"></ul>');
    52. // if (this.header.toString().length > 0)
    53. // $('.context-menu').append('<li role="presentation" class="dropdown-header">' + this.header + '</li>')
    54. var id = 0;
    55. $.each(options.items, function(key, value) {
    56. if (key == 'line')
    57. $('.context-menu').append('<li role="presentation" class="divider"></li>')
    58. else
    59. {
    60. $('.context-menu').append('<li class="contextitem" id="' + id + '" role="presentation"><a role="menuitem" tabindex="-1" href="#"><span class="' + value['icon'] + '"></span> ' + value['name'] + '</a></li>')
    61. id = id + 1;
    62. }
    63. });
    64. $('.context-menu')
    65. .css('left', e.clientX)
    66. .css('top', e.clientY)
    67. .css('display', 'block')
    68. .fadeIn('slow');
    69. }
    70. }
    71. // });
    72. }
    73. });
    74. })(jQuery);
    Der Aufruf erfolgt so

    PHP-Quellcode

    1. function ShowMenu()
    2. {
    3. $('.trTodo').contextmenu({
    4. items: {
    5. "löschen": {name: "Löschen", icon: "glyphicon glyphicon-remove"},
    6. "erledigt": {name: "Erledigt", icon: "glyphicon glyphicon-ok"}
    7. },
    8. selected: function(e, g) {
    9. console.log("Id" + e + " " + g);
    10. }
    11. });
    12. }

    Hierbei sind "Items" die Items, die im Menü angezeigt werden.
    Und "selected" ist eine Methode, die ausgelöst wird wenn auf ein Item geklickt wurde. Ihre Parameter sind die ID des Elements wo das Contextmenü erscheint, und die ID des geklickten Menüitems.

    Nun aktualisiere ich das Element alle x Sekunden.Dabei muss ich die Funcktion zum Anzeigen erneut aufrufen. Soweit klappt auch alles nur bekomme ich dann in der "Selected" Methode immernoch die Ergebnisse vom letzen mal, statt ein einziges Ergebnis zurück.
    Hat jemand vielleicht eine Idee was man da machen kann ?

    Hier ist noch ein beispiel für einen Log

    Quellcode

    1. XHR finished loading
    2. Id 0 1532974894
    3. XHR finished loading
    4. Id 1 1532974894
    5. Id 1 257038102
    6. XHR finished loading:
    7. XHR finished loading
    8. Id 0 1532974894
    9. Id 0 257038102
    10. Id 0 undefined
    11. Id 0 35503633
    12. XHR finished loading
    13. Id 0 1532974894
    14. Id 0 257038102
    15. Id 0 undefined
    16. Id 0 35503633
    17. Id 0 16238230


    Hat sich erledigt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LaMiy“ ()