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:


Comments

Popular posts from this blog

javascript - Enclosure Memory Copies -

php - Replacing tags in braces, even nested tags, with regex -