2015-09-03 4 views
3

Я получаю странное поведение, когда событие javascript, которое я пытаюсь отправить, не интерпретируется как событие, а когда я проверяю его, это Event ,Uncaught InvalidStateError: Не удалось выполнить 'dispatchEvent' в 'EventTarget': предоставленное событие равно null

enter image description here Затем он терпит неудачу с ошибкой при слежении

Uncaught InvalidStateError: Failed to execute 'dispatchEvent' on 'EventTarget': The event provided is null.

JSFiddle

Я должен что-то очевидное здесь отсутствует.

$(function() { 
 
    $("[type='tel']").keydown(function (event) { 
 
     var position = this.selectionStart; 
 
     var $this = $(this); 
 
     var val = $this.val(); 
 
     if (position == this.selectionEnd && 
 
      ((event.keyCode == 8 && val.charAt(position - 1) == "," && val.substr(0, position - 1).indexOf(".") == -1) 
 
      || (event.keyCode == 46 && val.charAt(position) == "," && val.substr(0, position).indexOf(".") == -1))) { 
 
      event.preventDefault(); 
 
      if (event.keyCode == 8) { 
 
       $this.val(val.substr(0, position - 2) + val.substr(position)); 
 
       position = position - 2; 
 
      } else { 
 
       $this.val(val.substr(0, position) + val.substr(position + 2)); 
 
      } 
 
      $this.trigger('keyup', { position: position }); 
 
     } else { 
 
      if (event) { 
 
       this.dispatchEvent(event); 
 
      } 
 
     } 
 
    }); 
 

 
    $("[type='tel']").keyup(function (event, args) { 
 
     if (event.which >= 37 && event.which <= 40) { 
 
      event.preventDefault(); 
 
     } 
 

 
     var position = args ? args.position : this.selectionStart; 
 
     var $this = $(this); 
 
     var val = $this.val(); 
 
     var parts = val.split("."); 
 
     var valOverDecimalPart = parts[0]; 
 
     var commaCountBefore = valOverDecimalPart.match(/,/g) ? valOverDecimalPart.match(/,/g).length : 0; 
 
     var num = valOverDecimalPart.replace(/[^0-9]/g, ''); 
 
     var result = parts.length == 1 ? num.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") : num.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") + "." + parts[1].replace(/[^0-9.]/g, ""); 
 
     $this.val(result); 
 
     var commaCountAfter = $this.val().match(/,/g) ? $this.val().match(/,/g).length : 0; 
 
     position = position + (commaCountAfter - commaCountBefore); 
 
     this.setSelectionRange(position, position); 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<input class="tooltip form-control input-validation-error" data-val="true" data-val-number="The field Sale price (£) must be a number." data-val-range="The sale price must be between £10,000 and £50,000,000" data-val-range-max="50000000" data-val-range-min="10000" data-val-regex="Sale price must be numeric characters only" data-val-regex-pattern="^\d+$" data-val-required="Please enter a sale price" id="SalePrice" name="SalePrice" placeholder="" tabindex="7" type="tel" value="">

+1

'event' является [объект события JQuery] (http://api.jquery.com/category/events/event-object/), а не [событие DOM] (https://developer.mozilla.org/en-US/docs/Web/API/Event) – Andreas

+1

Вам лучше объяснить, почему вам нужно отправить событие здесь, а событие ya, jq отличается от события js –

+0

@ A.Wolff Чтобы получить его в бесконечную рекурсию. –

ответ

3

event в сценарии не DOM event но jQuery event object и это не может быть использован в качестве параметра для EventTarget.dispatchEvent.

Оригинальное событие DOM можно получить через свойство event.originalEvent

+0

Спасибо за ответ Андреас. Я хотел бы добавить в качестве примечания, что нельзя перераспределять событие, поэтому все упражнения выше были глупыми для начала. При попытке отправки отправленного события вы получите следующую ошибку: 'Uncaught InvalidStateError: не удалось выполнить 'dispatchEvent' в 'EventTarget': событие уже отправлено.' Http://jsfiddle.net/x9z2ntuz/2/ Обходное решение описано здесь http://jsfiddle.net/x9z2ntuz/1/ от A.Wolff для тех, кто все еще хочет, сделайте это. –

2

Я просто имел эту проблему, и она была решена путем клонирования события:

if (event && event.originalEvent) { 
    var oe = event.originalEvent; 
    this.dispatchEvent(new oe.constructor(oe.type, oe)); 
}