在javascript中将函数作为字符串返回

时间:2009-07-11 07:59:59

标签: javascript function this

我正在编写一个javascript对象,其中包含一个返回标准表单html的方法。在这个对象中我还有一个方法validate(); 我希望生成的表单使用validate();

因此,验证表单的典型html可能如下所示:

<form id="a" onSubmit="return validate();">

问题是我需要能够引用对象实例 它需要更像onSubmit="my_object.validate();">

我尝试过类似的东西 return '<form id="a" onSubmit="return ' + this.validate + '();">'; 但我的行为真的很奇怪。

如果我使validate函数任意返回true表单被提交,false则不然。如果我在方法中进行任何其他计算,我会收到此错误:

> Error: syntax error Source Code:
>     return id ==

有没有人经历过这样的事情?

4 个答案:

答案 0 :(得分:5)

您可以输出HTML,获取对表单对象的引用,然后以编程方式附加事件处理程序,而不是在HTML属性中输出事件处理程序,如下所示:

<html>
  <head>
    <script type="text/javascript">
        var my_object = {
            outputForm: function(container) {
                container.innerHTML = 
                    '<form id="a"><input type="submit" value="Validate" /></form>';
                this.createdForm = document.getElementById('a');
                this.createdForm.onsubmit = this.validate;
            },
            validate: function() {
                // use this.createdForm to get at the controls.
                alert("Who dares awake my slumber?");
            }
        };

        function createTheForm() {
            my_object.outputForm(document.getElementById('container'));
        }
    </script>
  </head>
  <body onload="createTheForm()">
    <div id="container"></div>
  </body>
</html>

答案 1 :(得分:0)

很抱歉发布此作为答案,注册后不会让我编辑我的原始帖子作为非注册用户?

我想到了eval,但我不确定如何在这种情况下使用它?我已经尝试过了

' onSubmit="return eval(' + this.validate+'();)">';

和其他一些变化,但我得到了同样的错误。

我希望避免手动添加事件处理,因为我希望它是非常独立的。我正在考虑设置一个常规函数,它位于对象之外,然后执行类似

的操作
' onSubmit="return my_function(' + this + ');">';

然后在my_function中执行此操作:

my_function(given){ return given.validate(); }

这似乎是一个糟糕的黑客,我甚至不确定它是否会起作用。

答案 2 :(得分:0)

为什么在将元素添加到页面并使用闭包来保持范围后,不仅仅将它应用于元素?

var myId = "bar" + index;
foo.innerHTML="<form id='" + myId + "'>...</form>";
var that = this;
document.getElementById(myId).onsubmit = function(){ that.validate(this); }

向标记添加事件处理程序总是一个坏主意。

答案 3 :(得分:-2)

使用eval()以javascript

执行字符串

<强> [EDIT} 听起来就像你需要对表单进行原型设计然后在提交中调用this.validate()。使用javascript创建表单对象时获取对该表单对象的引用,然后定义验证方法并将其分配给validate属性。