IEの代替のcss 'pointer-events'プロパティ


155

ドロップダウンナビゲーションメニューがあり、クリックすると他のページに移動できないタイトルがあります(これらのタイトルをクリックするとドロップダウンメニューが開きます)一方で、他のナビゲーション(これらにはドロップダウンがなく、直接移動する必要があります)です。ただし、両方とも型がhref定義されています

これを解決するために、以前のタイプのタイトルに次のcssを追加しました

pointer-events: none;

正常に動作していますが、このプロパティはIEでサポートされていないため、いくつかの回避策を探しています。面倒なのは、HTMLとJavaScriptのコードを完全に変更するためのアクセス権と特権がないことです

何か案は?


2
HTMLとスクリプトにアクセスする方法はありますか?あなたに任務を与えた人に話しかけてみてください。
カイル

@カイルこれは特権の問題ではありません。html/ javascriptコードを変更することも技術的に困難です
anupam



3
これpointer-eventsは現在IE11 +にあることに注意してください
David Storey

回答:


88

Pointer-eventsはMozillaのハックであり、Webkitブラウザーで実装されている場合、IEブラウザーでさらに100万年もの間見られるとは期待できません。

しかし、私が見つけた解決策があります:

レイヤーを介したマウスイベントの転送

これは、JavaScriptのよく知られていない/理解されているプロパティを使用するプラグインを使用して、マウスイベントを取得し、それを別の要素に送信します。

ここには別のJavaScriptソリューションもあります

2013年10月の更新:どうやらv11でIEに登場する予定です。ソース。ティムありがとう。


4
ie9のドキュメントには、このプロパティをサポートしていると記載されています(ただし、まだie9を試したことはありません)。この問題に時間を費やすのではなく、html / jsコードを変更しようと思います。時間と助けに
感謝

11
W3Cでは、この問題はクリック乗っ取りのために議論されていました。経験則:W3Cが候補の推奨を公開するとすぐに、IEチームがそれを実装します。速攻のレッスンは常に無駄になります。その上、Mozilla はそれをすべて言った " 警告: 非SVG要素のCSSでのポインターイベントの使用は実験的です。この機能はCSS3 UIドラフト仕様の一部でしたが、多くの未解決の問題により、CSS4に延期されました。 "
バルカンレイヴン2012

8
caniuse.comによると、CSSポインターイベントがIE 11に登場します。caniuse.com/#feat
Tim

4
それが回答@eyurdakulに反対票を投じる理由ではありません
scumah

14
"you can't expect to see it in IE browsers for another million years."3年しかかからなかった...
ProblemsOfSumit 14

20

5行のコードで実装するのが非常に簡単な別のソリューションを次に示します。

  1. 一番上の要素(ポインタイベントをオフにする要素)の「mousedown」イベントをキャプチャします。
  2. 「マウスダウン」で一番上の要素を非表示にします。
  3. 「document.elementFromPoint()」を使用して、基になる要素を取得します。
  4. 一番上の要素を再表示します。
  5. 基になる要素の目的のイベントを実行します。

例:

//This is an IE fix because pointer-events does not work in IE
$(document).on('mousedown', '.TopElement', function (e) {

    $(this).hide();
    var BottomElement = document.elementFromPoint(e.clientX, e.clientY);
    $(this).show();
    $(BottomElement).mousedown(); //Manually fire the event for desired underlying element

    return false;

});

2
これでうまくいきました。私は、多くのポリフィルを追加する代わりに、jsコードに挿入できる小さな修正を好みます;)
dippas

これはクリエイティブなソリューションです。唯一の問題は、ポイントイベント機能するブラウザーに不要な処理が追加されることです。これを条件付きでIEブラウザーのみで実行するのは素晴らしいことです。
Trevor

私は同意します、それは当惑させる問題に迅速に実装可能ですが、実際には私の実装では、ブラウザーがIEである場合にのみ適用し、このチェック内に配置します:if(navigator.appName == 'Microsoft Internet Explorer' ){...ロジックがここに入る..}
MarzSocks

3
これはとてもうまくいきます!ie 11はおそらくポインターイベントのサポートを開始したため、この句の内側にラップします。if(navigator.userAgent.toLowerCase()。indexOf( 'msie')> 0)ありがとうございます。
2015


10

特にIEの場合disabled=disabled、アンカータグで機能することに言及する価値があります。

<a href="contact.html" onclick="unleashTheDragon();" disabled="disabled">Contact</a>

IEはこれをdisabled要素として扱い、クリックイベントをトリガーしません。ただし、disabledはアンカータグの有効な属性ではありません。したがって、これは他のブラウザでは機能しません。彼らのpointer-events:noneためにスタイリングで必要です。

UPDATE 1:だから私にはクロスブラウザのソリューションなどは、以下のルールフィールを追加する

UPDATE 2 IEを持つアンカータグのスタイルを形成しないので、さらに互換性のために:disabled='disabled'彼らはまだされますので、見てアクティブ。したがって、a:hover{}ルールとスタイルを設定することをお勧めします。

a[disabled="disabled"] {
        pointer-events: none; /* this is enough for non-IE browsers */
        color: darkgrey;      /* IE */
    }
        /* IE - disable hover effects */   
        a[disabled="disabled"]:hover {
            cursor:default;
            color: darkgrey;
            text-decoration:none;
        }

Chrome、IE11、IE8に取り組んでいます。
もちろん、上記のCSSでは、アンカータグがdisabled="disabled"


1
これは私にはうまくいきませんでした。IE9-10では、onclick関数は引き続き実行されます。
間違いなく


4

疑似要素を使用して、問題のある要素を非表示のブロックで覆います::beforeまたは:after

a:before {
//IE No click hack by covering the element.
  display:block;
  position:absolute;
  height:100%;
  width:100%;
  content:' ';
}

したがって、親要素のランドをクリックします。親がクリック可能な場合は問題ありませんが、それ以外の場合はうまく機能します。


1
無効化された属性で同様のアイデアを使用しました。IEでは、disabled属性を追加するとクリックイベントが防止されますが、子がある場合でもクリックがトリガーされます。クリックできないように子供をカバーすることは、これに対する素晴らしい解決策です。IEに実際の要素が存在するように登録するには、不透明度0の背景色を使用する必要がありました。
Blake Plumb、2015

4

私はこの問題の解決策を見つけるのにほぼ2日を費やし、ついにこれを見つけました。

これはjavascriptとjqueryを使用します。

(GitHub)pointer_events_polyfill

これは、ダウンロード/コピーされるJavaScriptプラグインを使用できます。そのサイトからコードをコピー/ダウンロードして、として保存してくださいpointer_events_polyfill.js。そのJavaScriptをサイトに含めます。

<script src="JS/pointer_events_polyfill.js></script>

このjqueryスクリプトをサイトに追加します

$(document).ready(function(){
    PointerEventsPolyfill.initialize({});
});

そして、jqueryプラグインを含めることを忘れないでください。

できます!透明な要素の下の要素をクリックできます。IE 10を使用しています。これがIE 9以下でも動作することを願っています。

編集:このソリューションを使用しても、透明な要素の下のテキストボックスをクリックすると機能しません。この問題を解決するために、ユーザーがテキストボックスをクリックするときにフォーカスを使用します。

JavaScript:

document.getElementById("theTextbox").focus();

jQuery:

$("#theTextbox").focus();

これにより、テキストボックスにテキストを入力できます。


1

この問題を解決する別の解決策を見つけました。ブラウザーウィンドウの幅が1'000pxより大きい場合、jQueryを使用してhref-attributeをjavascript:;( ''ではなく、ブラウザーがページを再読み込みします)に設定します。リンクにIDを追加する必要があります。これが私がやっていることです:

// get current browser width
var width = $(window).width();
if (width >= 1001) {

    // refer link to nothing
    $("a#linkID").attr('href', 'javascript:;'); 
}

多分それはあなたのために便利です。



0

また、<a>タグ内にURLを「追加しない」で追加することもできます。これは<a>、ドロップダウンを使用してタグ駆動のメニューに対しても行います。ドロップダウンがない場合はURLを追加しますが、<ul> <li>リストのあるドロップダウンがある場合は削除します。


0

私は同様の問題に直面しました:

  1. 私はディレクティブでこの問題に直面しました、それを修正して親要素としてaを追加し、そのためにpointer-events:noneを作成しました

  2. 上記の修正はselectタグでは機能しませんでした、そして私はcursor:textを追加しました(これは私が欲しかったものです)そしてそれは私のために機能しました

通常のカーソルが必要な場合は、cursor:defaultを追加できます


-1

最適なソリューション:

.disabled{filter: alpha(opacity=50);opacity: 0.5;z-index: 1;pointer-events: none;}

すべてのブラウザで完全に実行されます


3
IEバージョン<11を除き、ポインターイベントはサポートされていません。ポイントを逃したと思います。
刑務所マイク2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.