如何在JavaScript中获取输入文本的值

66

如何在JavaScript中获取输入文本的值?

<script language="javascript" type="text/javascript">
    lol = document.getElementById('lolz').value;
    function kk(){
    alert(lol);
    }
</script>

<body>
    <input type="text" name="enter" class="enter" value="" id="lolz"/>
    <input type="button" value="click" OnClick="kk()"/>
</body>

我把lol = document.getElementById('lolz').value;放在函数kk()外面,像上面显示的那样,它不起作用,但是当我把它放在里面时,它就可以工作。有人可以告诉我为什么吗?

13个回答

72

如果你在函数之外定义了lol,那么函数不起作用的原因是当JavaScript第一次运行时,DOM尚未加载。因此,getElementById将返回null请参见MDN)。

你已经找到了最明显的解决方案:在函数内部调用getElementById,这样DOM会在函数调用时加载并准备好,就像你预期的那样找到元素。

还有其他几种解决方案。其中一种是等待整个文档加载完成,像这样:

<script type="text/javascript">
    var lolz;
    function onload() { 
        lolz = document.getElementById('lolz');
    }
    function kk(){
        alert(lolz.value);
    }
</script>

<body onload="onload();">
    <input type="text" name="enter" class="enter" value="" id="lolz"/>
    <input type="button" value="click" onclick="kk();"/>
</body>

注意 <body> 标签的 onload 属性。 (顺便提一下:<script> 标签的 language 属性已经被弃用,请不要使用。)

然而,onload 存在一个问题:它会等待直到所有内容(包括图像等)都加载完成。

另一个选项是等待 DOM 准备就绪(通常比 onload 早得多)。这可以使用“纯” JavaScript 完成,但使用 DOM 库(如jQuery)会更容易。

例如:

<script type="text/javascript">
    $(document).ready(function() {
        var lolz = $('#lolz');
        var kk = $('#kk');
        kk.click(function() {
            alert(lolz.val());
        });
    });
</script>

<body>
    <input type="text" name="enter" class="enter" value="" id="lolz"/>
    <input type="button" value="click" id="kk" />
</body>

jQuery的.ready()将一个函数作为参数。该函数将在DOM准备就绪时立即运行。第二个示例还使用.click()来绑定kk的onclick处理程序,而不是在HTML中内联执行。


3
第一种解决方案的第二个问题是它并不会在按钮被点击的确切时间读取输入的值。你在第二个解决方案中使用了jQuery的val()方法来解决这个问题。 - nalply
1
只是一条评论,但是为什么在问一个纯粹的jscript问题时要使用jquery来回答呢?Jquery很棒,但并不是每个网页都绝对需要它。也许用户想要100%“纯”的javascript。看看这个网站:http://youmightnotneedjquery.com/ - viridis
今天的世界都是关于混合的。想一想 - 如果没有第三方库(并且充斥着),Github将会是一个非常遗憾的状态。 - carla

15
不要以这种方式使用全局变量。即使这可能起作用,这也是糟糕的编程风格。你可能会无意中覆盖重要数据。请改为采用以下方法:
<script type="text/javascript">
   function kk(){
       var lol = document.getElementById('lolz').value;
       alert(lol);
   }
</script>

如果你坚持要在函数kk外设置变量var lol,那么我提出以下解决方案:
<body>
    <input type="text" name="enter" class="enter" value="" id="lolz"/>
    <input type="button" value="click" OnClick="kk()"/>
    <script type="text/javascript">
       var lol = document.getElementById('lolz');
       function kk() {
           alert(lol.value);
       }
    </script>
</body>

请注意,script 元素必须在其引用的 input 元素之后,因为只有已解析和创建的元素才能使用 getElementById 进行查询。
两个示例都可以正常工作,在 jsfiddler 中进行了测试。 编辑:我删除了 language="javascript" 属性,因为它已被弃用。请参见 W3 HTML4 Specification, the SCRIPT element
“language” = cdata [CI](语言 = cdata [CI])
“Deprecated”(已弃用):该属性指定此元素内容的脚本语言。其值是语言的标识符,但由于这些标识符不是标准的,因此该属性已被弃用,改用“type”。
弃用的元素或属性是指已被新构造所取代的元素或属性。[…] 弃用的元素可能在未来的 HTML 版本中变得过时。[…] 本规范包括示例,说明如何避免使用已弃用的元素。[…]

9
<script type="text/javascript">
function kk(){
    var lol = document.getElementById('lolz').value;
    alert(lol);
}


</script>

<body onload="onload();">
    <input type="text" name="enter" class="enter" id="lolz" value=""/>
    <input type="button" value="click" onclick="kk();"/>
</body>

使用这个


7
请注意这一行代码:

lol = document.getElementById('lolz').value;

在您的标记中,<input>元素之前是实际的:

<input type="text" name="enter" class="enter" value="" id="lolz"/>

您的代码逐行解析,而lol = ...行在浏览器知道存在id为lolz的输入之前就被评估了。因此,document.getElementById('lolz')将返回nulldocument.getElementById('lolz').value应该会导致错误。

将该行移至函数内部,则应该可以正常工作。这样,只有在调用函数时才会运行该行。并像其他人建议的那样使用var,以避免将其变成全局变量:

function kk(){
    var lol = document.getElementById('lolz').value;
    alert(lol);
}

您还可以将脚本移到页面末尾。将所有脚本块移到HTML <body> 的末尾是今天的标准做法,以避免此类引用问题。它还倾向于加快页面加载速度,因为需要长时间加载和解析的脚本将在HTML被(大部分)显示后处理。


1
还需注意,为了快速加载,JavaScript 应该放在页面底部,而不是像上面的示例中所示的 HTML 之前。然后它也识别给定的 HTML 元素。 - Mauno Vähä
1
非常清晰的解释,谢谢! - Maria
1
是的,那是一个选择。就快速加载而言,在这种情况下不会有太大的区别。 - bfavaretto
1
我相信无论如何我们都应该提供最佳实践 :) - Mauno Vähä
1
@user1561559 刚才有一个错误,我已经修复了:你发布的那一行代码不会将 undefined 赋值给 lol,而是会导致 JavaScript 错误。 - bfavaretto
@MaunoV。你说得对,我刚刚在结尾处添加了一个段落来说明这一点。 - bfavaretto

7

编辑:

  1. 将您的JavaScript移动到页面末尾,以确保在访问它们之前DOM(HTML元素)已加载完毕(将JavaScript放置在末尾以实现快速加载)。
  2. 始终像示例中使用 var textInputVal = document.getElementById('textInputId').value;声明您的变量。
  3. 为输入和元素使用描述性名称(这样更容易理解自己的代码,以及当其他人查看代码时也更容易理解)。
  4. 要了解有关getElementById的更多信息,请参见:http://www.tizag.com/javascriptT/javascript-getelementbyid.php
  5. 使用jQuery等库可以使JavaScript使用起来更加方便,要了解更多信息,请参见:http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery

请参考bfavarettos的回答和我的评论以获得完整解释,他更快! :) - Mauno Vähä

4
如何在JavaScript中获取输入文本的值

    var textbox;
    function onload() { 
        //Get value.
        textbox = document.getElementById('textbox');
    }

    function showMessage() { 
        //Show message in alert()
        alert("The message is: " + textbox.value);
    }
<body onload="onload();">
<div>
<input type="text" name="enter" class="enter" placeholder="Write something here!" value="It´s a wonderful day!" id="textbox"/>
<input type="button" value="Show this message!" onClick="showMessage()" />
</div>


3
作为你的lol现在是局部变量,使用var关键字声明任何变量是一个好习惯。
这可能适合你:
function kk(){
  var lol = document.getElementById('lolz').value;
  alert(lol);
}

3
<script>
function subadd(){
subadd= parseFloat(document.forms[0][0].value) + parseFloat(document.forms[0][1].value) 
window.alert(subadd)  
}
</script>

<body>
<form>
<input type="text" >+
<input type="text" >
<input type="button" value="add" onclick="subadd()">
</form>
</body>

3
所有上述解决方案都很有用。它们都使用了该行。
lol = document.getElementById('lolz').value;

在函数 function kk() 内部。
我的建议是,你可以从另一个函数 fun_inside() 中调用该变量。
function fun_inside() {    
    lol = document.getElementById('lolz').value;
}
function kk() {
    fun_inside();
    alert(lol);
}

当您构建复杂项目时,这将非常有用。


3
<input type="password"id="har">
<input type="submit"value="get password"onclick="har()">
<script>
    function har() {
        var txt_val;
        txt_val = document.getElementById("har").value;
        alert(txt_val);
    }
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接