JSFiddle - React, Tailwind, and code Playground

by sukobuto

HTML

<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
<h1>テキストボックスでの Enter キー入力にバインド</h1>
<form><!-- Enter によるフォーカス移動を使う場合は form タグで囲む-->
    
    <label>
        <div>普通に Enter で実行</div>
        <input type="text" data-bind="value: single_text, enterKey: search"/>
    </label>
    
    <label>
        <div>Enter で次のテキストボックスへ移動</div>
        <input type="text" data-bind="value: single_text, enterKey: { moveFocus: true }"/>
    </label>
    
    <label>
        <div>Enter で移動 / Shift + Enter で実行</div>
        <input type="text" data-bind="value: single_text, enterKey: { moveFocus: true, withShift: post }"/>
    </label>
    
    <label>
        <div>Ctrl + Enter で実行</div>
        <input type="text" data-bind="value: single_text, enterKey: { withCtrl: post }"/>
    </label>
    
    <label>
        <div>Ctrl + Shift + Enter で実行</div>
        <input type="text" data-bind="value: single_text, enterKey: { withCtrlShift: post }"/>
    </label>
</form>

CSS

label { display: block; }
label > div { display: inline-block; width: 280px; }

JavaScript

/**
     * Custom binding [ enterKey ] (Static)
     * Enterキー押下に対する振る舞いをバインドする
     * jQuery に依存
     *
     * binding-type: function/object
     * binding-object: {
	 * 	command:		[default:function] Enterキー押下で呼び出されるコールバック関数を指定する。
	 * 	event:			Enterキー押下イベントの種別('keydown', 'keyup', 'keypress')。
	 * 					デフォルトは 'keypress'。
	 * 	acceptInput:	true=テキストボックスに対して改行の入力を許可する。
	 * 					デフォルトは textarea なら true, それ以外なら false。
	 * 	moveFocus:		true=Enterキー押下によるフォーカス遷移を実現する。
	 * 	submitForm:		true=Enterキー押下によるフォームの送信を許可する。
	 * 					デフォルトは false。
	 * 	withShift:		Shift + Enter 押下で呼び出されるコールバック関数を指定する。
	 * 	withCtrl:		Ctrl + Enter 押下で呼び出されるコールバック関数を指定する。
	 * 	withCtrlShift:	Ctrl + Shift + Enter 押下で呼び出されるコールバック関数を指定する。
	 * 	bubbling:		false=バブリングを停止する
	 * }
     */
ko.bindingHandlers['enterKey'] = {
    init : function(element, valueAccessor, allBindingsAccessor) {
        var value = ko.unwrap(valueAccessor());
        var elm = $(element);
        var isTextarea = elm.is('textarea');
        var isTextbox = elm.is('input[type="text"]') || elm.is('input[type="password"]');
        var dummyCallback = function() {};
        var config = ko.utils.extend({
            event: 'keypress',
            acceptInput: elm.is('textarea') ? true : false,
            moveFocus: false,
            submitForm: false,
            command: dummyCallback,
            withShift: dummyCallback,
            withCtrl: dummyCallback,
            withCtrlShift: dummyCallback,
            bubbling: true
        }, (typeof value == "function" ? { command: value } : value));
        var text = allBindingsAccessor().value || false;
        if (text) text = ko.isObservable(text) ? text : false;
        $(element)[config.event](function(e) {
            if ((e.keyCode ? e.keyCode : e.which ? e.which : e.charCode) == 13) {
                if (config.bubbling === false) {
                    if (e.stopPropagation) e.stopPropagation();
                    else e.cancelBubble = true;
                }
          ...