8

次の問題があります。

触れることができないスクリプトによって内容が変更されている HTML テキストボックス ( <input type="text">) があります (これは私のページですが、外部コンポーネントを使用しています)。

そのテキストボックスの値が変更されるたびにスクリプトで通知を受けたいので、それに反応できるようにします。

私はこれを試しました:

txtStartDate.observe('change', function() { alert('change' +  txtStartDate.value) });

これは(予想どおり)機能しません。私自身がキーボードでテキストボックスの値を変更してからフォーカスを別の場所に移動した場合にのみ実行されますが、スクリプトが値を変更した場合は実行されません。

私が認識していない、聞くことができる別のイベントはありますか?



私は Prototype ライブラリを使用しています。関連する場合、テキスト ボックスの値を変更する外部コンポーネントは Basic Date Picker (www.basicdatepicker.com) です。

4

6 に答える 6

5

あなたが暗示したように、変更 (およびその他のイベント) は、ユーザーが何らかのアクションを実行したときにのみ発生します。何かを変更するスクリプトは、イベントを発生させません。唯一の解決策は、リスナーに接続できるコントロールへのフックを見つけることです。

これが私がそれを行う方法です:

basicDatePicker.selectDate = basicDatePicker.selectDate.wrap(function(orig,year,month,day,hide) {
  myListener(year,month,day);
  return orig(year,month,day,hide);
});

これは、Firebug をざっと見ただけに基づいています (私はこのコンポーネントに詳しくありません)。日付を選択する他の方法がある場合は、それらの方法もラップする必要があります。

于 2008-09-28T22:44:41.663 に答える
4

addEventListener(" DOMControlValueChanged " は、スクリプトによるものであっても、コントロールの値が変更されたときに発生します。

addEventListener(" input " は、DOMControlValueChanged.

残念ながら、DOMControlValueChanged は現在 Opera でのみサポートされており、webkit では入力イベントのサポートが壊れています。入力イベントには、Firefox と Opera にもさまざまなバグがあります。

このようなものは、おそらく HTML5 ですぐに片付けられるでしょう、fwiw.

アップデート:

2012 年 9 月 8 日の時点で、DOMControlValueChanged のサポートは Opera から削除され (HTML5 から削除されたため)、ブラウザーでの 'input' イベントのサポートが大幅に改善されました (バグの減少を含む)。

于 2008-09-29T00:43:21.957 に答える
2

IE には、この目的で使用できるonpropertychangeイベントがあります。

実際の Web ブラウザー (;)) にはDOMAttrModified ミューテーション イベントがありますが、Firefox での数分間の実験では、値がプログラムによって変更された場合 (または通常のキーボード入力によって)、入力の名前をプログラムで変更すると起動します。ますます好奇心旺盛…。

それが確実に機能しない場合は、常に入力の値を定期的にポーリングすることができます。

var value = someInput.value;

setInterval(function()
{
    if (someInput.value != value)
    {
        alert("Changed from " + value + " to " + someInput.value);
        value = someInput.value;
    }
}, 250);
于 2008-09-28T23:37:37.403 に答える
1

外部JavaScriptの記述方法によっては、スクリプト内の外部スクリプトの関連部分をいつでも書き直して、変更イベントがトリガーされるように外部定義を上書きすることができます。

私は以前、自分の制御が及ばないスクリプトを使ってそれをしなければなりませんでした。

外部関数を見つけて、同じ名前の新しい関数として全体をコピーし、スクリプトを書き直して、やりたいことを実行するだけです。

もちろん、クロージャを使用してスクリプトが正しく記述されている場合、スクリプトを簡単に変更することはできません...

于 2008-09-28T23:23:30.730 に答える
0

ノアが説明したように問題を回避する以外に、数百ミリ秒ごとに値をチェックするタイマーを作成することもできます。

于 2008-09-28T23:49:04.567 に答える
0

Dan がアドバイスした方法で、YUI のデータ化可能なページネーター コントロールを 1 回変更する必要がありました。それは力ずくですが、私の問題を解決するのに役立ちました。つまり、フィールドに書き込むメソッドを見つけ、そのコードをコピーして、変更イベントを発生させるステートメントを追加し、コードでその変更イベントを処理するだけです。元の関数をその新しいバージョンでオーバーライドするだけです。正常に動作している間、ポーリングは、はるかに多くのリソースを消費するソリューションのように思えます。

于 2008-09-29T00:22:20.993 に答える