2017-03-29 7 views
1

ボタンで同じonClickを使用することはできますか?トグル機能を発動する1つのボタン?ボタン - > toggleOn()を押して、もう一度押す - > toggleOff()、再度押す - > toggleOn()

私はボタン<button>Toggle</button>を持っていて、基本的にそれをトグルするには、toggleOn()またはtoggleOff()のいずれかを実行する必要があります。

onClickプロパティでこれを行うにはどうすればよいですか?

+0

それは 'toggle'を実行しなければならないとトグルがオンまたはオフであれば' toggle'が決める必要があります... HTMLElement.datasetは現在の状態を保存するのに役立ちます –

答えて

1

ボタンが「オン」または「オフ」のどちらかの状態を維持する必要があります。

function toggler(fn1, fn2) { 
    var toggled = true; 
    return function() { 
    toggled = !toggled; 
    return (toggled ? fn1 : fn2).apply(this, arguments); 
    } 
} 

function logToConsole (e) { 
    console.log(this, e); 
} 

function logToAlert (e) { 
    alert(e); 
} 

var toggledLog = toggler(logToConsole, logToAlert); 

は今の引数でtoggledLogを実行している:ここで

+0

これはコンテキストハンドラにとって重要なコンテキストと引数を適切に処理しません –

1

const setText = (text) =>() => { 
 
    document.getElementById('toggled').innerHTML = text; 
 
}; 
 

 
const toggleOff = setText('off'); 
 
const toggleOn = setText('on'); 
 

 
const makeClickhandler =() => { 
 
     let buttonState = false; 
 
     return() => { 
 
      buttonState ? toggleOff() : toggleOn(); 
 
      buttonState = !buttonState; 
 
     } 
 
    }; 
 
    
 
document.getElementById('yourbuttonid').addEventListener('click', makeClickhandler());
<button id='yourbuttonid'>Toggle</button> 
 
<span id='toggled'>off</span>
がシンプルである高階関数「トグラー」:私は buttonState変数の上にクロージャを作成することによってこれを行うだろうコンテキストが適切に機能します。 onClickハンドラで使用できます。

0

私はそれを達成するためのさまざまな方法を想像することができます。

var button = document.getElementById('toggle'); 
 
var state = document.getElementById('current-state'); 
 

 
button.addEventListener("click", toggleState); 
 

 
function toggleState() { 
 
    if (button.dataset.state == "on") { 
 
    button.dataset.state = "off"; 
 
    state.innerHTML = "I'm off"; 
 
    } else { 
 
    button.dataset.state = "on"; 
 
    state.innerHTML = "I'm on"; 
 
    } 
 
}
<button id="toggle" data-state="off">Toggle me!</button> 
 

 
<div id="current-state">I'm off</div>

0

アレックスヤングに似ていますが、もう少しコンパクトなアプローチ:

私の心に来て最初は次のようなものになるだろう

function toggleOn() { 
 
    console.log('on'); 
 
} 
 

 
function toggleOff() { 
 
    console.log('off'); 
 
} 
 

 
var button = document.getElementById('button'); 
 

 
button.addEventListener('click', function clickToggle() { 
 
    clickToggle.state = !clickToggle.state; 
 
    clickToggle.state ? toggleOn() : toggleOff(); 
 
});
<button id="button">Toggle</button>

これは、この方法で名前付き関数にプロパティをアタッチできるという事実を利用しています。私はこれについての正確な用語が何であるか分かりません。


ジョーFrambachの有効な懸念に対処するには、コメントで対処、あなたはそれを変更することができます:

button.addEventListener('click', function clickToggle() { 
    clickToggle.state = !clickToggle.state; 
    return (clickToggle.state ? toggleOn : toggleOff).apply(this, arguments); 
}); 
+0

これはコンテキストハンドラにとって重要なコンテキストと引数を適切に処理しません –

+0

@JoeFrambach私はあなたがそれによって何を意味するか分かりません。あなたは何を意味するのか説明できますか? –

+1

'

関連する問題