Событие Javascript для случая, когда значение изменяется с помощью JavaScript - PullRequest
2 голосов
/ 24 июня 2011

Так что я знаю, что несколько вариантов этого вопроса задавались в прошлом, но я просто хочу посмотреть, изменилось ли что-нибудь с html5 и всем.

По сути, у меня есть веб-формы, в которых есть события, когда они меняются. (Через обмен, onclick, и т. Д.). Теперь эти формы на самом деле хранят свои значения в переменной javascript. Я понимаю, что я делаю это по-другому, и я мог бы просто позже проверить поля на предмет изменений. Однако из-за приложения, которое я создаю, наличие немедленных событий обязательно.

Проблема, с которой я сталкиваюсь, заключается в том, что такие вещи, как менеджеры паролей (и я предполагаю, что плагины, такие как roboform), изменяют значения полей формы с помощью javascript. Когда javascript изменяет эти значения, он не запускает события, которые я сейчас использую.

Теперь я знаю, что в IE есть проприетарная функция, называемая propertychange. Firefox также имеет аналогичную функцию, называемую «DOMAttrModified» (которая, я считаю, также поддерживается в IE9). Я полагаю, что каждый из них будет работать, потому что я мог бы активно наблюдать значение поля, и это событие вызывалось бы, когда javascript изменял значение. Однако, похоже, что и Chrome, и Safari не имеют схожей функции.

Мой главный вопрос: не хватает ли чего-нибудь, что позволило бы этому работать в chrome и safari (без использования settimeout)? Кроме того, будет ли способ сделать это в HTML5? Мне кажется немного глупым, что не существует стандартного способа сделать это.

Наконец, возможно ли вместо этого ОСТАНОВИТЬ такие вещи, как lastpass, от фактического заполнения ваших полей. Я знаю, что вы можете поставить autocomplete = "off", и предполагается, что они на самом деле не заполняют эти поля, но, похоже, это не работает с lastpass.

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Firefox имеет нестандартный метод Object.watch(), который позволяет вам знать, когда свойство изменяется из JavaScript - см. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/watch. Из всех, что я знаю, ни один другой браузер не решил реализовать его из-за проблем с производительностью.

Я думаю, что Chrome вам не повезло - они даже решили не реализовывать события мутации DOM, чтобы получить более высокую оценку производительности.Вы можете использовать только опрос, например, проверять значение каждые 100 миллисекунд, чтобы увидеть, изменилось ли оно.Safari поддерживает DOMAttrModified, но в этом случае может не сработать (зависит от того, действительно ли менеджер паролей изменяет атрибут или только свойство).

0 голосов
/ 24 июня 2011

Возможно, что-то вроде этого (обычный JS)

<script>

var tId=[];

window.onload=function() {
  var inputs =document.getElementsByTagName("input");
  for (var i=0, n=inputs.length;i<n;i++) {
    if (inputs[i].className.indexOf("watch") !=1) {
      inputs[i].onfocus=function() {
        var id = this.id;
        tId[id]=setInterval(
          function(){ 
            var fld = document.getElementById(id);
            if (fld.value!=fld.defaultValue) fld.onchange() 
          },100);
      }      
      inputs[i].onblur=function() {
        var id = this.id;
        clearInterval(tId[id])
      }      
    }
  }
}


</script>
<form id="form1">
<input type="text" name="field1" id="field1" value="" class="watch"/>
</form>
0 голосов
/ 24 июня 2011

Как Safari, так и Chrome поддерживают DOMSubtreeModified, вы можете прослушать его, а затем проверить наличие определенного атрибута, если поддерево DOM элемента не получает много изменений в противном случае., вы можете попробовать использовать Javascript setters (через Object.defineProperty ).

...