jQuery détecter programatic changement de champ
J'ai un champ caché appelé #myHiddenField
dire.
Le contenu de ce champ est modifié par programmation à des endroits différents.
J'aimerais une méthode qui détecte ce changement. Le changement de l'événement ne se déclenche pas, sauf si je tape dans le champ, mais c'est impossible.
Est-il un jQuery moyen de détecter programatic de modifier le contenu dans un champ?
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure de déclencher l'événement de changement avec:
OU
Bien sûr, cela nécessitera le bloc de code responsable de la mise à jour de l'déposé à faire un de ces appels après il a fait son travail.
Les DOM ne peut pas détecter les programmes de sensibilisation des événements. J'ai effectivement rencontré ce hier. Je ne me souviens pas où je l'ai lu, mais la solution a été fait appel
.trigger()
sur le jQuery élément. jQuery DocCas 1:
Vous voulez changer la valeur par programme par vous-même et vous voulez juste pour distribuer un événement lorsque la valeur est modifiée.
Cas 2:
Supposons que vous voulez détecter le changement programmatique à un champ qui n'est pas écrite par vous. Donc, il n'y a aucun moyen que vous pouvez déclencher le "changement" de l'événement.
Dans ce cas, Utilisez l'option "DOMSubtreeModified" pour détecter des changements dans le programme pour les éléments descendants d'un élément parent.
Exemple:
Maintenant, si la valeur de la "total_price" les changements en quelque sorte par programme, il sera le feu "DOMSubtreeModified" de l'événement.
Exemple:
Précaution pour le Cas 2: DOMSubtreeModified pouvez créer un boucle infinie et grandement dégrader les performances. Au lieu de cela, il est encouragé à utiliser MutationObserver.
Exemple avec MutationObserver:
Cas 3:
Les moyens ci-dessus peut détecter un changement dans les DOM. Mais si vous voulez changer la valeur d'un champ de saisie de la programmation, alors que ces événements ne se déclenche pas. Dans ce cas, le seul moyen est de déclencher manuellement un événement.
Donc, d'abord modifier la valeur d'un champ de saisie, puis de déclencher manuellement un événement.
$('#inputfield').val(456465).trigger('change');
Puis de gérer l'événement avec$('#inputfield').on('change', function(){ console.log('changed'); });
Réglage de la valeur à l'aide .val() en jQuery ne pas déclencher un événement de changement de sorte que vous aurez à utiliser .modifier() ou .trigger ("changement") pour déclencher un événement de changement. Vous pouvez choisir d'utiliser .change(function() { ... }) ou .on('change', function() { ... } pour détecter le changement de l'événement sur le terrain.
https://jsfiddle.net/qeg5of2a/1/
ou
https://jsfiddle.net/qeg5of2a/2/
.le changement est juste raccourci .on('change', gestionnaire) et de l' .trigger('modifier'), donc soit est très bien
Vous pouvez taper sur une version de remplacement d'un JQ méthode de l'objet comme
val
ouhtml
pour atteindre cet (ou éventuellement remplacer un "pur JS" méthode de l'objet). Personnellement, je ne peux pas obtenirMutationObserver
de travail, et cette solution que je propose peut être plus simple:Important: ce code comme l'écrit ne remplace/remplace le val méthode pour cela un JQ objet. Il est essentiel d'être conscient que si vous allez
$( '#InvoiceNo' )
ailleurs, vous aurez en fait être la création d'un entièrement nouveau JQ objet, sans remplacésval
méthode. En d'autres termes, vous avez dans ce cas de garder une trace de votre JQ objets.Vous pouvez également remplacer tout "pure JS" objet des méthodes de la même manière, notamment (pour ce cas)
setAttribute
.NB pour ceux qui ne le savent pas encore, un JQ objet du 1er élément, c'est à dire
[0]
, est la "vraie" JS objet qu'il contient.Contrairement à l'JQ exemple donné ci-dessus, il existe un et un seul de ces "pure JS" objet... alors va
$( '#InvoiceNo' )[ 0 ]
n'importe où dans votre code vous donnera toujours la même JS objet. Bien sûr, le chemin normal pour définir un attribut (ou plutôt de la "propriété") dans "pur JS" est... qui commande, autant que je sache, ne peut pas être "remplacée". Sans doute cela peut être détecté avec
MutationObserver
, si vous avez plus de succès que moi.PS exactement comment JQ définit la valeur de son "véritable JS" objet lorsqu'une JQ méthode comme
val
ouhtml
est appelé je ne sais pas. Si vous vouliez vous pourrait en fait remplacer ces méthodes de "do it yourself", profitant du fait que son "équivalent" JQ objets font référence à la même sous-jacent JS objet, c'est à dire depuis$( '#InvoiceNo' )[ 0 ]
se réfère toujours à la même JS objet. Mais dans ce cas, vous devez remplacer lesval
ouhtml
pour TOUS JQ objets, c'est à dire modifier le prototype lui-même: