当使用'this'时,替代总是引用父节点和子节点来修改DOM
Alternative to always referencing to parents and children to modify DOM when using 'this'
我注意到,当我需要在组件之间共享行为时,我总是使用this
。
我正在创建一个定制的文件输入组件,因此我必须返回由JS用户添加的文件。但是有三个输入,我需要创建一个函数,它将在它们之间共享,所以它不能是特定的,也不能是唯一的。它应该对所有的都有效。
var setFilename = function () {
// get element I want
var input = this
var filepath = input.value
var m = filepath.match(/([^'/'']+)$/)
var filename = m[1]
var spanLabel = input.parentNode.querySelector('.input')
// apply to element I wanted to get
spanLabel.innerHTML = filename;
}
问题注意,这里的功只是为了到达我想要的元素,一般来说。我用parentNode
我总是这样做,甚至有代码是这样结束的:
var element = this,
elementParent = this.parentNode,
elementIWant = selectedSpan.parentNode.querySelector('.class');
我不认为这是一个好的做法。是吗?我没有在其他开发者的代码中看到它。我用jQuery (parent()
, closest()
等)和JS。
有其他方法吗?
如何以正确的方式操作DOM的抽象函数?这就是人们做事的方式吗?
从输入字段获取值并将该值放入目标元素的逻辑必须假设存在某种DOM结构(如在您的示例中),如果目标元素不是显式已知的。
我经常使用的约定是向输入字段添加一个data- (data dash)属性,以存储将使用输入值更新的目标元素的id。例如:
<div>
<label for="filename">Filename: </label>
<input type="text" id="filename" data-target-id="filename-display" />
</div>
<div class="some-displayed-values">
<span class="input" id="filename-display"></span>
</div>
然后,可以通过其ID值选择目标元素,如下所示:
function setFilename () {
var input = this;
// older browsers might not have input.dataset available
var targetId = input.dataset.targetId || input.getAttribute('data-target-id');
var target = document.getElementById(targetId);
target.innerHTML = input.value;
}
jsfiddle示例:http://jsfiddle.net/silkster/ex1dvv0s/
如果您需要访问父级,parentNode
或parentElement
是正确的方式。
如果其他开发人员不使用它们,可能是因为他们不想访问父目录。
但是,要注意
-
parentNode
可能返回一个节点而不是一个元素。因此,在返回值上使用仅对元素可用的属性或方法可能会抛出错误。如果您希望结果是一个元素,请使用parentElement
。 -
parentNode
和parentElement
可以返回null
。因此,在尝试访问其属性之前检查返回值可能是一个好主意。
相关文章:
- 在自定义截面树中获取父节点
- 如何避免在取消选中子节点时取消选中父节点
- 如果未选中子节点,则未选中父节点
- 仅使用某些子节点访问xml中父节点的子节点
- 如何以编程方式在 jsTree 中选择一个节点并打开所有父节点
- 使用Javascript设置带有子节点的父节点的类's文本等于.
- 如何确定父节点是否有子节点
- Javascript在没有jQuery的情况下获取X父节点
- 如何从wijmo-flex网格的树视图中的节点转到父节点
- 在没有 jquery 的情况下更改子节点(父节点具有 ID)中的链接文本
- JQuery 选择父节点并更改其类名
- 如何删除javascript中的节点,而不需要父节点为null
- 如果未全部选中子节点,则取消选中父节点
- 如何在JavaScript中删除子节点触发点击事件时的父节点
- 获取下一个不工作Javascript DOM的同级父节点的子节点
- 取消绑定父节点和子节点
- jstree jquery插件-获取父节点的所有子节点和子节点
- 我应该如何以JSON格式将当前引用保存到父节点
- 当使用'this'时,替代总是引用父节点和子节点来修改DOM
- 在每个树节点IE8中设置对父节点的引用