2013-01-21 19 views
14

Jak wybrać pierwszy kod input w kodzie poniżej bez edytowania DOM (w razie potrzeby za pomocą jQuery)?Wybierz element tuż przed znacznikiem skryptu.

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

Proszę pamiętać, że jest nieznana liczba wejść i znaczniki skryptów przed i po tej próbki kodu, a więc rozwiązania takie jak $("input:eq(1)") nie będzie działać.

Trudną częścią jest wybranie input umieszczonej tuż przed znacznikiem script, z którego wykonywany jest bieżący JavaScript.

Nie muszę pytać mnie dlaczego Chcę to zrobić, to tylko dla piękna tego, chcę to zrobić bez dodawania losowych identyfikatorów do moich danych wejściowych, jeśli to możliwe.

Edit
Oto dlaczego większość odpowiedzi nie będzie działać: http://jsfiddle.net/2WqfP/

Odpowiedz

4

Oto jsfiddle showing my solution.

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

To działa, ponieważ po osiągnięciu skrypt, wejście bezpośrednio poprzedzającym to ostatnie wejście ma zostać utworzony - następujące <input> „s nie zostały jeszcze dodane do DOM. Jeśli uruchomiłeś kod po wczytaniu strony (to jest w obsłudze nawet onload), to by nie działało.

Warto zauważyć, że osobiście wolałbym identyfikatory, aby nie polegać na wbudowanym kodzie JavaScript (co zwykle jest złym pomysłem).

+0

To dobry punkt –

+0

W większości przypadków działałoby, ale niestety fragment kodu jest czasami ładowany do lightboxa, który jest wstawiany na początku DOM. W każdym razie dzięki! – user1728278

+0

O twojej ostatniej frazie, osobiście unikam obu identyfikatorów i wbudowanego JavaScript, ale znasz ćwiczenie, starszy kod i wszystko ... – user1728278

7

Skrypty są zawsze uruchamiane po wczytaniu, więc uruchomiony tag <script> zawsze będzie ostatnim na stronie. Z czystych JS można dostać to tak:

var scripts = document.getElementsByTagName('script'), 
    currentScript = scripts[scripts.length - 1]; 

Edycja: mam to źle wcześniej. Aby uzyskać dane wejściowe w tym miejscu, chcesz uzyskać poprzednie rodzeństwo, więc użyjesz previousSibling. Zobacz także poniższy komentarz systemu na temat węzłów tekstowych i potencjalnego rozwiązania.

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

Można także użyć jQuery:

var currentScript = $('script').last(); 

Gdy masz skrypt, można uzyskać poprzedzający wejście w prosty sposób:

var input = $('script').last().prev(); 
+1

Dzisiaj się nauczyłem. +1 – BoltClock

+0

Rzeczywiście działają tak, jak są załadowane, ale gdy są dołączone na początku DOM (w lightboxie, który działa w ten sposób na przykład), nie możemy być pewni, że wykonywany jest ostatni w DOM. – user1728278

+2

@ user1728278: Dołączony skrypt różni się od tego w pytaniu. Ale jeśli jest on dołączony, to kod robiący załączanie musi już wiedzieć, gdzie jest 'input' (ponieważ' script' jest umieszczony względem 'input'), i dlatego może go wybrać. –

0

Native rozwiązanie DOM:

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

The script będzie ostatnim elementem strony po uruchomieniu, więc input będzie drugim od ostatniego.

Powiązane problemy