2016-03-31 9 views
-1

デフォルトのイベントを防止するonMousedownイベントハンドラとonMouseupイベントハンドラがドキュメント上にあります。javacriptのドキュメントでデフォルトアクションが防止されている場合、単一の要素でデフォルトイベントを使用します。

これで、デフォルトのアクションを使用する単一のフォーム要素(選択フィールド)があります。私は何とかjavascriptから呼び出すことはできますか?

のような何か:

<select ... onClick="this.browserDefaultAction"> 

もちろんの「BrowserDefaultAction」dosn't存在する - 私は私が探しているかを説明するためにそれを作りました。

EDIT

が多少明確にする -

I日数(colums)と時間(5分単位で行を)を表すテーブルを有します。ユーザーがマウスをテーブルの上に移動すると、各セルにはそのセルが表す時間が表示されます。

マウスの左ボタンを押すと、時間は「設定」(セルは青色)になります。マウスの右ボタンを押すと、時間は「設定なし」(セルは緑色になります)。これは "移動中"に起こらなければならない。 e。すべてのセルを別々にクリックする必要はありません。イベントスクリプトで直接マウスボタンの状態を読み込むよう

はうまく動作しませんでした、私は、カスタム変数にマウス・ボタンを保存するためのコードのこの部分を追加しました:

var Maustaste = 0; 
    function Tastendruck (Ereignis) { 

     if (!Ereignis) 
     Ereignis = window.event; 
     if (Ereignis.buttons) 
     { 
      if (Ereignis.buttons == 2) {Maustaste=2} 
      if (Ereignis.buttons == 1) {Maustaste=1} 
     } 
    } 

    function Tastenlos() { 
     Maustaste = 0; 

    } 
     document.onmousedown = Tastendruck; 
     document.onmouseup = Tastenlos; 

それは今のところうまくいったとえデフォルトの動作を妨げなくても。

しかし、ボタンを押したままマウスを動かすと、と表示され、と表示されます。これは機能には影響しませんでしたが、ユーザにとっては醜く邪魔になりました。そこで、関数の最後にEreignis.preventDefaultを追加しました。

これまでのところ、良いですが、同じページにこの選択フィールドが残っています。 onmouseup/downイベントハンドラをドキュメントに貼り付けようとしましたが、テーブル内のテーブルを持つdivコンテナに貼り付けようとしましたが、うまく動作しませんでした。

I誰もがここでは、ページまたは完全なコードを見たいadress.

EDIT:私はイベントをトリガどの要素アプローチ

テストを使用して、(prevemtDefauktを使用

)または 適切でない

... 
    if (!Ereignis) 
     Ereignis = window.event; 
     if (Ereignis.target.tagName != "SELECT") 
     { 
      if (Ereignis.buttons) 

それは今woksです。

+0

おそらく機能を再度追加するのではなく、オリジナルのグローバル 'preventDefault'からその単一の要素を除外する方が簡単だろう。 – DBS

+1

イベントをトリガーした要素をテストし、 'prevemtDefaukt()'を使うか、適切でないかをテストすることができます。しかし、あなたが実際に言うことができるだけのデフォルトのアクションの防止に対応するJavaScriptを見ずに。便利なヘルプが必要な場合は、「MCVE」([mcve])コードを表示してください。あるいは、フォーム要素の場合、 'change'イベントに代わって応答することができます。 –

+0

まず、あなたのthougtsのおかげで。 実際には、すでに400行以上のスクリプトがあり、問題を理解するために必要な部分だけを抽出すること自体に問題があります。私が試してみます。 –

答えて

0

イベントは、ソースから上向き(バブリング)および下向き(キャプチャ)に伝播します。ドキュメントはかなり高いレベルのオブジェクトなので、mousedownmouseupのイベントは実際にはDOMのさらに下の要素によってトリガされる可能性が最も高いです。このため、ブラウザがデフォルトアクションを実行できるようにした後、イベントの伝播を停止することができます。

window.addEventListener("DOMContentLoaded", function(){ 
 

 
    document.addEventListener("mousedown", function(evt){ 
 
     // This won't run when you mousedown on the list, but will when you mousedown on the document 
 
     alert("Something in the document or the document itself was moused down on."); 
 
    }); 
 
    
 
    // **************************************************************************************************** 
 
    
 
    var list = document.getElementById("lst"); 
 
    
 
    list.addEventListener("mousedown", function(evt){ 
 
      alert("My default behavior for mousedown works!"); 
 
     
 
      // Don't let the mousedown propagate to the document 
 
      evt.stopPropagation(); 
 
    }); 
 
    
 
    
 
    
 
    
 
});
<select id="lst"> 
 
    <option>Choice 1</option> 
 
    <option>Choice 2</option> 
 
    <option>Choice 3</option> 
 
    <option>Choice 4</option> 
 
</select> 
 

 

 
<select id="lst2"> 
 
    <option>Choice 1</option> 
 
    <option>Choice 2</option> 
 
    <option>Choice 3</option> 
 
    <option>Choice 4</option> 
 
</select>

+0

これは私にとっては良いアプローチであり、おそらくこのルートに沿って最適な解決策があると思われます。 しかし、私は "Run code snippet"ボタンを押したときのテストバージョンでさえも、それは現在の形ではうまくいきません。 テストページでselect要素をクリックすると、デフォルト動作が動作することが通知されますが、実際にはそうします。 e。プルダウンメニューは開きません。 –

+0

@BigBeneコードスニペットはChromeで正常に機能し、標準に準拠したクライアントで動作するため、どのブラウザを使用していますか。 –

+0

@BigBene私はこのコードはうまく動作していると思います。しかし、私は、あなたが「デフォルトの行動」が意味することを誤解していると思います。まず、私のコード(あなたのものに基づいています)は、 'クリック 'ではなく、' mousedown'に基づいています。次に、デフォルトの動作がクライアント間で常に標準化されているとは限りません。私のコードでアラートを受け取ったという事実は、イベントが発生していることを示しています。イベントハンドラの唯一の事柄はイベントの伝播を止めることだけなので、イベントが傍受されるデフォルトの動作起こっている。 –

関連する問題