Depuis la mise à jour vers jQuery 2.2.1, j'obtiens l'erreur suivante dans mes tests.

TypeError: e.stopImmediatePropagation n'est pas une fonction

La fonction où elle est appelée:

items.on('dragstart.h5s', function(e) {
  e.stopImmediatePropagation();

  if (options.dragImage) {
    _attachGhost(e.originalEvent, {
      item: options.dragImage,
      x: 0,
      y: 0
    });
    console.log('WARNING: dragImage option is deprecated' +
    ' and will be removed in the future!');
  } else {
    // add transparent clone or other ghost to cursor
    _getGhost(e.originalEvent, $(this), options.dragImage);
  }
  // cache selsection & add attr for dragging
  dragging = $(this);
  dragging.addClass(options.draggingClass);
  dragging.attr('aria-grabbed', 'true');
  // grab values
  index = dragging.index();
  draggingHeight = dragging.height();
  startParent = $(this).parent();
  // trigger sortstar update
  dragging.parent().triggerHandler('sortstart', {
    item: dragging,
    placeholder: placeholder,
    startparent: startParent
  });
});

Le test d'où il est testé:

it('should correctly run dragstart event', function(){
  $ul.sortable({
    'items': 'li',
    'connectWith': '.test',
    placeholderClass: 'test-placeholder',
    draggingClass: 'test-dragging'
  });

  $li.trigger(jQuery.Event( 'dragstart', {
    originalEvent: {
      pageX: 100,
      pageY: 100,
      dataTransfer: {
        setData: function(val){
          this.data = val;
        }
      }
    }
  }));

  assert.equal($li.attr('aria-grabbed'),'true');
  assert.isTrue($li.hasClass('test-dragging'));

});
0
Lukas Oppermann 9 mars 2016 à 11:56

3 réponses

Meilleure réponse

Le problème ici est que vous créez vous-même l'objet originalEvent qui n'a pas les méthodes normales liées aux événements.

Lorsque nous appelons la méthode stopImmediatePropagation de l'objet d'événement jQuery, il essaie d'appeler la même méthode que l'objet d'événement d'origine, car la méthode n'est pas trouvée, elle entraîne l'erreur.

Une solution possible ici consiste à créer un objet d'événement personnalisé

var event = document.createEvent('CustomEvent');
event.initEvent('dragstart', true, true);
event.pageX = 100;
event.pageY = 100;
event.dataTransfer = {
  setData: function(val) {
    this.data = val;
  }
};

$li.trigger(jQuery.Event(event));

Démo: Fiddle

2
Arun P Johny 9 mars 2016 à 09:21

Ajoutez une fonction stopImmediatePropagation à votre objet originalEvent car c'est là qu'il essaie de le déclencher en fonction de ces documents

Certains événements peuvent avoir des propriétés qui leur sont spécifiques. Ceux-ci sont accessibles en tant que propriétés de l'objet event.originalEvent.

0
Avram Tudor 9 mars 2016 à 09:08

Une solution simple peut être naïve:

if (event.stopImmediatePropagation)
    event.stopImmediatePropagation();
0
Dr C K Wright 12 janv. 2018 à 16:09