【问题标题】:Passing String as parameter into jQuery function将字符串作为参数传递给 jQuery 函数
【发布时间】:2013-01-17 19:15:59
【问题描述】:

我遇到了一个奇怪的 jQuery 问题。我正在编写一个接受字符串作为参数的函数,然后将该字符串输入到 jQuery 选择器中。

函数如下:

function myFunction(specialfields) {
   if(!$(specialfields).is(':focus')) {
       alert('thats not in focus');
   }
 }

但是,我不断收到此错误:

 Uncaught Syntax error, unrecognized expression: focus 

但奇怪的是 '.is(':focus') '在其他领域工作,当不接受参数时,如果我通过这个:

 $(specialfields)

它确实读取为有效对象。我正在尝试传递这样的字符串:

#id1, #id2

此外,这有效:

$(specialfields).val()

有人知道这里发生了什么吗?

【问题讨论】:

  • 顺便说一句,您使用 selector 作为参数名称,但将 specialfields 传递给 jQuery。
  • 抱歉,在我的例子中打错了!
  • 只需执行console.log 并弄清楚
  • “specialfields”变量的值究竟是什么?
  • 我相信我找到了问题——我将两个变量作为特殊字段“#id1,#id2”传递。这可能会打破焦点

标签: javascript jquery jquery-selectors parameters


【解决方案1】:

好的,我认为问题在于我将两个参数传递给“特殊字段”,这破坏了 ':focus' 选择器,因为显然您不能同时拥有两个焦点。

可以通过在函数中只传递一个选择器来修复它。

【讨论】:

    【解决方案2】:

    结论

    你的方法一直有效,而且比我浪费时间的方法更快。


    详情

    我对函数的定义略有不同,我通过将响应传递给<p id="response"> 来替换alert() 功能。

    HTML:

    <input type="text" name="id1" id="id1" />
    <br />
    <input type="text" name="id2" id="id2" />
    <br />
    <p id="response">response</p>
    

    JavaScript:

    var myFunction = function (specialfields) {
      if ($(specialfields + ':focus').length === 0) {
        $('#response').text(specialfields + ' is not in focus');
      } else {
        $('#response').text(specialfields + ' is in focus');
      }
    };
    

    有关工作示例,请参阅 http://jsfiddle.net/jhfrench/UufWD/

    您会注意到我用if ($(specialfields + ':focus').length === 0) 评估:focus 的传入参数。

    我以为这样会更快,但是that is not the case

    从好的方面来说,这个方法确实可以处理多个选择器参数(例如#id1, #id2');参见http://jsfiddle.net/jhfrench/UufWD/19/)。不过你原来对if(!$(specialfields).is(':focus'))的评价更好。


    现在请参阅http://jsfiddle.net/jhfrench/UufWD/14/,了解您的方法的工作示例。

    【讨论】:

      【解决方案3】:
      I think .focus() should be enough, as :focus is not a selector.
      

      没有本地解决方案,但是有一种更优雅的方式可以做到:

      jQuery.extend(jQuery.expr[':'], {
        focus: "a == document.activeElement"
      });
      

      您正在定义一个新的选择器。请参阅插件/创作。然后你可以这样做:

      if ($("...").is(":focus")) {
        ...
      }
      

      来源—— Is there a 'has focus' in JavaScript (or jQuery)?

      【讨论】:

      • jQuery 1.6 添加了:focus.