【问题标题】:Javascript grabbing user input field and using it in a variableJavascript抓取用户输入字段并在变量中使用它
【发布时间】:2018-07-20 19:06:15
【问题描述】:

我有一个 ID 为 userName 的用户输入,并且在用户完成在文本框中输入文本然后将其存储在变量(目录路径)中后,我试图使用 $("#userName").val() 获取用户输入文本,但是,我对$("#userName").val() 没有定义。我认为未定义的发生是因为文本字段在运行时尚未准备好,所以我试图设置一个回调函数以在我的目录路径中使用,但是当我在下面执行console.log("This is the field name: " + getUserName()); 时仍然未定义是我的回调函数:

function getUserName(){
    $("#userName").keyup(function(){
        console.log(this.value);
        return this.value;
    });
}

我在这里尝试在我的目录变量中使用它(变量filePath 函数getUserName()之外):

var filePath = "/my/path/to/the/file/" + getUserName() + ".txt";

但是,当我这样做时,我仍然不确定。我在这里做错了吗?

更新:

name.html:
<div class="subArea" id="pvDiv">
    <p id="nameP">Name:
        <input id="userName" class="userInput" type="text" placeholder="Enter Name">
    </p>
</div>

【问题讨论】:

  • 提供你输入的html
  • 您提供的不是“回调”功能。当调用该函数时,您有一个在元素上注册事件处理程序的函数(是的,每次调用该函数时都会重新绑定)。
  • getUserName() 函数实际上并没有返回任何东西。它将keyup 事件的事件处理程序附加到id 为userName 的元素,然后退出,默认返回undefined。处理keyup 事件的函数将this.value 返回到事件处理例程。如果你想在getUserName()函数中获取用户名,return $('#userName').val();会更好。
  • 在次要注意 - 您不能从事件处理程序返回值,因此 return this.value 在这种情况下毫无意义
  • 您的两个最简单的选择是让getUserName() 返回$("#userName").val(),或者如果您想在每次击键时更新文件路径,只需将filePath = "my/path/" + this.value + ".txt" 放入您的keyup 处理程序中。确保在事件处理程序之外定义filePath,以便它更新并在您需要的任何地方可见。

标签: javascript jquery


【解决方案1】:

由于很多原因,您的代码没有意义,其中大部分可以在您问题下的 cmets 中找到。简而言之:

    1234563 p>
  • 您忽略了一个事实,即事件处理程序的执行是异步操作并且不返回任何内容。

  • 即使上述情况可行,您在getUserName 中仍然没有return 语句。

尝试使用以下事件之一并在事件处理程序内部构造路径:

  • blur 事件,当 input 失去焦点时触发。
  • change 事件,当input 的值发生更改时触发。

代码:

$("#userName").on("change", function() {
   var filePath = "/my/path/to/the/file/" + this.value + ".txt";
   console.log("The new path is '" + filepath + "'.");
});

【讨论】:

  • .on("change") 会更合适,因此不会在每次用户聚焦和模糊字段(通过选项卡或点击)时触发
  • 我会把它留给 OP 来决定 @mhodges。但感谢您的评论;我确保在答案中包含您的建议。
  • 事件处理回调不是异步操作,它只是在自己的范围内运行。所有事件处理程序都按绑定顺序同步触发
  • 我没有说 callback 是异步操作@ecarrizo。我说它的 execution 是,因为回调在作为参数传递时不会立即执行,而是在事件触发之后执行。
  • 我误导了,由于用户按下按钮和创建处理程序的代码之间存在时间差异,因此它们之间的代码执行是异步的(时间不重合)。我误读并认为你的意思是别的。
【解决方案2】:

直接使用$("#userName").val()获取输入值的问题可能是由于执行该代码时DOM尚未准备好,或者您没有等待某个事件发生,看看

call a function after complete page load

并且输入上的 Keyup 事件处理程序未正确实现,因为它不会在您的函数中返回任何内容。

然后根据您希望如何处理用户输入是您需要实施的解决方案,这样的事情应该可以工作。

var filePath;

function updateFilePath() {
    filePath = 'myPath/' + this.value + '.txt';
    console.log('The file path has changed to: %s', filePath);
}

// When the dom Is ready to be used, you execute your code.
$(function() {
    // Add an event handler when userName input value change 
    $('#userName').on('change', updateFilePath);
})

正如 cmets 中所说,您可以使用其他事件,例如“keyup”、“blur”或任何更适合您需求的事件,但“change”可能是您的最佳选择。

【讨论】:

  • 在我的页面上没有按钮,它只是一个带有自动完成功能的文本字段。一旦用户输入前几个字母,他们的名字就会自动完成,他们只需点击它建议的名字。有没有其他方法可以在没有按钮的情况下做到这一点?
  • @kkmoslehpour 好吧,我已经修改了示例以匹配您丢失的 HTML 代码。
  • 非常感谢您的帮助!真的为我清除了一切:)
  • 很高兴为您提供帮助:)
【解决方案3】:
  • 您可以将自定义事件(即:refreshAutoComplete)绑定到您的目标元素。
  • 当用户在您的输入文本中输入信息时触发该事件。
  • 在整个触发器执行过程中传递输入的数据
$('#autocompleteResult').trigger('refreshAutoComplete', [{userData: this.value}]);
  • 获取该数据并执行您的逻辑
var filePath = "/my/path/to/the/file/" + data.userData + ".txt"; $(this).html(filePath);

这种方法将职责分开:

  1. 用户输入事件。
  2. 输入的用户数据的操作。

现在您的 filePath 逻辑已分离,可以从您的 JS 应用程序的其他部分重复使用。

$(document).on('input', '#userName', function() {
  $('#autocompleteResult').trigger('refreshAutoComplete', [{userData: this.value}]);
});

$(document).on('refreshAutoComplete', '#autocompleteResult', function(e, data) {
  var filePath = "/my/path/to/the/file/" + data.userData + ".txt";
  $(this).html(filePath);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="subArea" id="pvDiv">
  <p id="nameP">Name:
    <input id="userName" class="userInput" type="text" placeholder="Enter Name">
  </p>
  <p id='autocompleteResult'>
  </p>
</div>

【讨论】:

    【解决方案4】:

    您创建的函数只是将 keyup 事件绑定到文本框。该函数 getUsername 在您输入时被调用。

    要获取它的值,您可以使用 $("#userName").val() 所以你可以使用

    设置文件路径
    var filePath = "/my/path/to/the/file/" +  $("#userName").val() + ".txt";
    

    如果只需要在userName字段存在的情况下进行,可以这样做:

    if( $("#userName").length > 0)
        filePath = "/my/path/to/the/file/" +  $("#userName").val() + ".txt";
    

    希望这会有所帮助。

    【讨论】:

    • 最好不要在带有验证的示例中两次获取元素。将其存储在变量中并将其用作元素引用。
    • 我同意。将来会确保我提供优化的示例代码。
    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多