JavaScript点击事件-为什么我需要两个AddEventListener?

JavaScript点击事件-为什么我需要两个AddEventListener?,javascript,click,addeventlistener,Javascript,Click,Addeventlistener,我正在尽最大努力学习低调的JavaScript。下面的代码试图更改我在HTML标记中使用getArrays函数调用的现有实践片段。这是我能开始工作的唯一版本。虽然它工作起来很好,但我觉得可能有一些不必要的部分,并且不完全理解为什么我需要最后一行代码(对于addEventListener来说是一种新的东西)。我正在研究Mozilla DOM参考示例,并且已经知道如何在jQuery中实现这一点。谢谢 JavaScript: <script> functi

我正在尽最大努力学习低调的JavaScript。下面的代码试图更改我在HTML标记中使用getArrays函数调用的现有实践片段。这是我能开始工作的唯一版本。虽然它工作起来很好,但我觉得可能有一些不必要的部分,并且不完全理解为什么我需要最后一行代码(对于addEventListener来说是一种新的东西)。我正在研究Mozilla DOM参考示例,并且已经知道如何在jQuery中实现这一点。谢谢

JavaScript:

        <script>

        function getArrays() {
            var ddlValArray = new Array();
            var ddlTextArray = new Array();
            var ddl = document.getElementById("ddlFlavors");

            for (i=0; i<ddl.options.length; i++) {
                ddlValArray[i] = ddl.options[i].value;
                ddlTextArray[i] = ddl.options[i].text;
                alert(ddlValArray[i] + ' ' + ddlTextArray[i]);  
            }
        }

        function showArrays() {
            var link = document.getElementById("clickHandler");
            link.addEventListener("click", getArrays, false);   
        }

        document.addEventListener("DOMContentLoaded", showArrays, false);


    </script>

函数getArrays(){
var ddlValArray=新数组();
var ddlTextArray=新数组();
var ddl=document.getElementById(“ddl”);

对于(i=0;i这行代码:
document.addEventListener(“DOMContentLoaded”,showArrays,false);
确保函数
showArrays()
在DOM准备好之前不会开始执行。换句话说,函数
showArrays()
将在(X)HTML文档加载和解析后开始执行

我建议您将JavaScript代码放在一个单独的文件中,并在
head
部分使用以下HTML代码:
。然后您还可以使用
window.onload
onclick
事件,而不是
document.addEventListener()
方法

当您这样做时,您可以将代码放在
showArrays
函数的主体之外,然后删除该函数

例如:

window.onload = function()
{
  var link = document.getElementById("clickHandler");
  link.onclick = getArrays;
}
这被认为是一种更好的做法

完整示例

script.js
文件中:

//This is the beginning of the script...

    function getArrays() {
        var ddlValArray = new Array();
        var ddlTextArray = new Array();
        var ddl = document.getElementById("ddlFlavors");

        for (i=0; i<ddl.options.length; i++) {
            ddlValArray[i] = ddl.options[i].value;
            ddlTextArray[i] = ddl.options[i].text;
            alert(ddlValArray[i] + ' ' + ddlTextArray[i]);  
        }
    }

window.onload = function()
{
  var link = document.getElementById("clickHandler");
  link.onclick = getArrays;
}
//这是脚本的开头。。。
函数getArrays(){
var ddlValArray=新数组();
var ddlTextArray=新数组();
var ddl=document.getElementById(“ddl”);

对于(i=0;i这行代码:
document.addEventListener(“DOMContentLoaded”,showArrays,false);
确保函数
showArrays()
在DOM准备好之前不会开始执行。换句话说,函数
showArrays()
将在(X)HTML文档加载和解析后开始执行

我建议您将JavaScript代码放在一个单独的文件中,并在
head
部分使用以下HTML代码:
。然后您还可以使用
window.onload
onclick
事件,而不是
document.addEventListener()
方法

当您这样做时,您可以将代码放在
showArrays
函数的主体之外,然后删除该函数

例如:

window.onload = function()
{
  var link = document.getElementById("clickHandler");
  link.onclick = getArrays;
}
这被认为是一种更好的做法

完整示例

script.js
文件中:

//This is the beginning of the script...

    function getArrays() {
        var ddlValArray = new Array();
        var ddlTextArray = new Array();
        var ddl = document.getElementById("ddlFlavors");

        for (i=0; i<ddl.options.length; i++) {
            ddlValArray[i] = ddl.options[i].value;
            ddlTextArray[i] = ddl.options[i].text;
            alert(ddlValArray[i] + ' ' + ddlTextArray[i]);  
        }
    }

window.onload = function()
{
  var link = document.getElementById("clickHandler");
  link.onclick = getArrays;
}
//这是脚本的开头。。。
函数getArrays(){
var ddlValArray=新数组();
var ddlTextArray=新数组();
var ddl=document.getElementById(“ddl”);

对于(i=0;i来说,如果您的HTML/JS结构正确,您就不会这样做

将脚本标记移动到正文的底部,刚好在
标记之前,您就不需要再等待DOMContentLoaded事件。它上面的html将在执行JS之前被解析

这可能会导致其他警告,但对于您的示例来说,它会起作用

<body>
Select Flavor:
<select id='ddlFlavors'>
    <option value="1">Vanilla</option>
    <option value="2">Chocolate</option>
    <option value="3">Strawberry</option>
    <option value="4">Neopolitan</option>
</select>
<br/><br/>
<a id="clickHandler" href="#">Show Flavors</a>
<script>
        function getArrays() {
            var ddlValArray = new Array();
            var ddlTextArray = new Array();
            var ddl = document.getElementById("ddlFlavors");
            for (i=0; i<ddl.options.length; i++) {
                ddlValArray[i] = ddl.options[i].value;
                ddlTextArray[i] = ddl.options[i].text;
                alert(ddlValArray[i] + ' ' + ddlTextArray[i]);  
            }
        }
        function showArrays() {
            var link = document.getElementById("clickHandler");
            link.addEventListener("click", getArrays, false);   
        }
        showArrays();
    </script>
</body>

选择口味:
香草
巧克力
草莓
新波利坦


函数getArrays(){ var ddlValArray=新数组(); var ddlTextArray=新数组(); var ddl=document.getElementById(“ddl”);
对于(i=0;i来说,如果您的HTML/JS结构正确,您就不会这样做

将脚本标记移动到正文的底部,刚好在
标记之前,您就不需要再等待DOMContentLoaded事件。它上面的html将在执行JS之前被解析

这可能会导致其他警告,但对于您的示例来说,它会起作用

<body>
Select Flavor:
<select id='ddlFlavors'>
    <option value="1">Vanilla</option>
    <option value="2">Chocolate</option>
    <option value="3">Strawberry</option>
    <option value="4">Neopolitan</option>
</select>
<br/><br/>
<a id="clickHandler" href="#">Show Flavors</a>
<script>
        function getArrays() {
            var ddlValArray = new Array();
            var ddlTextArray = new Array();
            var ddl = document.getElementById("ddlFlavors");
            for (i=0; i<ddl.options.length; i++) {
                ddlValArray[i] = ddl.options[i].value;
                ddlTextArray[i] = ddl.options[i].text;
                alert(ddlValArray[i] + ' ' + ddlTextArray[i]);  
            }
        }
        function showArrays() {
            var link = document.getElementById("clickHandler");
            link.addEventListener("click", getArrays, false);   
        }
        showArrays();
    </script>
</body>

选择口味:
香草
巧克力
草莓
新波利坦


函数getArrays(){ var ddlValArray=新数组(); var ddlTextArray=新数组(); var ddl=document.getElementById(“ddl”); for(i=0;i事件监听器对JS至关重要。每次用户与您的页面交互时,您都需要关注该事件并对其作出响应。
当然,在这个代码段中,您的函数假设DOM中有一个具有给定id的元素,ready、set和waiting。情况可能并非如此,这就是为什么您必须等到JS收到OK(DOMReady
事件)

这只是一个非常简单的例子,说明了为什么可能会使用
addEventListener
。但在我看来,当您开始使用Ajax调用向页面添加新内容时,事件监听器就有了自己的功能:
假设DOM已准备就绪,但稍后可能会请求或不请求某些元素(取决于用户输入)

$('#foo').on('click',functionRef);
这并不要求在运行此代码时foo元素可用,但只要将该元素添加到dom中,单击事件就会按您的意愿处理。
在非jQ中,您将使用
addEventListener
。由于事件模型(有关传播和冒泡的详细信息,请参阅quirksmode),监听器不需要直接连接到元素:

document.body.addEventListener('click',function(e)
{
    if ((e.target || e.srcElemet).id === 'foo')
    {
        //function that deals with clicks on foo element
    }
},false);//last param is for bubbling/propagating events
这样,您就可以异步绑定可能添加到dom中的元素的所有事件,而不必检查每个ajax调用的每个响应

让我们更进一步:委派。正如您所看到的,在上面的片段中,我们正在监听发生在身体内部某个地方的所有点击事件。这几乎没有什么区别:所有点击,所以您不必担心