プロが教える店舗&オフィスのセキュリティ対策術

フォームタグのinputタグ内にカーソルを持っていくと、下記エラーとなります。環境は、
prototype.js(1.6)×IE(8)です。FFではエラー表示となりません。
エラーの意味と対処方を教えてください。

メッセージ: オブジェクトがありません。
ライン: 3936
文字: 5
コード: 0
URI: http://ほげほげ/prototype.js

▼該当と思われる行付近
3965行 function getEventID(element) {
3969行 if (element._prototypeEventID) return element._prototypeEventID[0];
3970行 arguments.callee.id = arguments.callee.id || 1;
3971行 return element._prototypeEventID = [++arguments.callee.id];
3972行 }

A 回答 (6件)

#2, 4 です。



(※以下、全てのコードの全角空白は半角空白に置換してください。)

---------
/* Prototype JavaScript framework, version 1.6.1
* (c) 2005-2009 Sam Stephenson
*
* Prototype is freely distributable under the terms of an MIT-style license.
* For details, see the Prototype web site: http://www.prototypejs.org/
*
*--------------------------------------------------------------------------*/

...

// 4516行目
 function observe(element, eventName, handler) {
  element = $(element);

  var responder = _createResponder(element, eventName, handler);

  if (!responder) return element;

  if (eventName.include(':')) {
   if (element.addEventListener)
    element.addEventListener("dataavailable", responder, false);
   else {
    element.attachEvent("ondataavailable", responder);
    element.attachEvent("onfilterchange", responder);
   }
  } else {
   var actualEventName = _getDOMEventName(eventName);

   if (element.addEventListener)
    element.addEventListener(actualEventName, responder, false);
   else
    element.attachEvent("on" + actualEventName, responder);
  }

  return element;
 }
---------

window だけ別処理にしているわけではなさそうです。
エラーが発生しない流れは、以下のようになると思います。

------
function loadListener (event) {
 var element = document.getElementById('undefined');
 var firstChild = element.firstChild; // エラー: オブジェクトがありません。
}
window.attachEvent('onload', loadListener); // 実行され、エラーが発生する
window.attachEvent('ononload', loadListener); // 実行されないので、エラーも発生しない
------
    • good
    • 0
この回答へのお礼

丁寧な解説、ありがとうございました。

お礼日時:2010/09/03 09:37

横からですが…



質問文
>カーソルを持っていくと、下記エラーとなります。

#1の補足
>下記へ変更したら、エラーが表示されなくなりました。


からの推測ですが、
もしかして、何らかの処理をしたくて、スクリプトを設置しているわけではなくて、エラーが出ることだけが問題なので出なくしたいということのように感じられますが。
質問者様の文章のなかに、本来スクリプトで処理している機能が実現できているかいないかについての記載がまったくないので、ひょっとしてそのソースにはスクリプトが必要ないのではないかと思った次第です。

あるいは、少なくとも原因となっているイベント設定に関係する処理は不要であるとか?
もしそうならば、関連するスクリプトの部分をはずしてしまうのが、修正するよりも簡単かと思います。
(関連する部分を特定することが、できないのかもしれませんが)

スクリプトで処理する必要がまったくないのであれば、全部削除してしまうのが一番簡単です。
( <script ~~> ~ </script> のタグを全部削除する )


違っていたなら失礼。
    • good
    • 0

#2 です。



Google Chrome 5, IE8 で試してみましたが、onload は通りませんね…。

---------
<script type="text/javascript" src="./prototype-1.6.1.js"></script>
<script type="text/javascript"><!--
Event.observe(window, 'load', function(event) { alert('window loaded (1)'); }); // 実行される
Event.observe(window, 'onload', function(event) { alert('window loaded (2)'); }); // 実行されない
//--></script>
---------

原因は別にあるのではないでしょうか。
    • good
    • 0

Event.observe(window, 'load', function() {


となっていた箇所を、下記へ変更したら、エラーが表示されなくなりました。
Event.observe(window, 'onload', function() {

==>
不可解ですね。Prototype.jsのEvent.observe()
は、Event.observe(element, eventName, handler)の構文で、
eventNameにはonを取り去ったevent名をしていするはずなのに...

http://api.prototypejs.org/dom/event/observe/

windowオブジェクトは、elementじゃないから特別なのかしら...
    • good
    • 0

■IE8「オブジェクトがありません」



----
var element = document.getElementById('undefined'); // #undefined は存在しないので、null を返す

// 行: 50
// エラー: オブジェクトがありません。
var firstChild = element.firstChild;
----

正確にいえば、「TypeError: firstChildプロパティを持つオブジェクトが存在しません」です。
モダンブラウザならば、「TypeError: Cannot read property 'firstChild' of null」を返します。
「オブジェクトがありません」とあると、未定義の変数からプロパティを呼び出したように感じるかもしれませんが、実際はそうではなくデータ型のエラーです。


■IE8「オブジェクトを指定してください。」

----
hoge(); // オブジェクトを指定してください。
----

IE8で未定義のオブジェクトを指定すると、「オブジェクトを指定してください。」のエラーを返します。
同じコードをモダンブラウザで実行すると、「ReferenceError: hoge is not defined」を返します。


■対処法

「ライン: 3936」「文字: 5」なので、「3936行目の行頭から5文字目」付近をみてください。
掲示されたコードには3936行目を含まないので、判断が出来ません。
また、3936行目の関数をコールしている部分もみてください。
prototype.js の関数を呼び出しているコードがあるはずです。

原因としては、

・IE8未対応のメソッドを使っている (undefined のプロパティを呼び出している)
・関数に不正な引数を渡している
・prototype.js のバグ

のいずれかが考えられます。
    • good
    • 0

エラーの意味と対処方を教えてください。



=>エラーの意味は、そのまんま「オブジェクトがありません。」
ですが、prototype.jsやIE(8)に原因がある事は、おそらくないでしょう。

他にjavascriptのライブラリーとかプラグインとかを使ってませんか、
といっても、そのライブラリーのバグが原因である事もまれでしょう。

ほぼ、あなたの使い方、が誤っているのだと思われます。

対処方
=>お使いのライブラリーもしくは、あなたがコーディングした部分だけ
でも提示する事が出来れば、アドバイスできるかもしれません。

自分で調べるならIE8の開発者ツール(F12)を使って、所謂デバッグ
という作業をしてください。

この回答への補足

Event.observe(window, 'load', function() {
となっていた箇所を、下記へ変更したら、エラーが表示されなくなりました。
Event.observe(window, 'onload', function() {

但し、loadやonloadの違いなど、分かっていません。
色々試し倒したうち、たまたまエラーが表示されなくなったのがこのやり方だった、というだけ
です。

今後のためにも、今回の現象を理解しておきたいので、
上記内容で、今回のエラー原因、及び正しい対処方がどういうものか、
アドバイスいただけないでしょうか?

補足日時:2010/07/28 15:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!