2011-09-23 63 views
0

假設我有這個部分。將一個元素的事件處理程序附加到另一個JS中

<input id="text1" type="text" name="text1" onchange="alert('valueA');" /><br /> 
<input id="text2" type="text" name="text2" /><br /> 

什麼我想要做的是讓輸入=「text1」中的onchange事件處理程序,並連接到另一個元素的事件,「文本2」。 到目前爲止,沒關係。我可以獲得輸入「text1」的DOM0 hanlder,並將其作爲DOM2附加到文本2。

_handler= $('#text1')[0].onchange; 
      $('#text2').change(function (event) { 
      if (typeof _handler=== "function") { 
         _handler.call(this, event); 
      } 

但是,問題是,我想換/連接到「文本2」之前添加一些JS代碼。例如,在附加到「text2」之前,我想更改「alert('valueA');」到「alert('valueA.This是text2')」; 我該如何做到這一點?
警報聲明只是一個例子,請不要給解決方案,如將警報消息存儲到全局變量,顯示變量的值..等等。

謝謝。

回答

1

這是無法完成的。您不能更改函數內部的代碼。

儘管Javascript函數是可變對象,但您只能向它們添加屬性和方法,但不能更改其內部的代碼。


如果你想使用邪惡eval(如你在評論中指定的),你可以在功能轉換爲字符串,代替你想要的任何文本的功能裏面,然後EVAL它:

$('#text2').change(function (event) { 
    eval(
     '(' + $('#text1')[0].onchange.toString().replace('valueA', 'valueB') + ')()' 
    ); 
}); 

而這裏的小提琴:http://jsfiddle.net/A4w2W/

但是,請請請不要這樣做。這是編寫代碼最糟糕的方法,有史以來
你應該認真重新考慮你對這件事的處理方法。

+0

同意。如果我不直接改變他們呢?我在想的是將函數轉換爲字符串,替換它,轉換回函數。可能嗎?像eval()? – Kai

+0

Thanks.Joseph。我已經使用了不同的方法。 – Kai

-1

從技術上講,沒有。但還有其他解決方案。

<script type="text/javascript"> 
<!-- 
alertvalue = "valueA"; 
//--> 
</script> 
<input id="text1" type="text" name="text1" onchange="alert(alertvalue);" /><br /> 
<input id="text2" type="text" name="text2" /><br /> 
<script type="text/javascript"> 
$('#text2').change(function(event) { 
     alert(alertvalue + '. This is text2'); 
}); 
</script> 
+0

我的要求雖然聽起來不敏感,但並不像你想象的那麼簡單。我的onchange事件處理程序可以是任何東西。正如我在我的問題中提到的,我只是提供了一個警告語句,只是一個示例。有時候,它可能是alert()。有時候,這可能是一些表達。 – Kai

+0

那麼我的解決方案仍然存在。使用全局變量或閉包中創建的變量,可以使用動態函數。評估一個字符串是不切實際的(因爲它很快就會變得麻煩)並且很難做到。而且,在許多瀏覽器中,字符串評估速度很慢。 –

+0

如果你仔細檢查我的問題,我已經提到不要像使用全局變量那樣給出解決方案。 我知道有更好的解決方案,而不是字符串形式。就像在函數中創建參數一樣,並按順序傳遞給它以使其行爲不同。但是,由於某些原因,我無法應用它。 – Kai

相關問題