jQuery find antecedent? -
when want find child of object can use children()
; when want find object inside object, not it's child, can use find()
. if want find parent, use parent()
, if want find antecedent, not knowing if it's parent grandparent, grand-grandparent, how can it?
i'll give example: building plugin applied 'input:text'.
in end, need form holds them. sometimes, text-boxes directly inside form, or can inside unordered list or inside table.
am able refer form in general way?
you can use jquery's closest()
method:
$('input:text').change( function(){ var ancestorformelement = $(this).closest('form'); // stuff. });
$('input:text').change(function() { var ancestorformelement = $(this).closest('form'); ancestorformelement.addclass('hasinputchanged'); });
form { border: 2px solid #000; padding: 1em; } form.hasinputchanged { border-color: limegreen; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form action="#" method="post"> <fieldset> <legend>simple demo</legend> <label for="name">text input:</label> <input type="text" name="name" id="name" value="" tabindex="1" /> </fieldset> </form>
external js fiddle demo, experimentation or development.
or, instead, use dom approach associates <form>
element descendant form-elements (<input />
, <textarea>
, <select>
etc):
$('input:text').change(function() { var ancestorformelement = this.form; // because 'this.form' returns dom node, // must converted jquery object in // order utilise jquery methods: $(ancestorformelement).addclass('hasinputchanged'); });
$('input:text').change(function() { var ancestorformelement = this.form; $(ancestorformelement).addclass('hasinputchanged'); });
form { border: 2px solid #000; padding: 1em; } form.hasinputchanged { border-color: limegreen; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form action="#" method="post"> <fieldset> <legend>simple demo</legend> <label for="name">text input:</label> <input type="text" name="name" id="name" value="" tabindex="1" /> </fieldset> </form>
external js fiddle demo, experimentation or development.
further, because i'd suspect want changes – whatever may – revert should 'change' undone, i'd suggest following approach:
$('input:text').change(function() { var ancestorformelement = this.form; // here use 'toggleclass(<class-name>, <switch>)' // method; 'switch' returns boolean true/false // if evaluates true class-name added // , if evaluates false class-name // removed: $(ancestorformelement).toggleclass('hasinputchanged', this.value !== this.defaultvalue); });
$('input:text').change(function() { var ancestorformelement = this.form; $(ancestorformelement).toggleclass('hasinputchanged', this.value !== this.defaultvalue); });
form { border: 2px solid #000; padding: 1em; } form.hasinputchanged { border-color: limegreen; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form action="#" method="post"> <fieldset> <legend>simple demo</legend> <label for="name">text input:</label> <input type="text" name="name" id="name" value="" tabindex="1" /> </fieldset> </form>
external js fiddle demo, experimentation or development.
also, it's entirely possible delegate change
event-handler <form>
element itself, using on()
:
$('form').on('change', function(e) { // here 'e' event-object passed // event-handling function; 'e.target' // element received initiating event: var changedel = e.target; $(this).toggleclass('hasinputchanged', changedel.value !== changedel.defaultvalue); });
$('form').on('change', function(e) { var changedel = e.target; $(this).toggleclass('hasinputchanged', changedel.value !== changedel.defaultvalue); });
form { border: 2px solid #000; padding: 1em; } form.hasinputchanged { border-color: limegreen; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form action="#" method="post"> <fieldset> <legend>simple demo</legend> <label for="name">text input:</label> <input type="text" name="name" id="name" value="" tabindex="1" /> </fieldset> </form>
external js fiddle demo, experimentation or development.
it's possible pass selector on()
method specify elements should initiate given event (here 'change' event) trigger event-handling bound ancestor:
// here pass selector, 'input[type=text]' // method, restricts event-handling // events originating <input> elements // 'type' attribute equal 'text': $('form').on('change', 'input[type=text]', function(e) { $(this).toggleclass('hasinputchanged', changedel.value !== changedel.defaultvalue); });
$('form').on('change', 'input[type=text]', function(e) { var ancestorformelement = this.form; $(ancestorformelement).toggleclass('hasinputchanged', this.value !== this.defaultvalue); });
form { border: 2px solid #000; padding: 1em; } form.hasinputchanged { border-color: limegreen; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form action="#" method="post"> <fieldset> <legend>simple demo</legend> <label for="name">text input:</label> <input type="text" name="name" id="name" value="" tabindex="1" /> </fieldset> </form>
external js fiddle demo, experimentation or development.
and, finally, plain javascript means of accomplishing same behaviour:
// defining named function handle // event-handling, 'event' argument // passed automagically // addeventlistener() method (below): function changehandler(event) { // 'this' element // event-handler bound (again // automagically passed // addeventlistener()): var form = this, changed = event.target; // here use element.classlist api; // works toggleclass() does, adding // supplied class-name if switch follows // evaluates true, removes if switch // evaluates false: form.classlist.toggle('hasinputchanged', changed.value !== changed.defaultvalue); } // retrieving <form> element using // document.queryselector(), returns // first element in document // matches css selector passed // function: var formelement = document.queryselector('form'); // using addeventlistener bind named // function (changehandler) event- // handler 'change' event: formelement.addeventlistener('change', changehandler);
function changehandler(event) { var form = this, changed = event.target; form.classlist.toggle('hasinputchanged', changed.value !== changed.defaultvalue); } var formelement = document.queryselector('form'); formelement.addeventlistener('change', changehandler);
form { border: 2px solid #000; padding: 1em; } form.hasinputchanged { border-color: limegreen; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form action="#" method="post"> <fieldset> <legend>simple demo</legend> <label for="name">text input:</label> <input type="text" name="name" id="name" value="" tabindex="1" /> </fieldset> </form>
external js fiddle demo, experimentation or development.
references:
- css:
- javascript:
- jquery:
Comments
Post a Comment