选择脚本标记之前的元素
如何在不编辑DOM的情况下选择下面代码中的第一个input
(如果需要,使用jQuery)?
// Select the input above
请注意,此代码示例之前和之后有一些未知数量的输入和脚本标记,因此$("input:eq(1)")
等解决方案将无效。
棘手的部分是选择在执行当前JavaScript的script
标记之前放置的input
。
没有必要问我为什么要这样做,这纯粹是为了它的美丽,我想这样做而不必在我的输入中添加随机id,如果可能的话。
编辑
这就是为什么大多数答案都行不通的原因: http : //jsfiddle.net/2WqfP/
脚本始终在加载时运行,因此正在运行的标记始终是页面上的最后一个标记。 使用纯JS,你可以这样得到它:
var scripts = document.getElementsByTagName('script'), currentScript = scripts[scripts.length - 1];
编辑:我以前弄错了。 要获得此时的输入,您需要获得前面的兄弟,因此您将使用previousSibling 。 另外,请参阅下面关于文本节点和潜在解决方案的系统评论。
var scripts = document.getElementsByTagName('script'), currentScript = scripts[scripts.length - 1], input = currentScript.previousSibling;
你也可以使用jQuery:
var currentScript = $('script').last();
获得脚本后,您可以轻松获得前面的输入:
var input = $('script').last().prev();
这是一个显示我的解决方案的jsfiddle 。
$("input:last").val("test");
这是有效的,因为当到达脚本时,紧接在它之前的输入是要创建的最后一个输入 – 以下尚未添加到DOM。 如果你在页面加载后运行代码(即在
onload
甚至处理程序中),这将不起作用。
值得注意的是,我个人更喜欢ID,因此您不依赖于内联JavaScript(这通常是一个坏主意)。
试试这个:
$("script").prev("input");
原生DOM解决方案:
var all = document.getElementsByTagName("*"); var input = all[all.length - 2];
该script
在运行时将是页面上的最后一个元素,因此input
将是倒数第二个。