2013-01-21 12 views
14

से पहले तत्व का चयन करें आप डीओएम को संपादित किए बिना नीचे दिए गए कोड में पहले input का चयन कैसे करेंगे (यदि आवश्यक हो तो jQuery का उपयोग कर)?स्क्रिप्ट टैग

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

कृपया ध्यान दें से पहले और इस कोड को नमूना के बाद इनपुट और स्क्रिप्ट टैग की संख्या अज्ञात है, इस प्रकार $("input:eq(1)") तरह समाधान काम नहीं करेगा।

मुश्किल हिस्सा input को script टैग से ठीक पहले रखा गया है, जिससे वर्तमान जावास्क्रिप्ट निष्पादित किया जा रहा है।

मुझे पूछने की कोई आवश्यकता नहीं है क्यों मैं इसे या तो करना चाहता हूं, यह पूरी तरह से इसकी सुंदरता के लिए है, मैं इसे संभवतः अपने इनपुट में यादृच्छिक आईडी जोड़ने के बिना करना चाहता हूं।

संपादित
क्यों अधिकतर उत्तर काम है नहीं: http://jsfiddle.net/2WqfP/

उत्तर

4

यहाँ एक jsfiddle showing my solution है।

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

यह काम करता है क्योंकि जब स्क्रिप्ट तक पहुँच जाता है, इनपुट तुरंत पूर्ववर्ती यह पिछले इनपुट बनाया जाना है - निम्नलिखित <input> के डोम में जोड़ दिया गया अभी तक नहीं किया है। यदि आप पेज लोड के बाद कोड चलाते हैं (यानी, onload में हैंडलर भी), यह काम नहीं करेगा।

यह ध्यान देने योग्य है कि मैं व्यक्तिगत रूप से आईडी पसंद करता हूं, ताकि आप इनलाइन जावास्क्रिप्ट पर भरोसा न करें (जो आम तौर पर एक बुरा विचार है)।

+0

एक अच्छी बात है –

+0

यह ज्यादातर मामलों में काम करेगा, लेकिन दुर्भाग्यवश कोड स्निपेट को कभी-कभी लाइटबॉक्स में लोड किया जाता है, जो डोम की शुरुआत में डाला जाता है। हालांकि धन्यवाद! – user1728278

+0

आपके अंतिम वाक्यांश के बारे में, मैं व्यक्तिगत रूप से दोनों आईडी और इनलाइन जावास्क्रिप्ट से बचता हूं, लेकिन आप ड्रिल, विरासत कोड और सबकुछ जानते हैं ... – user1728278

7

लिपियों को हमेशा लोड होने के रूप में चलाया जाता है, इसलिए <script> टैग जो चल रहा है वह हमेशा पृष्ठ पर अंतिम होगा। शुद्ध जे एस के साथ आप इसे इस तरह प्राप्त कर सकते हैं:

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 input = $('script').last().prev(); 
+1

आज मैंने सीखा। +1 – BoltClock

+0

वे वास्तव में लोड होते हैं क्योंकि वे लोड होते हैं, लेकिन जब उन्हें डोम की शुरुआत में जोड़ा जाता है (एक लाइटबॉक्स में जो उदाहरण के लिए काम करता है), हम सुनिश्चित नहीं कर सकते कि जिस पर निष्पादित किया जा रहा है वह है डोम में आखिरी एक। – user1728278

+2

@ user1728278: एक स्क्रिप्ट संलग्न किया जा रहा है, इस सवाल से एक बहुत ही अलग स्थिति है। लेकिन अगर इसे जोड़ा गया है, तो संलग्न करने वाले कोड को पहले ही पता होना चाहिए कि 'इनपुट' कहां है (चूंकि' स्क्रिप्ट' 'इनपुट' के सापेक्ष रखा गया है), और इसलिए इसे चुनने में सक्षम होगा। –

0

मूल निवासी डोम समाधान:

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

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

एक बार जब आप स्क्रिप्ट है, तो आप आसानी से ठीक पहले इनपुट प्राप्त कर सकते हैं

जब यह चलता है तो पेज परअंतिम तत्व होगा, इसलिए input अंतिम के लिए दूसरा होगा।

संबंधित मुद्दे