【问题标题】:Attach one element's event handlers into another in JS在 JS 中将一个元素的事件处理程序附加到另一个元素中
【发布时间】:2011-09-23 02:41:09
【问题描述】:

假设我有这部分。

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

我想要做的是获取 input="text1" 的 onchange 事件处理程序并附加到另一个元素的事件“text2”。 到目前为止,没关系。我可以获取输入“text1”的 DOM0 处理程序,并作为 DOM2 附加到文本 2。

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

但是,问题是,我想在附加到“text2”之前更改/添加一些 js 代码。 例如,在附加到“text2”之前,我想更改“alert('valueA');”进入“警报('valueA.This is text2')”; 我该怎么做才能做到这一点?
alert 语句只是示例,请不要给出解决方案,例如将警报消息存储到全局变量中,显示变量的值..等等。

谢谢。

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    这是无法做到的。您不能更改函数内部的代码。

    虽然Javascript函数是可变对象,但是你只能给它们添加属性和方法,但是你不能改变它们里面的代码。


    如果您想使用邪恶的eval(正如您在 cmets 中指定的那样),您可以将函数转换为字符串,替换函数中所需的任何文本,然后对其进行评估:

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

    这是小提琴:http://jsfiddle.net/A4w2W/

    但是,请不要这样做。这是编写代码的最糟糕的方式,有史以来!!
    您应该认真重新考虑您对整个问题的处理方式。

    【讨论】:

    • 同意。如果我不直接更改它们怎么样???我在想的是将函数转换为字符串,替换它,再转换回函数。是否可以?类似 eval()??
    【解决方案2】:

    从技术上讲,没有。但还有其他解决方案。

    <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>
    

    【讨论】:

    • 我的要求,虽然听起来不明智,但并不像你想的那么简单。我的 onchange 事件处理程序可以是任何东西。正如我在问题中提到的,我给出的警告声明只是一个例子。有时,它可以是 alert()。有时,可能是一些表情。
    • 那么我的解决方案仍然有效。使用全局变量或在闭包中创建的变量,您可以拥有动态函数。评估字符串是不切实际的(因为它很快就会变得混乱)并且很难做到。此外,在许多浏览器中,字符串评估很慢。
    • 如果您仔细检查我的问题,我已经提到不要提供诸如使用全局变量之类的解决方案。我知道除了字符串评估之外还有更好的解决方案。类似于在函数中创建参数,并相应地传递给它以使其行为不同。但是,由于某些原因,我无法应用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多