2011-01-25 39 views
0

從javascript中的頁面調用函數時,是否有一種方法可以在不帶ID的情況下立即引用元素?例如,有沒有辦法在JavaScript函數之前立即引用輸入元素而不使用其ID?

<select>...</select> 

<script type="text/javascript"> 
    my_function(previous_element); 
</script> 

是有一種方法使用選擇元素的ID選擇元件發送到創建my_function()而不

在此先感謝。

編輯:關於我想要做的更多信息。

我正在使用一個rails插件來爲每個元素生成一組具有唯一ID的表單元素的副本。我試圖調用組中的特定表單(選擇)元素的函數 - 理想情況下,我會將onload添加到select元素,但對於表單元素不存在。從頁面內調用函數是我能想到的最好的。由於使用ajax複製元素(IOW是「添加新地址」),如果我添加了具有已知ID的元素,它也會被複制(並創建具有相同ID和混淆的多個元素)。 我知道這真的很麻煩,但我很難想出另一個解決方案,而且這個插件已經很好地集成到了我的項目中。

+0

你爲什麼需要這樣做?我可以想一些方法,比如把一些腳本放在那個區塊裏寫出一個帶有已知ID的元素,然後找出它的ID,然後尋找它以前的兄弟姐妹......這似乎不是一個明智的想法,但我想知道如果有可能完全是另一種方式... – Chris 2011-01-25 15:18:15

+0

只是爲了澄清:是否有任何理由不把標識放在前一個標籤中?通常認爲將標籤放入標籤是一種很好的做法,因爲它更容易從Javascript代碼中引用它們。 – 2011-01-25 15:20:34

+0

解釋是,我使用了一個rails插件,它爲每個表單元素生成一組具有唯一ID的表單元素副本。我試圖調用組中的特定表單(選擇)元素的函數 - 理想情況下,我會使用onload,但對於表單元素不存在...從頁面內調用函數是我能做的最好的。由於元素被複制,如果我添加了具有已知ID的元素,它也將被複制(並創建具有相同ID和混淆的多個元素)。 – Sarah 2011-01-25 15:23:58

回答

1

由於您正在使用nested_forms gem,並且您想要在將它動態添加到窗體後訪問特定元素,是否可以嘗試執行以下操作?

在HTML的頭部分,包含的是nested_form.js文件後,你把這個JavaScript(你可以使用content_for方法或以另一種JavaScript文件的軌道,包括它):

<script type="text/javascript"> 
    $(function() { 
    $('form a.add_nested_fields').live('click', function() { 

     var form = $(this).parent(); // this is the form 

     // you can now traverse the DOM searching for the specific element 
    }); 
    }); 
</script> 

我沒有測試過代碼,但我認爲在添加子字段後會執行該事件。由於您可以訪問事件內部的表單,因此可以遍歷DOM以搜索您嘗試訪問的特定元素。

希望這會有所幫助!

0

如果您使用jquery,您將獲得.next().previous().parent().children()遍歷DOM。

1

我不認爲你可以得到一個腳本塊之前,輸入不帶任何引用,因爲在所有據我所知,在腳本塊運行該腳本將永遠不會知道腳本塊駐留在代碼中,我不認爲存在任何指向腳本塊的指針。

您可能需要能夠在腳本塊上使用的ID,並從那裏使用jQuery函數從克里斯Kooken的回答

0

你可以傳遞一個對象作爲參數傳遞給jQuery的功能,是否有幫助.. 。
(...最好的例子)
假設「羅德」是

function Callme(rodd) { 
    if (rodd.is(":checked")) { 
    // ... 
    } 
} 
1

我已經在那裏我可以在一個環境中解決這個問題,你已經選擇了一個jQuery對象...除了腳本標記本身之外,不控制任何內容(閱讀:廣告)。我目前使用的解決方案如下:

  1. 包含文件而不是內聯腳本。
  2. 將一個變量放入此文件中,該變量包含將用於src-attribute的url。如果在編寫代碼時不知道這一點,則必須使用一些服務器生成的內容而不是靜態文件來響應此文件的請求。 (它仍然可以大部分是靜態的/模板化的,但是你必須從實際的請求中讀取url而不是硬編碼)。
  3. 通過搜索具有與您在步驟2中將腳本放入您的腳本中的請求url變量相同的src屬性的腳本標記來查找腳本標記本身。
  4. 通過遍歷DOM後退一步找到元素之前的元素腳本標記。 (如果你需要細節,請參閱Chris Kooken的回答)。
0

有一種方法

function prevElement(name) { 
    var script = document.getElementsByTagName('script'); 
    var me = script[script.length-1]; 
    name = name.toLowerCase(); 
    return (function(obj) { 
     if(!obj) return null; 
     var n = obj.nodeName.toLowerCase(); 
     if(n == name) return obj; 
     if(n == 'body') return null; 
     if(obj.previousSibling) return arguments.callee(obj.previousSibling, name); 
     return null; 
    })(me.previousSibling); 
} 
    var span = prevElement('span'); 
    alert(span); 
0

我真的不知道,如果這是你想要做什麼,但爲什麼不叫從元素本身事件的功能?

function func(data){ 
    //code here 
} 

<select onchange="func(this.value);"> 
    <option value="Hello">Hello</option> 
    <option value="World">World</option> 
</select> 

這樣,你可以瞬間值傳遞。

相關問題