将方法应用于变量

时间:2013-07-15 15:26:33

标签: javascript jquery

我正在尝试将一个方法添加到一个变量中,以便用作以下内容;

var method = ".wrap";   
jQuery('.container')+[method]+("<div>Hello World</div>");

基本上它应该做的是什么;

jQuery('.container').wrap("<div>Hello World</div>");

但它不起作用,没有错误,页面中没有添加hello world div。 这是原始问题http://goo.gl/MQ2tr,我想我会用更简单的术语再次提出这个问题。

更新 只要我在变量中有一个单独的方法,它就可以使用括号表示法,但是我需要使用类似.parent().parent().wrap()的东西,我该怎样才能使它工作?我尝试删除所有点,但我得到一个错误Uncaught TypeError: Object [object Object] has no method 'parent()parent()wrap'

以下是我的列表表格现在的样子

 <select name="lu_ban_data[method]" id="lu_ban_data" />
        <option value="append">Append</option>
        <option value="prepend">Prepend</option>
        <option value="wrap">Wrap</option>
        <option value="parent()parent()wrap">Parent</option>
</select>

1 个答案:

答案 0 :(得分:5)

只需这样写:

var method = "wrap";   
jQuery('.container')[method]("<div>Hello World</div>");

您可以通过两种方式访问​​对象的属性。通过点表示法方括号表示法

 obj.property
 obj['property']

 var propName = "property"
 obj[propName]

修改

此处指向MDN Member Operators

的链接

对代码执行操作的简短说明:

  jQuery('.container')+[method]+("<div>Hello World</div>");

这是3个要素的补充:

  1. jQuery('.container')
  2. 的结果集
  3. 包含一个元素Array
  4. [method]
  5. String "<div>Hello World</div>"
  6. 这样做的结果取决于实现,但很可能是这样的:

    "[object Object].wrap<div>Hello World</div>"
     +-------------+
                    +---+
                         +--------------------+
    

    结果看起来是这样的,因为JavaScript-Engines通常会在元素上调用toString,如果它们无法以其他方式添加它们。

    修改

    更新已编辑的问题:

     element.parent().parent().wrap()
    

    会等于:

     element['parent']()['parent']().wrap()
    

     element['parent']().parent()['wrap']()
    

    或任何其他组合ob dot 大括号表示法

    您希望将.parent().parent().wrap()表示为一个字符串,并将其用作访问权限。 但这不会那样。 点表示法括号表示法仅返回给定元素的属性。因此,parent()会在您调用parent的此返回对象上返回jQuery('.container') parant(),并在您返回的对象上调用wrap()

    所以(假设只有你的最后一个函数调用会有参数),你需要这样的东西:

    function chainedFunctionCall( obj, chain, arguments) {
        var curr = obj;
        var splitChain = chain.split(".");  //split the 'call chain' passed a strings by '.' (the dot in the string has nothing to do with the dot notation)
    
        //iterate over the resulting array (except the last one where we need to pass the arguments to
        for( var i=0 ; i<splitChain.length-1 ; i++ ) {
            //call the function by the given name in the chain and store the result as current object
            curr = curr[splitChain[i]]();
        }
    
        //when we reached the last name in the chain call that function using `apply` so that we can pass the arguments we got as array to the function call, and call it in the context of the current object.
        return curr[splitChain[i]].apply(curr,arguments);
    }
    
    
    var obj = $(".container");
    var callChain = "parent.parent.wrap";
    
    
    chainedFunctionCall( obj, callChain, ["<div>your argument you pass there</div>"]);