代码之家  ›  专栏  ›  技术社区  ›  Matt Anxo P

如何将伪jquery对象传递给javascript函数

  •  0
  • Matt Anxo P  · 技术社区  · 15 年前

    我有一个javascript函数,在大多数情况下,它需要对我传递的jquery对象做一些事情。有一个异常,函数不需要jquery对象,但是因为我编写它来接受一个字符串(命令)和一个jquery对象,所以在调用它时需要一些东西来传递它。我的功能如下:

    function handleNotes(command, $item) {
    
            var $textArea = $('#textarea_' + currentDialog); // currentDialog = global var
            var $notesDiv = $('#' + $item.attr('id') + "_notes");
    
        switch (command) {
            case "show":
                // do something with $notesDiv and $textArea
                break;
            case "hide":
                // do something with $notesDiv and $textArea
                });
                break;
            case "hide only":
                // do something with $textArea only
        }
    }
    

    我的函数调用出现问题的地方是:

    handleNotes("hide only");
    

    我试过了 handleNotes("hide only", null) 我试过了 handleNotes("hide only", Object) 运气不好。有什么想法吗?

    谢谢。

    更新

    所以,正如许多人回答的那样,结果是我没有测试$item是否为空,所以它每次都试图设置为某个值(无论对象是否传递给它)。我把我的功能代码改成了:

    function handleNotes(command, $item) {
    
        var $textArea = $('#textarea_' + currentDialog); // currentDialog = global var
    
        if($item) {  // if not null
            var $notesDiv = $('#' + $item.attr('id') + "_notes");
        }
    
        switch (command) {
            case "show":
                // do something with $notesDiv and $textArea
                break;
            case "hide":
                // do something with $notesDiv and $textArea
                });
                break;
            case "hide only":
                // do something with $textArea only
        }
    }
    

    我的函数调用: handleNotes("hide only", null);

    似乎工作得很好。作为对我最初问题的回答,似乎“空”就足够作为一个空白或虚拟对象,或者根本不需要传递它,在这种情况下,函数会自动为它分配一个空值。感谢您的回复。

    5 回复  |  直到 15 年前
        1
  •  1
  •   Dexter    15 年前

    您可以通过测试来避免错误 $item 在尝试访问它之前设置 attr 方法,如:

    function handleNotes(command, $item) {
    
    if ($item) {
    ...
    
        var $textArea = $('#textarea_' + currentDialog); // currentDialog = global var
        var $notesDiv = $('#' + $item.attr('id') + "_notes");
    
        etc..
    

    然后,如果使用 handleNotes("hide only", null) 您将避免使用jquery对象执行要对其执行的代码。

        2
  •  1
  •   matt b    15 年前

    在javascript中,调用一个参数比声明的少的函数是很好的,但是您有一个错误,因为您的代码在函数中 总是 尝试访问 $item .

    如果您重写函数以便只访问 美元项目 当您需要使用它时,您应该能够避免这些错误。

    function handleNotes(command, $item) {
    
        var $textArea = $('#textarea_' + currentDialog); // currentDialog = global var
        var $notesDiv;
        if (command == "show" || command == "hide") {
            $notesDiv = $('#' + $item.attr('id') + "_notes");
        }
    
        switch (command) {
         // ...
        }
    }
    
        3
  •  1
  •   David Hellsing    15 年前

    这可能是因为您使用的是$item,而不知道它是否可以使用。尝试:

    var $notesDiv = $item ? $('#' + $item.attr('id') + "_notes") : null;
    
        4
  •  1
  •   Ben    15 年前

    看起来你有问题,因为你在项目未通过时尝试访问属性tom。在访问成员之前,您应该确保它存在。

    IE.

    if(item && item.attr)
    
        5
  •  1
  •   jpsimons    15 年前

    您还可以这样构造一个空的jquery集:

    jQuery([])
    

    这会给你一个零元素的集合,就像你说的 jQuery("#asdfkadskfkdfas") . 所有jquery方法都将在不引发异常的情况下工作,即使大多数方法都将返回合法值 undefined . 所以你的例子是:

    handleNotes("hide only", jQuery([]));
    

    但是,更好的解决方案是重组你的职能,正如公认的答案所建议的那样。