2016-11-04 62 views
1

我已将几个功能合并为一个功能。 当另一个选择块被选中时,旧功能被隐藏了两个选择块。组合的情侣切换功能合并成一个,切换功能不再起作用

它看起来是这样的:

function toggle1(){ 
    if (getValue(elems.sel1) !== 0) { // <-- This function is getting the values of the selectfields 
     toggleVisibility(elems.sel2, true); // <-- This function is defining wether to hide or to show this selectfield 
     toggleVisibility(elems.sel3, true); 
    } else { 
     toggleVisibility(elems.sel2, false); 
     toggleVisibility(elems.sel3, false); 
    } 
} 

函数调用是这样的:

elems.sel1.addEventListener("change", toggle1); 

我改变了功能到这一点:

function toggle(element, select1, select2) { 
    if (getValue(element) !== 0) { 
     toggleVisibility(select1, true); 
     toggleVisibility(select2, true); 
    } else { 
     toggleVisibility(select1, false); 
     toggleVisibility(select2, false); 
    } 
} 

调用此函数现在看起来如:

elems.sel1.addEventListener("change", toggle(elems.sel1, elems.sel2, elems.sel3)); 

看起来很不错,所有..给我没有错误或如此以来..但是,切换不切换!也许有人能告诉我我在这里做错了什么?

如果需要的话:你可以在JS FIDDLE

+0

在toggle()函数中添加'debugger'(就像那样,在刚刚打开函数后的新行中),并检查'element,select1,select2'的值s是。在打开chrome控制台时,当该函数执行时,您的应用程序将在该点停止,并且您应该能够检查这些变量。 – JorgeObregon

+0

'elems.1'是什么语法? – nem035

+0

elems是一个对象,它存储代码中使用的所有DOM对象 –

回答

0

原因toggle1正在寻找完整的代码是因为你把它当作一个函数引用到addEventListener

// toggle1 is passed as a reference to a function 
// notice no() after it 
elems.sel1.addEventListener("change", toggle1) 

原因toggle不工作是因为你第一次调用,然后传递任何返回(这是undefined)为addEventListener

// toggle is called first (notice() after toggle) 
// then its result is passed as the handler 
elems.sel1.addEventListener("change", toggle(elems.sel1, elems.sel2, elems.sel3)); 

这被称为第一toggle(elems.sel1, elems.sel2, elems.sel3),然后侦听器为无论是从那里返回传递:

elems.sel1.addEventListener("change", undefined); 

你可以做的是让toggle返回的处理函数和侦听器将火:

function toggle(element, select1, select2) { 
    return function() { // <--- return a function 
    if (getValue(element) !== 0) { 
     toggleVisibility(select1, true); 
     toggleVisibility(select2, true); 
    } else { 
     toggleVisibility(select1, false); 
     toggleVisibility(select2, false); 
    } 
    } 
} 
+0

这有什么重要的功能,我应该返回这个函数吗? –

+0

*“它是否与我返回的函数有关”* - 这取决于您的情况,无论您返回的任何函数都将作为addEventListener的处理程序部分传递,因此addEventListener将在发生change事件时调用它并重写'this'作为发生'change'的元素,并将'event'对象作为第一个参数传递。如果你需要其中的任何一个,那么这可能很重要,但对你的情况来说,这似乎并不重要。 – nem035

+0

*“...并且该函数应该做些什么”*当然,它应该,它是您的事件处理程序。函数'toggle'只是你返回的函数的一个包装函数,它是传递给'addEventListener'的实际处理函数,将在'change'上调用。 – nem035