質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

14937閲覧

IEで別タブ・別ウインドウで開くことを禁止

yutarou2000

総合スコア15

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/05/19 08:50

webでとあるページを作っています。
最終的な目標は、「リンクをクリックするとき、別タブ・別ウィンドウで開かせず、そのタブ内でのみ遷移させたい」ということです。

このようなソースを書きました。

function alt() {
window.alert("右クリック禁止");
}

document.onclick = function( e ){
var event = e || window.event;
var tagName = '';
try{
tagName = (event.target || event.srcElement).tagName.toLowerCase();
}
catch(e){}
if( (event.shiftKey || event.ctrlKey) && tagName == 'a' ){
window.alert("別ウィンドウ禁止");
event.keyCode = 0;
event.returnValue = false;
event.cancelBubble = true;
return false;
}
}

function mouseListener(evt){
var bt=(document.all)?(event.button==1?0:(event.button==4)?1:event.button):evt.button;

if(bt==1){ window.alert("中ボタン禁止");return false; }

}
document.onmousedown=mouseListener;



<body onContextmenu="alt();return false;">



このソースでFirefox、Chrome、Opera、Safariでは思い通りの挙動になったのですが、IE11では思い通りになりません。
むしろ今回はIEで使ってもらう予定なので、ほかのブラウザでは動かなくてもいいからIEでだけ開かないようになってほしいというところです。

さて、具体的にIEだとどうなるかですが、
function alt()・・・これはOK。

document.onclick = function( e ){
・・・「ShiftKey」のときはアラートが出て、きちんと止まるのですが、「ctrlKey」のときがウィンドウが開いてしまいます。

こちらに関しては、

function checkCTRLKey() {
var tagName = '';
try{
tagName = (event.target || event.srcElement).tagName.toLowerCase();
}
catch(e){}
if ((event.ctrlKey) && tagName == 'a' ) alert("別ウィンドウ禁止");return false;
}
window.document.onkeydown = checkCTRLKey;

と言うのを別に作ると、なぜかきちんと止まります(「shiftKey」にも影響を及ぼしません)。

function mouseListener(evt){
・・・これだけが本当にどうにもなりません。

「document.onmousedown=mouseListener」となっていますので、押した瞬間はアラートが出てウィンドウも当然開かないのですが、離した瞬間ウィンドウが開いてしまいます(当然と言えば当然ですが)。

document.onmousedown=mouseListener;
document.onmouseup=mouseListener;
と二つ並べるのも試しましたが、アラートが二つ出るだけでやはりウィンドウが開いてしまいます。
(ちなみに中クリックでリンクをクリックし、アラート小窓が出たときにその小窓の上でマウスを離すと別ウィンドウでは開かないようです)

こんな感じなのですが、どうにかなりますでしょうか。
かいつまんで言うと「IEで、中ボタンでリンクをクリックしても別タブ・別ウインドウで開かないようにしたい」と言うところです。

どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

以下のようにしてみるのはどうでしょうか。

html

1<!DOCTYPE html> 2<html lang="ja"> 3 <body> 4 <a href="javascript:void(0)" data-href="https://teratail.com">別タブ禁止</a> 5 <a href="https://teratail.com">別タブ許可</a> 6 <script type="text/javascript"> 7 8 // data-hrefを持つa要素は左クリック・中クリック問わずページ遷移させる 9 [].forEach.call(document.querySelectorAll("a[data-href]"), function(elem) { 10 elem.onclick = function (e) { 11 location.href = elem.getAttribute("data-href"); 12 }; 13 }); 14 </script> 15 </body> 16</html> 17

この例ではhrefに有効なリンクを書かず、代わりにdata-hrefにリンクを書きます。
data-href属性を持つa要素についてonclickイベントのリスナーを登録し、
data-href先に遷移するようにしています。
右クリックの禁止等もしなくて済むようになっています。

なお、中クリックは何もせず、左クリックの時のみ遷移したい場合は
onclickのリスナーに条件を追加するとうまくいくと思います。

投稿2016/05/19 14:43

編集2016/05/19 14:45
toko

総合スコア144

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yutarou2000

2016/05/19 23:59

ありがとうございます。 こちらを採用させていただきました。 こんなにも意図通りに動くと感動的です。 またhide2e3rさんもご回答ありがとうございました。勉強させていただきました。
guest

0

中ボタンでもclickイベントが発生するみたいなのでclickの場合警告を出すのではなく、リンク先のページにlocation.hrefで同一windowで遷移させてreturn falseしてしまうのはどうでしょう

投稿2016/05/19 09:07

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問