2012-06-20 12 views
18

私はこの奇妙な問題を解明しようとしています。根本的な原因は、ライブクリックとトリガーの差がです。.click()です。.click()と実際にボタンをクリックする違いはありますか?

問題の詳細はわかりませんが、基本的には入力ボタンをクリックするとうまくいきます(onclickイベントがあります)。しかし、.click()を別の場所から呼び出すと(物理的にボタンをクリックする代わりに)正しく動作しません。

私の質問は、本当にボタンの実際のクリックを複製する方法はありますか?


EDIT

問題:私はインラインPDFを読み込み、新しいウィンドウ(aspxページ)を開くんです。 実際にリンクをクリックすると、ウィンドウが開き、PDFが読み込まれます。 .click()を使用すると、ウィンドウが開き、PDFファイルをダウンロードするように求められます。プロンプトについてはAdobe Readerの設定、ブラウザの設定、レジストリの設定を行ってきました。これらは大きな画像の要因となることは理解していますが、今はマウスクリックと.click ()はまったく違うことをしています。

+6

「_私は問題の詳細を知ることはできません」...しかし、ここではこれが何をしているのですか? '.click()'がクリックを引き起こすので、他の何かのような音は働いていません。 – Mathletics

+2

ボタンがクリックされたときにボタンがフォームを送信している可能性があります(これは 'click'で動作するかどうか覚えていません)か、' mouseup'や 'mousedown'イベントを' click'の代わりに処理するかもしれません。 – Ryan

+1

@Shannon:私の答えがあなたにとって有益だった場合は、それを正解として受け入れてください。この質問に解決済みとマークすることができます。それでも問題が解決しない場合は、私は援助したいと思います。ありがとう! –

答えて

10

は、私は本当にマウスクリックを模倣するために、この機能を使用します。問題を回避する方法について説明しており、以下読む前に

function clickLink(link) { 
    var cancelled = false; 

    if (document.createEvent) { 
     var event = document.createEvent("MouseEvents"); 
     event.initMouseEvent("click", true, true, window, 
      0, 0, 0, 0, 0, 
      false, false, false, false, 
      0, null); 
     cancelled = !link.dispatchEvent(event); 
    } 
    else if (link.fireEvent) { 
     cancelled = !link.fireEvent("onclick"); 
    } 
} 
15

を、あなたがそもそもの問題を抱えている理由は、私はより完全に答えてみましょう:

最近のブラウザは、あなたがそうで/Ctrlキー/Altキー Shiftキーなどを開催するかどうか、あなたがクリックしたマウスボタンのようなものに基づいて、リンクのためのさまざまなアクションを取ります。たとえば、Chromeでは、左クリックする代わりにリンクをクリックすると、ブラウザは自動的に新しいタブでウィンドウを開きます。

.click()を使用すると、jQueryはあなたがクリックした「方法」について仮定しなければなりません。そして、あなたの場合は正しい動作ではありません。問題を解決するには、ブラウザに「正しい」設定をMouseEvents設定の形式で指定する必要があります。それを修正する方法の短い議論への今

、:あなたはパラメータなしでjQueryの.click()イベントを使用している場合は

、これは問題の要素の「クリックを偽造」は、実際にはありません。その代わり、http://api.jquery.com/click/でjQueryのドキュメントによると:

.click()は、引数なしで呼び出され

...、それは.triggerのショートカットです(「クリック」)

これは、あなたが発火するときことを意味$('#div1').click() - 'click'イベントの実際のjQueryハンドラがない場合、デフォルトの処理が行われます。だから、これらの2つの場合を考えてみます。

ケース1:それのハンドラがないため、この最初のシナリオでは

<a id='myLink' href='/some/link/'>Click me!</a> 
<script type='text/javascript'> 
    $('#myLink').click(); 
</script> 

を、.click()呼び出しは、何もしません。イベントはトリガーされますが、それを捕まえて応答するものはありません。aタグのデフォルトの処理が使用され、ユーザーは/some/link/になります。また、マウスボタンやその他のパラメーターを指定していないため、デフォルトです。

ケース2:このシナリオでは

<a id='myLink' href='/some/link/'>Click me!</a> 
<script type='text/javascript'> 
    $('#myLink').bind('click', function (ev) { 
     ev.preventDefault(); 
     ev.stopPropagation(); 

     alert('you clicked me!'); 
    }).click(); 
</script> 

clickハンドラが作成されたため、ユーザーがリンクをクリックしたときに、 - ev.preventDefault()ev.stopPropagation()呼び出しはoccuringから取り扱いデフォルト、およびアラートを停止します解雇される。

しかし、この時点でMouseEventsを表すevオブジェクトがあり、必要に応じて設定を変更することができます。たとえば、次の操作を行うことができます:

ev.altKey = true; // Held Alt 
ev.button = 1; // Middle Mouse Button 

これらの設定は、イベントを処理するデフォルトの方法を変更します。

オルタナティブ、非jQueryのソリューション

また、本当に次のコードを適応させることにより、ボタンクリックをシミュレートすることができます。あなたがアンカー/スパンをマウスクリックしたことを信じるように

この意志実際に偽のブラウザを - :

function fakeClick(event, anchorObj) { 
    if (anchorObj.click) { 
    anchorObj.click() 
    } else if(document.createEvent) { 
    if(event.target !== anchorObj) { 
     var evt = document.createEvent("MouseEvents"); 
     evt.initMouseEvent("click", true, true, window, 
      0, 0, 0, 0, 0, false, false, false, false, 0, null); 
     var allowDefault = anchorObj.dispatchEvent(evt); 
     // you can check allowDefault for false to see if 
     // any handler called evt.preventDefault(). 
     // Firefox will *not* redirect to anchorObj.href 
     // for you. However every other browser will. 
    } 
    } 
} 

(および選択した答えを見てHow can I simulate a click to an anchor tag?より完全な実施のために、でオリジナルのポストを参照してください)/etcの設定を変更することができます。ただし、ブラウザのデフォルトのハンドラーと同じ方法で、イベントを最初から構築することで、いくつかの設定を上書きすることができます。しかし、私はこのアプローチを提案していません。クロスブラウザー・アプリケーションを壊す可能性が非常に高く、すべてのパラメーターがマップされていることを理解する必要があります。

0
$('img').click(function(event){ 
    console.log(event.hasOwnProperty('originalEvent')); // output : true 

    }); 
    $('img').trigger("click",function(event){ 
    console.log(event.hasOwnProperty('originalEvent')); // output : false 

}); 
+0

あなたのコードが何をどのように修正するか説明するために、説明を追加してください。 – Darshana

+0

@Dvir Azulayコードは、マウスクリックを完全に模倣しています。私は、クリックがマウスクリックかトリガーかをチェックする例を示しました。 –