重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

趣味で準備中のブログを表示すると、
「ページでエラーが発生しました。」と出るようになってしまいました。

ダブルクリック後に出てくる表示が、

ライン:172
文字:2
エラー:オブジェクトがありません。
コード:0
URL:http://○○○.com

とあり、firefoxのエラーコンソールから見てみると、
「list is null」で、171行目が表示されていました。

何かが空になっているとか、そんな意味だと思うのですが、
文のどこが変なのかサッパリ分からない状態です。

以下が、構文の前後です。

setStyle = function(element, key, value) {
element.style[key] = value;
}

getStyle = function(element, key) {
return element.style[key];
}

cleanWhitespace = function(list) {
var node = list.firstChild;  【←この行が変みたいです。】
while (node) {
var nextNode = node.nextSibling;
if(node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
list.removeChild(node);
}
node = nextNode;
}
return list;
}


分かる方、いらっしゃったら教えていただけると幸いです。
よろしくお願いします。

A 回答 (4件)

ご提示のものだけでは不十分です。


(かといって、170行を掲示されても見る人はいないかも…)

ご提示の部分は、list(という名前の変数で指示される)要素の中で、改行など以外のテキスト要素を削除して返すというファンクションです。
呼び出し元でこの引数に、空の要素や要素以外のオブジェクトを渡しているためにエラーになっていると推測されます。

それなので、エラーの発生はご提示の部分で起こっていますが、その原因は呼び出し側にあると思われるので、そこを正しく修正しない限り根本的な修正にはなりません。

単に、その部分のエラーを出なくするだけなら、
 if (list.nodeType == 1) { ~~
のように、listが単独要素でない場合はスルーするようにしてしまえば、多分可能ではないかと思いますが(要素以外のオブジェクトの場合は、nodeTypeはundefinedを返す)、その場合に本来の機能が正しく働くのかどうかは元の機能が不明のため、まったくわかりません。

この回答への補足

ご回答ありがとうございます。

なるほど、他の部分が変なのですね・・。
そのことが分かっただけでも、とても助かります。

if(list.nodeType=1・・のアイデアは、
どうしても改善しないときに、試してみようと思います。

助け船だしてくれる方が
いるかもしれないので、一応、分割して(文字数
が多くて載らないため)掲示してみます。


/*
Author: ○○
Update: ○○
Author URI: ○○
*/
(function() {

var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}

var GhostlyMenu = Class.create();
GhostlyMenu.prototype = {

initialize: function(target, align, opacity, offset) {
this.obj = cleanWhitespace(target);
this.align = align || 'left';
this.opacity = 0;
this.maxopacity = opacity || 1;
this.offset = offset || 0;

this.menu = this.obj.childNodes
if (this.menu.length < 2) { return; }

this.title = this.menu[0];
this.body = this.menu[1];

cleanWhitespace(this.body).firstChild.className = 'first';

if (/MSIE/i.test(navigator.userAgent)) {
var readers = getElementsByClassName('reader', 'a', this.body);
for (var i = 0; i < readers.length; i++) {
setStyle(readers[i], 'cursor', 'hand');
}
}

setStyle(this.body, 'visibility', 'hidden');
setStyle(this.body, 'position', 'absolute');
setStyle(this.body, 'overflow', 'hidden');
setStyle(this.body, 'display', 'block');

addListener(this.obj, 'mouseover', bind(this, this.activate), false);
addListener(this.obj, 'mouseout', bind(this, this.deactivate), false);
},

activate: function() {
var pos = cumulativeOffset(this.title);
var left = pos[0];
if (this.align == 'right') {
var offset = getWidth(this.title) - getWidth(this.body) + this.offset;
left += offset;
}
var top = pos[1] + getHeight(this.title);

setStyle(this.body, 'left', left + 'px');
setStyle(this.body, 'top', top + 'px');
setStyle(this.body, 'visibility', 'visible');
setStyle(this.body, 'opacity', this.opacity);
setStyle(this.body, 'MozOpacity', this.opacity);
setStyle(this.body, 'KhtmlOpacity', this.opacity);
setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')');

if(this.tid) {
clearTimeout(this.tid);
}
this.tid = setInterval(bind(this, this.appear), 30);
},

deactivate: function(){
if(this.tid) {
clearTimeout(this.tid);
}
this.tid = setInterval(bind(this, this.fade), 30);
},

続く

補足日時:2010/03/03 10:59
    • good
    • 0

#1です。



長いのまで解析する気にはなれないけど、前の回答で肝心の「null」を忘れていましたので、訂正を… ( ←アホですね )

 list.nodeType == 1
だと、肝心のnullのときにはエラーになるので
 list && list.nodeType == 1
しゃないとダメですね。

失礼しました。

この回答への補足

確かに、長すぎますよね・・。

回答補足ありがとうございます。

でも、

list && list.nodeType == 1 を、
どこに書いたら良いのかが分からなかったりもします・・。


cleanWhitespace = function(list) {
var node = list.firstChild;  【←この行が変みたいです。】
while (node) {
var nextNode = node.nextSibling;
if(node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
list.removeChild(node);
}


の最後あたりに、こっそり入れておけば何とかなるのかな・・。
色々試してみます。

補足日時:2010/03/03 12:31
    • good
    • 0

ぶんかつしやすいように。

その2

この回答への補足

再び、ありがとうございます><。


続き


addListener = function(element, name, observer, useCapture) {
if(element.addEventListener) {
element.addEventListener(name, observer, useCapture);
} else if(element.attachEvent) {
element.attachEvent('on' + name, observer);
}
}

function loadMenus() {
var subscribe = $('subscribe');
new GhostlyMenu(subscribe, 'left', 1, 1);

var menubar = $('menus');
var list = cleanWhitespace(menubar.childNodes);
for (var i = 0; i < list.length; i++) {
new GhostlyMenu(list[i], 'left', 1, 1);
}
}
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", loadMenus, false);

} else if (/MSIE/i.test(navigator.userAgent)) {
document.write('<script id="__ie_onload_for_inove" defer src="javascript:void(0)"></script>');
var script = $('__ie_onload_for_inove');
script.onreadystatechange = function() {
if (this.readyState == 'complete') {
loadMenus();
}
}

} else if (/WebKit/i.test(navigator.userAgent)) {
var _timer = setInterval( function() {
if (/loaded|complete/.test(document.readyState)) {
clearInterval(_timer);
loadMenus();
}
}, 10);

} else {
window.onload = function(e) {
loadMenus();
}
}

window['MGJS_MENU'] = {};

})();



以上です。長すぎて、すみません・・

補足日時:2010/03/03 11:24
    • good
    • 0

ぶんかつしやすいように。

その1
(べつにかいとうするすわけではありません)

この回答への補足

助かります><。2回補足できないのですね><。

続き。

appear: function() {
this.opacity += 0.1;
if(this.opacity >= this.maxopacity) {
this.opacity = this.maxopacity;
clearTimeout(this.tid);
}
setStyle(this.body, 'opacity', this.opacity);
setStyle(this.body, 'MozOpacity', this.opacity);
setStyle(this.body, 'KhtmlOpacity', this.opacity);
setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')');
},

fade:function() {
this.opacity -= 0.1;
if(this.opacity <= 0) {
this.opacity = 0;
setStyle(this.body, 'visibility', 'hidden');
clearTimeout(this.tid);
}
setStyle(this.body, 'opacity', this.opacity);
setStyle(this.body, 'MozOpacity', this.opacity);
setStyle(this.body, 'KhtmlOpacity', this.opacity);
setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')');
}
}

$ = function(id) {
return document.getElementById(id);
}

$A = function(iterable) {
if(!iterable) {
return [];
}
if(iterable.toArray) {
return iterable.toArray();
} else {
var results = [];
for(var i = 0; i < iterable.length; i++) {
results.push(iterable[i]);
}
return results;
}
}

getElementsByClassName = function(className, tag, parent) {
parent = parent || document;

var allTags = (tag == '*' && parent.all) ? parent.all : parent.getElementsByTagName(tag);
var matchingElements = new Array();

className = className.replace(/\-/g, '\\-');
var regex = new RegExp('(^|\\s)' + className + '(\\s|$)');

var element;
for (var i = 0; i < allTags.length; i++) {
element = allTags[i];
if (regex.test(element.className)) {
matchingElements.push(element);
}
}

return matchingElements;
}

bind = function() {
var array = this.$A(arguments);
var func = array[array.length - 1];
var _method = func, args = array, object = args.shift();
return function() {
return _method.apply(object, args.concat(array));
}
}

getHeight = function(element) {
return element.offsetHeight;
}

getWidth = function(element) {
return element.offsetWidth;
}

setStyle = function(element, key, value) {
element.style[key] = value;
}

getStyle = function(element, key) {
return element.style[key];
}

cleanWhitespace = function(list) {
var node = list.firstChild;     【【ここがエラー表示】】
while (node) {
var nextNode = node.nextSibling;
if(node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
list.removeChild(node);
}
node = nextNode;
}
return list;
}

cumulativeOffset = function(element) {
var valueT = 0, valueL = 0;
do {
valueT += element.offsetTop || 0;
valueL += element.offsetLeft || 0;
element = element.offsetParent;
} while (element);
return [valueL, valueT];
}

続く・・

補足日時:2010/03/03 11:21
    • good
    • 0

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