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

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

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

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

Q&A

解決済

2回答

33053閲覧

【JavaScript】attachEvent / addEventListener の未定義エラー

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

1クリップ

投稿2015/07/27 13:15

編集2015/07/27 13:16

JavaScript 初級者です。
IE7対応の、jQueryを使わないJavaScriptが必要になり、下記の3つを作っているところです。

  • ページトップへ戻る(非スムーススクロール)
  • 前のページへ戻る
  • 印刷ボタン

コードはこちらです。

var ua = navigator.userAgent.toLowerCase(), // ブラウザverを取得して小文字化 ie7 = ua.indexOf("msie 7"), // 文字列検索 ie8 = ua.indexOf("msie 8"), pageTop = document.getElementById("pagetop"), // ページトップ pageBack = document.getElementById("btn-back"), // 前のページへ paper = document.getElementById("btn-print") // 印刷 ; // IE7, IE8とそれ以外の切り替え if (ie7 != -1 || ie8 != -1) { pageTop.attachEvent("onclick", function() { window.scrollTo(0, 0); event.cancelBubble = true; }) pageBack.attachEvent("onclick", function() { history.back(); event.cancelBubble = true; }) paper.attachEvent("onclick", function() { window.print(); event.cancelBubble = true; }) } else { pageTop.addEventListener("click", function(e) { window.scrollTo(0, 0); e.stopPropagation(); }) pageBack.addEventListener("click", function(e) { history.back(); e.stopPropagation(); }) paper.addEventListener("click", function(e) { window.print(); e.stopPropagation(); }) };

この場合、「印刷する」ボタンがないページを開くと、
Cannot read property 'addEventListener' of null
とエラーになります。

「未定義のイベントリスナーは使えないよ」という意味なのかと思いますが、どうすれば良いかわかりません。

ページに該当するボタン(ID)がなくても、エラーが出ないようにしたいのですが、お分かりの方はいらっしゃいませんか。

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

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

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

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

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

guest

回答2

0

Cannot read property 'addEventListener' of null
このエラーは「イベントリスナーが未定義」というより、object.addEventListenerとなっている場合のobjectの部分がnullであることを表しています。

document.getElementByIdは、指定のIDが付与されたDOMがロードされる前にコールすると、指定されたIDのDOMが存在しないと判断してnullを返します。
その結果、上記のエラーが出ているのだと思われます。

IE9未満に対応しなくていいのならば、DOMContentLoadedが使えるのですが、

JavaScript

1window.addEventListener('DOMContentLoaded', function() { 2 // document.getElementById や addEventListener 3}, false);

IE9未満に対応する場合は、こんな感じですかね。

JavaScript

1var setDomLoadedListener = function(listenerFunc) { 2 if (document.addEventListener) { 3 document.addEventListener('DOMContentLoaded', listenerFunc, false); 4 } else if (document.attachEvent) { 5 // document.documentElement.doScroll('left') を利用した方法がjQueryで使われているとか、いないとか・・・ うろ覚えです 6 var doScrollCheck = function() { 7 try { 8 document.documentElement.doScroll('left'); 9 } catch (e) { 10 setTimeout(arguments.callee, 1); 11 return; 12 } 13 listenerFunc(); 14 }; 15 doScrollCheck(); 16 } 17}; 18 19setDomLoadedListener(function() { 20 // document.getElementById や addEventListener 21});

上記のコードは未検証な上に全く自信がないので、もしお試しいただく場合は、「うまく動いたらラッキー」みたいな気持ちで試してください。

投稿2015/07/27 14:34

shiolier

総合スコア1156

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

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

退会済みユーザー

退会済みユーザー

2015/07/27 14:56

half_sleepingさん ご回答くださりありがとうございます。 まだ初級者でして、書いて頂いたコードの意味すらわかりません(汗)。 少し調べてみますね。 この度は目に留めて頂き、どうもありがとうございました。
ktanaka11

2019/12/11 02:14

別件で上記エラーメッセージを検索していた際 こちらの回答を発見し、大変勉強になりました。 ありがとうございます!
guest

0

ベストアンサー

getElementByIdは未定義のIDに対してnullを返すので、

javascript

1if (paper != null) { 2 paper.addEventListener("click", function(e) { 3 window.print(); 4 e.stopPropagation(); 5 }) 6}

みたいな感じで単純にnullだったら処理をスルーするようにすればいいかもしれません。

投稿2015/07/27 13:40

yu-ri

総合スコア634

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

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

退会済みユーザー

退会済みユーザー

2015/07/27 14:53

yu-riさん 条件分岐でnullを外すことで、解決することができました。 >getElementByIdは未定義のIDに対してnullを返すので、 そうなのですね、勉強になります。 この度はどうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問