2012-05-11 3 views
11

Chosenというドロップダウンウィジェットを使用しており、アンカーにhref javascript:void(0)が含まれています。ドロップダウンをクリックすると動作しますが、IE上では、アプリケーションが退出したいかどうかを確認するため、新しいonbeforeunloadイベントが発生します。もちろん、フォームデータを入力するときに、これらの質問をしたくないのは明らかです。アンカー "javascript:void(0)"により、window.onbeforeunloadがIE上で起動する

選択したライブラリを変更せずにこの問題を解決する方法はありますか?

残念ながら、この:

window.onbeforeunload = function (e) { 
    console.log(window.location); 
}; 

私はターゲットURLを確認するためにそれを使用することはできません、いずれかjavascript:void(0)を記録し、そうしません。

この現象はIE9で少なくとも発生します。これは私が心配していることです(古いIEではなく)。

答えて

13

私が見ることができる唯一の解決策は、リンクのイベントハンドラonclickfalseの戻り値を追加することです。リンクをクリックしてページを変更するつもりはないことをIEに伝えます。

<a href="javascript:void(0);" onclick="doSomething(); return false;">Link</a> 

同じで、このように書くことができます。

<script> 
    function doSomething() { 
     // do Something 
     return false; 
    } 
</script> 

<a href="javascript:void(0);" onclick="return doSomething();">Link</a> 
+0

、私はむしろ、サードパーティのライブラリを修正しないと思います。私が使用しているChosenドロップダウンにはこのリンクがあります。 – Tower

+0

Hm。このリンクには 'onclick'イベントがありますか?そうでない場合は、動的にバインドできます。 – VisioN

+0

私はちょうどそれをするつもりです...クリックイベントをバインドし、それをキャンセルします。 – Tower

2

私はアンカーに対してイベントをクリックして、発射からonBeforeUnloadを防止するためのイベントをキャンセルするために聞いてしまった:

$chosen.find('.chzn-single').click(function() { 
    return false; 
}); 
1

を持っていました同じ問題。ちょうどあなたの質問が見つかりました。私の解決策は、あなたがすべての選択ドロップダウンリストのアンカータグにonclickの属性を追加し、私の場合はwindow.onbeforeunload = nullを

を呼び出す必要がある、ある、私が選択したライブラリを設定した後

$(".chzn-single").attr("onclick", "window.onbeforeunload = null;"); 

を入れたのですうまく動作します

+0

これは、選択したリンク要素をクリックした後でwindow.onbeforeunloadが機能しないようにしませんか? –

0

このためにhrefを使用しないでください。

hrefをシミュレートするCSSクラスを使用することをお勧めします。このクラスの色とスタイルをウェブサイトに合わせて変更することは明らかですが、この目的のためには標準の青色の下線付きですリンク

<style> 
    .linkSimulate 
    { 
     cursor: pointer; 
     COLOR: blue; 
     text-decoration: underline; 
    } 
</style> 

はその後、私はこれはかなり古いであることを知っている...しかし、私は私の仕事のために最近、この遭遇してきたシンプルなアンカー

<a onclick = "do_save();" class ="linkSimulate">Link</a> 
2

を使用しています。残念ながら、私たちはまだIE9をサポートすることを余儀なくされています。このプロジェクトでは、ユーザがdata-ng-clickのアンカータグをクリックしたときに新しいコンテンツをページに動的に読み込むAngular.jsを使用しています。

あなたの例では、イベントを渡すだけで、機能内ではデフォルトのアクションが防止され、バブリングが停止します。私は、これはあまりにも遅くはないと私はそれが役立つことを願っていることを願ってい

// Inside the View 
<a href="javascript:void(0)" data-ng-click="addStuff($event)">Add Stuff</a> 

// Inside the controller 
function addStuff($event) { 
    $event.preventDefault(); 
    $event.stopPropagation(); 
    // Do Something 
}; 

:角度で

// Inside the HTML 
{...} 
<a href="javascript:void(0);" onclick="doSomething(evt);">Link</a> 
{...} 
<script> 
    function doSomething(evt) { 
     evt.preventDefault(); 
     evt.stopPropagation(); 
     // Do Something 
    }; 
</script> 
{...} 

私は、次のされたなかったすべて:これを行うには、あなたがしなければならないだろう、すべてはこれですその他。

0

この質問が古い場合でも、私は@Oiva Eskolaのコメントで問題を修正する、@Bartoszの答えをanhancedました:

は、この後の作業からwindow.onbeforeunloadを防ぐことはないでしょう選択したリンク要素をクリックしますか? - var thisOnClick;以下は

イベントを上書きするか、キャンセルしないように、適切にHTML onclickプロパティを作成するために私のソリューションです:はい

  var thisOnClick; 

      $.each($(' .container a '), function(){ 

       thisOnClick = $(this).attr('onclick'); 

       if (typeof thisOnClick == 'undefined') { 

        $(this).attr('onclick', 'window.onbeforeunload = null;'); 

       } else if (typeof thisOnClick == 'string' && thisOnClick.indexOf('window.onbeforeunload') == -1 ) { 

       $(this).attr('onclick', thisOnClick + 'window.onbeforeunload = null;'); 
      } 

     }); 
関連する問題