2011-09-23 65 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

相关问题