Remember The MilkでIMEをオフにするGreasemonkeyスクリプト

Remember The Milkでキーボード・ショートカットを使っていて、ひとつ困ることがあります。タスクを追加したときにはすぐに d で期日を入力したいのですが、タスクの入力時にIMEがオンになっている場合、わざわざIMEをオフにしないとキーボード・ショートカットが使えません。というわけで、タスクを追加した後にIMEをオフにするGreasemonkeyスクリプトを書いてみました。

ついでにページの読み込み時にもオフにしています。IMEをオフにするやり方はLDRの棒人間に怒られないようにするGreaemonkeyスクリプト(Windows限定) - AUSGANG SOFTを参考にさせていただきました。したがってこのGreasemonkeyWindows限定です。

追記 2006-01-15 21:30

タスクの追加だけではなく、全ての input[type="text"] において、フォーカスが外れたときとエンターキーが押されたときににIMEをオフにするようにしました。後から追加されるフォームもDOMNodeInsertedイベントで捕まえて設定しています。

追記 2006-02-11 19:30

Flashを使ってちゃんとしたものを書いてくれた人がいるので皆さんこちらを使いましょう。

コード

// ==UserScript==
// @name           Remember The Milk IME OFF
// @namespace      http://d.hatena.ne.jp/margin/
// @include        http://www.rememberthemilk.com/*
// ==/UserScript==

(function(){

  function turnOffIME(focusElement) {
    function c() {
      var s = document.createElement('span');
      s.innerHTML =
        '<input type="password" style="visibility:hidden;position:fixed">';
      return document.body.appendChild(s.firstChild);
    }

    var p = c();
    p.focus();
    document.body.removeChild(p);
    if (focusElement && focusElement.focus) {
      focusElement.focus();
    } else {
      var x = turnOffIME.x = turnOffIME.x || c();
      x.focus();
      x.blur();
    }
  }

  function turnOffIMEOnBlur(element) {
    element.addEventListener('blur', turnOffIME, false);
  }

  function turnOffIMEOnBlurInput(element) {
    var type = element.type.toLowerCase();
    if (type == '' || type == 'text') {
      element.addEventListener('blur', turnOffIME, false);
      element.addEventListener('keypress', function(e) {
        if (e.keyCode == 13)
          turnOffIME();
      }, false);
    }
  }

  window.addEventListener('load', function() {
    Array.forEach(document.getElementsByTagName('input'), turnOffIMEOnBlurInput);
    Array.forEach(document.getElementsByTagName('textarea'), turnOffIMEOnBlur);

    document.addEventListener('DOMNodeInserted', function(event) {
      target = event.target;
      if (target.nodeType == 1) {
        tagName = target.tagName.toLowerCase();
        if (tagName == 'input') {
          turnOffIMEOnBlurInput(target);
        } else if (tagName == 'textarea') {
          turnOffIMEOnBlur(target);
        } else {
          Array.forEach(target.getElementsByTagName('input'), turnOffIMEOnBlurInput);
          Array.forEach(target.getElementsByTagName('textarea'), turnOffIMEOnBlur);
        }
      }
    }, false);

    turnOffIME();
  }, false);

})();