我是一名学习jQuery javascript编程的程序员,但从未真正掌握原生javascript(我知道我很淘气)。我的问题是,我该如何使用原生JS复制此功能?
$('select').change(function() {
if($(this).val() == "Other (please specify)") {
$(this).parent().parent().find("input.hidden").show();
}
});
我是一名学习jQuery javascript编程的程序员,但从未真正掌握原生javascript(我知道我很淘气)。我的问题是,我该如何使用原生JS复制此功能?
$('select').change(function() {
if($(this).val() == "Other (please specify)") {
$(this).parent().parent().find("input.hidden").show();
}
});
以下是逐步转换的说明:
var selects = document.getElementsByTagName('select');
for (var i=0; i<selects.length; i++) {
selects[i].onchange = function() {
if( this.value == "Other (please specify)") {
var elements = this.parentNode.parentNode.getElementsByTagName("input");
for (var j=0; j<elements.length; j++) {
if( !elements[j].className.match(/\bhidden\b/)) continue;
elements[j].style.display = ''; // the exact thing to do here would depend on your previous actions
}
}
}
}
onchange
会覆盖之前定义的回调函数。但这通常是我们的目标。 - Denys Séguretshow()
不会改变visibility
。我非常确定它设置了display: none;
。 - jwatts1980display: block;
或者 display: inline;
。 - Ian$('select')
- 使用 document.getElementsByTagName
,然后循环遍历返回的列表
.change(function() {…}
- 查看高级事件注册模型,以了解浏览器之间的差异
$(this).val()
- 简单地使用this.value
。即使在 jQuery 中,您也应该使用这种方法
$(this).parent().parent()
- 获取该元素的父节点(两次)parentNode
.find("input.hidden")
- 这有点难。您可以使用.querySelector
[All
],但这在旧式浏览器中不起作用。jQuery 使用其跨浏览器选择器引擎添加了大量功能。您可能会尝试另一种可跨浏览器工作的获取输入元素的方式;您可以尝试类似于javascript document.getElementsByClassName compatibility with IE的方法。
.show()
- 通过el.style.display = "";
删除 display:none;
。顺便说一下,您可能只想使用remove,而不是用内联样式重写它 :-)
适用于符合 W3C 标准的浏览器的真正纯净代码:
[].each.call(document.getElementsByTagName('select'), function(select) {
select.addEventListener("change", function(e) {
if (this.value == "Other (please specify)") {
var inputs = this.parentNode.parentNode.querySelectorAll("input.hidden");
for (var i=0; i<inputs.length; i++)
inputs[i].classList.remove("hidden");
}
}, false);
});
(function(selects, handler) {
if (document.addEventListener)
for (var i=0; i<selects.length; i++)
selects[i].addEventListener("change", handler, false);
else
for (var i=0; i<selects.length; i++)
selects[i].attachEvent("onchange", handler);
})(document.getElementsByTagName('select'), function() {
if (this.value == "Other (please specify)") {
var inputs = this.parentNode.parentNode.getElementsByTagName("input");
for (var i=0; i<inputs.length; i++)
if (/\bhidden\b/.test(inputs[i].className))
inputs[i].style.display = "";
}
});
.querySelectorAll
的方法是使用 .getElementsByTagName(“input”)
然后匹配类... 这就是 Dystroy 所做的。但是值得提到所有选项以涵盖所有情况。 - Ian.style.display = ""
...它会保存先前的状态。虽然在这种情况下我理解这并不严重或必要,但你可以在CSS中为一个div设置display: inline
,并期望它回来,但使用display = ""
会将其转换回block
。 - Iandisplay = ""
就足够了。我确实说,在没有更多信息的情况下很难知道最佳方法。 - I Hate Lazydisplay =''
已经足够了。 - Ian<div style="display:inline;">
甚至“奇怪”),但应该真正使用样式表和类来处理这些事情。 - Bergi
$
、change
、val
、parent
、find
和show
)的确切作用。 - rgthree$(this).attr("id")
? 或者这个?$(this)[0].outerHTML
。就像jQuery是一个神奇的门户,所有DOM元素都必须通过它才能传递一样。 - I Hate Lazy