14

ユーザーがブラウザー開発者コンソールまたは他のブラウザー開発者ツールにロードした自動化されたメソッド (javascript) ではなく、実際のユーザーによってボタンのクリックが実行されたかどうかを検出できる方法はありますか?

さまざまなスタックオーバーフローの投稿で提案されている次の方法を試しましたが、どれも機能していないようです。参照: click() がマウス クリックなのか、何らかのコードによってトリガーされたのかを検出する方法は?

スクリプト検出方法が試行され、失敗しました:

mybutton.click(function (e) {
    if (!e.which) {
        //Triggered by code NOT Actually clicked
        alert(' e.which - not a real button click')
    } else if ('isTrusted' in e && !e.isTrsuted) {
        //Triggered by code NOT Actually clicked
        alert(' e.isTrusted - not a real button click')
    } else if (e.originalEvent === undefined) {
        //Triggered by code NOT Actually clicked
        alert(' e.originalEvent - not a realbutton click')
    }
    //                  else if (!e.focus) {
    //                      //triggered  // does not detect e.focus on a real btn click
    //                      alert(' e.focus - not a realbutton click')
    //                  }
    else {
        // Button hopefully clicked by a real user and not a script
    }
})

次のスクリプトを実行して、Chrome ブラウザー コンソールからボタンのクリックをトリガーすると、上記の方法のいずれも、スクリプトによってトリガーされたものとしてトラップされません。

var button = document.getElementById("btnSubmit");
button.click();

================================================== ========================

多くの知識の共有を促進し、私たち技術者の時間を計り知れないほど節約してくれた素晴らしいサイトを提供してくれた Stackoverflow に感謝します。

私はまだ信頼できる方法を持っていないようです。3 つのブラウザー (FF、IE、Chrome) はすべて、ユーザーが Web ページで JavaScript を実行/挿入するための開発者/コンソール インターフェイスを提供します。各ブラウザ フレーバーは、一部のイベント プロパティ値を少し異なる方法でトラップしているようです。例: Chrome はスクリプト アクティブ化されたクリックと実際のユーザーの違いを e.screenX でトラップしますが、IE では、e.screenX はスクリプト クリック (合成) とユーザー ボタン クリックの両方で同じ値を持ちます。

次の検出方法は、まったく機能しなかったか、ブラウザーによって一貫性がありませんでした: e.which e.isTrsuted e.originalEvent (event.source != window) (e.distance != null)

マウスダウン イベントは実際のユーザーのボタン クリックによってのみトリガーされるように見えますが、ボタン クリック イベントに加えてマウスダウンをエミュレートするスクリプト メソッドがあると想定する必要があります。

$(me.container + ' .mybutton').mousedown(function (e) { 
    alert('mouseisdown real button click'); 
}

合成 (スクリプト) ボタンのクリックとユーザーによるボタンのクリックの違いを検出する、複数のブラウザーで機能する信頼性の高い方法を誰かが見つけ出すことができれば、スーパーヒーローの地位に値するでしょう。

4

5 に答える 5

14

マウスを介してボタンのクリックが発生すると、イベント e には通常、マウス ポインターの位置が記録されます。次のようなものを試してください:

   if(e.screenX && e.screenX != 0 && e.screenY && e.screenY != 0){
     alert("real button click");
   }
于 2013-02-10T03:56:23.210 に答える
6

いいえ、すべての場合に可能というわけではありません。

他の回答が述べたように、マウス座標 (clientX/Y および screenX/Y) を探すことができます。それらが存在しない場合は、おそらく人間が生成したアクションではないと推測できます。

ただし、ユーザーがボタンにタブで移動し、スペース バーを使用してクリックした場合、またはマウスを使用せずにクリックした場合、座標もゼロになり、このメソッドはスクリプト クリックであると誤って判断します。

また、スクリプトdispatchEventで の代わりに を使用するclickと、イベントに座標を指定できます。この場合、このメソッドはユーザーが生成したクリックとして誤って識別します。

// This will produce what appears to be a user-generated click.
function simulateClick(element) {
  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, true, window,
    0, 110, 111, 10, 11, false, false, false, false, 0, null);
  element.dispatchEvent(evt);
}

http://jsfiddle.net/bYq7m/

于 2013-02-10T04:38:49.600 に答える