25

Sammy.jsとjQueryを使用した1ページのJSサイトである私のWebサイトで、マウスでリンクを中クリックすると、リンクが新しいタブで開きます。しかし、Macをコマンドクリックしても、そうではありません。これはFirefoxとChromeの両方で発生するため、何らかの形で仕様に準拠している必要があると思います。

これはMacbookAirで発生します(トラックパッド+コマンドボタン)。ただし、ほとんどのサイトは問題なく機能し、コマンドクリックは通常のミドルクリックと同じです。

自分で試してみてください:https ://circleci.com 。コマンドキーを押しながら「バージョン情報」、「ホーム」、「連絡先」の間をクリックすると、問題が発生するはずです。新しいタブでは開きません。

4

3 に答える 3

35

ここで推測しますが、後でMacから確認します。これはMacで動作することが確認されています。

Win ctrl+clickまたはMaccommand+ clickは、他の修飾キー(Alt + Click、Shift + Clickなど)を使用したクリックと同じように、「通常の」クリックリスナーによって取得されます。

MacでのCtrlキーを押しながらクリックするとOSレベルで右クリックとして解釈されるため、これは特に混乱を招きます。一方、コマンドクリックはミドルクリックとして解釈されるのではなく、ブラウザの設定です

変更されたクリックに特に依存するインサイト機能がないと仮定すると、クリックリスナーからそのようなイベントを除外し、代わりにそれらがブラウザによってネイティブに処理されるようにバブルアップできるようにすることが適切です。同様の状況での誰かの経験を考えると、クリックハンドラーに以下を追加できるはずです(Brilliandが指摘したようにライブラリレベルのデリゲートである可能性があります)。

if (e.metaKey || e.ctrlKey) return;

e現在のクリックイベントを参照してハンドラーの先頭に追加すると、次のことを回避できます。e.preventDefault();

アップデート:

それは実際に機能します!このかなりミニマルなフィドルでは、コマンドクリックまたはコントロールクリックのタイミングを認識できるため、コンテンツのajaxフェッチやを含むクリックハンドラーの残りの部分の実行を回避できますe.preventDefault();。これにより、コマンドクリックをMacで「意図したとおりに」処理できます。つまり、新しいタブでリンクを開くことができます。

この発見を念頭に置いて、これらの行は次のようになります。

if (e.isDefaultPrevented() || e.metaKey || e.ctrlKey) {
    return;
}
于 2012-05-30T01:40:22.563 に答える
6

ここにいくつかの興味深い洞察があります: https ://groups.google.com/forum/#!msg / mozilla.dev.usability / H1qLTur4EFc / gXH007CAPk8J

どうやらあなたが使用しているJSはpreventDefault()、ミドルクリックが影響を受けていない間にcmd+clickすることができます。JS/サイトフレームワークのドキュメントを参照してください。

于 2012-05-20T03:43:56.277 に答える
5

sammy.jsの関連コードは次のとおりです。

// bind to link clicks that have routes
$('a').live('click.history-' + this.app.eventNamespace(), function(e) {
    if (e.isDefaultPrevented()) {
        return;
    }
    var full_path = lp.fullPath(this);
    if (this.hostname == window.location.hostname && app.lookupRoute('get', full_path)) {
        e.preventDefault();
        proxy.setLocation(full_path);
        return false;
    }
});

概要:誰かがリンクをクリックした場合、標準のリンク動作をsammy.jsの動作でオーバーライドします。これは、現在のページを変更して、実際のページが読み込まれないターゲットページのコンテンツを表示することです。dakdadのリンクによると、コマンドクリック(ミドルクリックとは異なり)はクリックイベントによってキャッチされ、オーバーライドできます。

回避策として、sammy.jsのイベントハンドラーを(を使用して$('a').die('click.history-' + _sammy_event_namespace_);)削除し、コマンドクリックをチェックしてオーバーライドを回避する変更されたバージョンに置き換えることができます。

于 2012-05-25T09:38:59.300 に答える