15

ユーザーがクリップボードから貼り付けるときに、特定の文字を除外する必要があります。(実際にはクリップボードにあるものを変更したくありません。)これはすでにIEで動作しています。ため息...

tl;dr: capability.policy user.jsのアイテムはprefs.jsになりますが、有効になりません。

参考までに、合理的にすべてのユーザーにuser.jsをインストールさせることができます。しかし、私たちの誰もマシンへの管理者アクセス権を持っていないので、構成に関して私ができることはほぼこれだけです。

助けてくれてありがとう!

ノート:

  1. この質問の目的のために、私はクリップボードへのアクセスを「回避」したくありません-たとえば、貼り付けが発生 した
    にDOM要素の値を操作したくありません
  2. フレームワーク/ライブラリ(jQuery、Dojo、Prototype、YUI など) を必要とするソリューションは必要ありません。

たどった手順

  1. URL about:support => Profile Directory =>に移動して、プロファイルフォルダの場所を特定しました。Open Containing Folder

  2. 次の行で user.jsを作成して、Firefox でクリップボードを有効にしようとしました。
    user_pref("just.mike", "user.js が機能するかどうかをテストします。");
    user_pref("capability.policy.policynames", "allowclipboard");
    user_pref("capability.policy.allowclipboard.sites", "https://my-site.com");
    user_pref("capability.policy.allowclipboard.Clipboard.cutcopy", "allAccess");
    user_pref("capability.policy.allowclipboard.Clipboard.paste", "allAccess");
    
    注: https://my-site.com は実際のサイトではありません。

  3. 結局のところ、 about:configを使用してもcapability.policy項目は表示されません- Bugzilla Bug 284673 - about:config hides "capability.policy" Preferences が原因です。ただし、これらのuser.jsアイテムは「機能」し、ファイルは正しいフォルダーにあると 思います。
    • about:configjust.mikeエントリ が表示されました
    • prefs.jsにはすべての新しい行が含まれていましたが、順序が異なります-- アルファベット順:
      user_pref("capability.policy.allowclipboard.Clipboard.cutcopy", "allAccess");
      user_pref("capability.policy.allowclipboard.Clipboard.paste", "allAccess");
      user_pref("capability.policy.allowclipboard.sites", "https://my-site.com");
      user_pref("capability.policy.policynames", "allowclipboard");
      ...
      user_pref("just.mike", "user.js が機能するかどうかをテストします。");
      
    Zallowclipboard(参考までに、アルファベット順で行が最初になるようにどこでも 試しpolicynamesましたが、それもうまくいきませんでした。)

  4. 次のイベントの 後に Firefox でクリップボード読み込もうとしました:onpaste
    var clipboard = Components.classes["@mozilla.org/widget/clipboard;1"].getService(Components.interfaces.nsIClipboard);
    もし (!クリップボード) {
        throw new Error('内部エラー -- クリップボード オブジェクトを作成できませんでした');
    }
    
    var transferable = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
    if (!transferable) {
        throw new Error('内部エラー -- 転送可能なオブジェクトを作成できませんでした');
    }
    
    transferable.addDataFlavor("テキスト/ユニコード");
    clipboard.getData(転送可能、clipboard.kGlobalClipboard);
    
    var clipboard_data = new Object();
    var clipboard_length = new Object();
    
    transferable.getTransferData("テキスト/ユニコード", clipboard_data, clipboard_length);
    
    var clipboard_text = '';
    if (!!clipboard_data) {
        var clipboard_nsISupportsString = clipboard_data.value.QueryInterface(Components.interfaces.nsISupportsString);
        clipboard_text = clipboard_nsISupportsString.data.substring(0, clipboard_length.value / 2);
    }
    
    return(clipboard_text);
    

  5. コードは最初の行で失敗し、Firebug コンソールに次のエラーが返されます。
    <https://my-site.com> がプロパティ XPCComponents.classes を取得するためのアクセス許可が拒否されました
    
    注: 実際には実際の URL で実行していますが、エラー メッセージに表示されます。ここでは、ダミーの名前に変更しただけです。

  6. の代わりに最初の行で が使用されている他の例もいくつか見ましたが、最初の行でも同じエラー テキストが生成されます。 createInstancegetService
    var clipboard = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(Components.interfaces.nsIClipboard);
    // ...
    


環境 (これは私の制御外です)

  • コンピューターへの管理者アクセスなし
  • Windows ビスタ
  • モジラ Firefox 10

参考文献

4

3 に答える 3

1

要するに、やりたいことをやりたいようにやることはできないと思います。Mozilla (および最新のブラウザーのほとんど) は、セキュリティ上の理由からクリップボードへのアクセスを制限しています。IE でこの制限を簡単に回避できたように見えても、安心できる考えではありません。

そうは言っても、プラグインには Web ページとは異なる制限があり、プラグインを作成する (またはフラッシュを活用する) ことで、この制限を回避できる場合があります。ただし、プラグインを使用しても、誰かが Web フォーム (またはその他のもの) に何かを貼り付けることをブロックする唯一の方法は、先制的にクリップボードをスクラブすることだと思います。

特定の文字列がテキスト ボックスに入力されないようにするだけの場合は、テキスト ボックス自体のイベントを監視することをお勧めします。

しかし、私が正しく読んでいれば、ユーザーにフォームに何かを入力する (そして入力するだけ) ことを強制したいように思えますが、これを行う簡単な方法は考えられません。いくつかの重要なオプション:

  1. テキストボックスを に設定readonlyし、仮想キーボードをポップアップして、ユーザーがマウスを使用してボックスに「入力」するように強制します。(HTML と JavaScript からキーボードを自分で作成するか、どこかで適切な解決策を見つける必要があります。)
  2. oninputイベントを監視します。テキストボックスが、人が入力することが合理的に期待できるものよりも速く変更された場合は、変更を拒否します。

どちらもきれいではありませんが、オープン Web テクノロジを使用してソリューションを作成する場合は、構築しているシステムの制限とその利点を受け入れる必要があります。

于 2012-05-31T16:59:24.713 に答える
0

汚いがクロスブラウザの方法は、現在の入力の値を以前の onchange イベントの値と比較することです。

長さが増加したり、値が大きく異なる場合 (縮小されているだけでなく、新しい文字がたくさんある場合) -- クリップボードから何かが貼り付けられている可能性があります。このようなもの:

$('input, textarea').change(function(){
  var prev = $(this).data('prev-val'), 
      current = $(this).val();
  if (is_big_changes(prev,current)) {
    $(this).val(my_filter_func(current));
  }
  if (!prev) {
     $(this).data('prev-val', current);
  } 
})

(これは概念実証にすぎないため、多くのコーディングを避けるために jQuery を使用しました)

どこで is_big_changes と my_filter_func -- 実装する必要がある関数。

警告このアプローチでは多くの邪悪なバグが潜在的に発生する可能性があります。私の取引は提案することです。

于 2012-05-18T17:10:22.210 に答える
0

代わりに必要なのは、クリップボードの貼り付けを検出することだと言えますか? そこに何があったかを知ると、何が変わったかがわかります。

では、単純に onchange をフックしてみませんか? コンテンツの最初と最後から同じ文字はすべて貼り付けられません。これを単純なキーストロークと区別したい場合は、キーダウン/キープレスも聞くと、どの変更が「他の場所」から来るかがわかります。

于 2012-06-09T11:55:40.430 に答える