你可以使用jQuery的
closest()
方法:
$('input:text').change(
function(){
var ancestorFormElement = $(this).closest('form');
});
$('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>
外部 JS Fiddle演示,用于实验或开发。
或者,您可以使用DOM方法,将 <form>
元素与其后代表单元素 (<input />
,<textarea>
,<select>
等) 相关联:
$('input:text').change(function() {
var ancestorFormElement = this.form;
$(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>
外部JS Fiddle demo,用于实验或开发。
此外,因为我强烈怀疑您想要的更改(无论是什么)在“更改”被撤消时应恢复,所以建议采用以下方法:
$('input:text').change(function() {
var ancestorFormElement = this.form;
$(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>
用于实验或开发的外部JS Fiddle演示。
另外,完全可以将change
事件处理程序委托给<form>
元素本身,使用on()
:
$('form').on('change', function(e) {
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>
外部JS Fiddle演示, 用于实验或开发。
也可以将选择器传递给on()
方法,以指定应该启动给定事件(这里是“change”事件)并触发绑定到祖先的事件处理程序的元素:
$('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>
外部 JS Fiddle演示,用于实验或开发。
最后,一种使用普通JavaScript实现相同行为的方法:
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);
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>
外部 JS Fiddle演示,用于实验或开发。
参考资料: