选择脚本标记之前的元素

如何在不编辑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"); 

你尝试过这样的事吗?

 var input = $('script').prev(); 

http://api.jquery.com/prev/

原生DOM解决方案:

 var all = document.getElementsByTagName("*"); var input = all[all.length - 2]; 

script在运行时将是页面上的最后一个元素,因此input将是倒数第二个。