18

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

<input type="text"/> <!-- The element I want to select -->
<script>
    // Select the input above
</script>
<input type="text"/>

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

棘手的部分是在执行当前 JavaScript 的标记之前选择input放置的位置。script

也无需问我为什么要这样做,这纯粹是为了美观,如果可能的话,我想这样做而不必在我的输入中添加随机 id。

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

4

6 回答 6

9

脚本总是在加载时运行,所以<script>运行的标签总是页面上的最后一个。使用纯 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();
于 2013-01-21T17:16:32.677 回答
3

这是一个显示我的解决方案的 jsfiddle

$("input:last").val("test");

这是因为当到达脚本时,紧接在其前面的输入是要创建的最后一个输入 - 以下<input>' 尚未添加到 DOM 中。如果您在页面加载后运行代码(即在onload偶数处理程序中),这将不起作用。

值得注意的是,我个人更喜欢 id,这样您就不必依赖内联 JavaScript(这通常是个坏主意)。

于 2013-01-21T17:15:49.830 回答
0

内联脚本总是在解析时运行,并且 <script> 标签只看到他上面的内容。纯 JS 的最佳解决方案:

<input type="text"/> <!-- The element I want to select -->
<script>
    var inputs = document.querySelectorAll('input');
    var above_input = inputs[inputs.length - 1];
</script>
<input type="text"/>
于 2020-05-18T06:05:04.900 回答
-1

尝试这个:

$("script").prev("input");
于 2013-01-21T17:14:12.547 回答
-1

你有没有尝试过这样的事情?

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

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

于 2013-01-21T17:15:33.123 回答
-1

原生 DOM 解决方案:

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

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

于 2013-01-21T17:17:42.953 回答