选择脚本标记之前的元素

use*_*278 16 javascript jquery jquery-selectors

如果input不编辑DOM,如何在下面的代码中选择第一个(如果需要,使用jQuery)?

<input type="text"/> <!-- The element I want to select -->
<script>
    // Select the input above
</script>
<input type="text"/>
Run Code Online (Sandbox Code Playgroud)

请注意,此代码示例之前和之后存在未知数量的输入和脚本标记,因此解决方案$("input:eq(1)")不起作用.

棘手的部分是在正在执行当前JavaScript inputscript标记之前选择放置的位置.

没有必要问我为什么要这样做,这纯粹是为了它的美丽,我想这样做而不必在我的输入中添加随机id,如果可能的话.

编辑
这就是为什么大多数答案都不起作用的原因:http://jsfiddle.net/2WqfP/

new*_*ron 10

脚本始终在加载时运行,因此<script>正在运行的标记将始终是页面上的最后一个标记.使用纯JS,你可以这样得到它:

var scripts = document.getElementsByTagName('script'),
    currentScript = scripts[scripts.length - 1];
Run Code Online (Sandbox Code Playgroud)

编辑:我以前弄错了.要获得此时的输入,您需要获得前面的兄弟,因此您将使用previousSibling.另外,请参阅下面关于文本节点和潜在解决方案的系统评论.

var scripts = document.getElementsByTagName('script'),
    currentScript = scripts[scripts.length - 1],
    input = currentScript.previousSibling;
Run Code Online (Sandbox Code Playgroud)

你也可以使用jQuery:

var currentScript = $('script').last();
Run Code Online (Sandbox Code Playgroud)

获得脚本后,您可以轻松获得前面的输入:

var input = $('script').last().prev();
Run Code Online (Sandbox Code Playgroud)

  • @ user1728278:附加的脚本与问题中的情况截然不同.但如果附加了,那么执行追加的代码必须已经知道`input`的位置(因为```相对于`input`放置了),因此能够选择它. (2认同)
  • @@newtron:由于文本节点,`.previousSibling` 将无法工作。你可以使用`.previousElementSibling`,但你会失去一些浏览器支持。@user1728278:如果两者都是由 PHP 生成并动态加载,则您需要采用不同的方法。如果你说你想要一段代码来处理你的问题的任何可能的变化,那么你不太可能找到一个。您需要编写特定于手头问题的代码。该问题的变化通常需要解决方案的变化。 (2认同)

mat*_*mmo -1

尝试这个:

$("script").prev("input");
Run Code Online (Sandbox Code Playgroud)