2013-01-21 37 views
14

如何在不編輯DOM的情況下選擇以下代碼中的第一個input(如果需要,使用jQuery)?在腳本標記之前選擇元素

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

請注意,輸入和腳本標籤數目不詳的前後這段代碼樣本之後,從而相似$("input:eq(1)")解決方案將無法正常工作。

棘手的部分是選擇input放置在正在執行當前JavaScript的script標記之前。

沒有必要問我爲什麼我想這樣做,這純粹是爲了它的美,我想要做到這一點,而不必爲我的輸入添加隨機ID(如果可能的話)。

編輯
這也是爲什麼大部分的答案是行不通的:http://jsfiddle.net/2WqfP/

回答

0

試試這個:

$("script").prev("input"); 
4

這裏有一個jsfiddle showing my solution

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

這工作,因爲在達到腳本時,輸入前一個是要創建的最後一個輸入 - 以下<input>的還沒有被添加到DOM。如果您在頁面加載後(即在onload偶數處理程序中)運行代碼,則這不起作用。

值得注意的是,我個人更喜歡id,所以你不要依賴inline JavaScript(這通常是一個壞主意)。

+0

這是一個好點 –

+0

它會在大多數情況下工作,但不幸的是代碼片段有時加載在一個燈箱,插入在DOM的開始。雖然謝謝! – user1728278

+0

關於你的最後一個短語,我會親自避免ID和內嵌JavaScript,但你知道鑽取,遺留代碼和所有內容...... – user1728278

7

腳本始終在加載時運行,因此運行的<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(); 
+1

今天我學到了。 +1 – BoltClock

+0

它們確實是在加載時運行的,但是當它們被追加到DOM的開頭時(例如在一個以這種方式工作的燈箱中),我們無法確定被執行的是最後一個在DOM中。 – user1728278

+2

@ user1728278:附加的腳本與問題中的腳本完全不同。但是如果附加,那麼執行附加操作的代碼必須已經知道「輸入」的位置(因爲「腳本」相對於「輸入」被放置),因此可以選擇它。 –

0

本土DOM的解決方案:

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

當它運行時,將是頁面上的最後一個元素,因此input將倒數第二。