parentElementについて

[上に] [前に] [次に]
ばーばぱぱ 1999/08/02(月) 15:57:50
IE4では「parentElement」はエラーにならず、
IE5ではエラーになってしまいます。
「parentElement」はIE5でサポートされていないのでしょうか?

エラー内容は、
「backS.parentElement.style.backgroundColorはオブジェクトではありません。」
という内容です。
backS.parentElement.style.backgroundColor="white"の
backSは「onclick='SelectCell(document.activeElement)'」
で取得したものです。
詳しく載っている文献がないため、ここで質問することにしました。
どうかよろしくお願いします。

ばーばぱぱ 1999/08/02(月) 16:19:15
すみません。訂正です。
エラー内容は
ランタイムエラーが発生しました。
エラー:オブジェクトがありません
です。
>onclick='SelectCell(document.activeElement)'
はテーブルで行っています。
さらに、行削除を行った後に必ず起きます。
行削除しなければエラーは起きないのです。
parentElementが詳しく載っている文献でも良いので教えて下さい。

Mugi [E-Mail] [HomePage] 1999/08/02(月) 16:33:12
それって僕が作ったテーブル操作スクリプトですよね。
確認してみましたがエラーは出ません。
まさか行数が0になるまで削除を実行したということじゃないですよね。
もしよかったらファイルを見せてください。

Mugi [E-Mail] [HomePage] 1999/08/02(月) 16:40:41
書き忘れました。
SelectCell 関数内に
alert(backS.parentElement.tagName)を加えて
「TR」が表示されるかどうか試してみてください。
TRになっているなら、parentElementは取得できています。
その後のstyle変更処理にバグがあることになります。

ばーばぱぱ 1999/08/02(月) 16:57:25
>それって僕が作ったテーブル操作スクリプトですよね。
そうです。だいぶ改造していますが、媒体はMugiさんが
作ったものです。
>まさか行数が0になるまで削除を実行したということじゃないですよね。
いいえ、1行でも削除するとエラーがでてしまいます。
ファイルの公開が方法が分からないので、ソースを公開します。

function gyosaku(){
if(backS==""){
if(gyo>0){
parent.No2.document.all.tbl.deleteRow(s)
gyo=parseInt(gyo)-parseInt(1)
if(s>-1){s--}
if(s==gyo){
SelectCell(parent.No2.document.all.tbl.rows[s].cells[0])}
else{
SelectCell(parent.No2.document.all.tbl.rows[s+1].cells[0])}
}

else{
alert("すべての行を削除することはできません")}
}

else{
if(backS.parentElement.style.backgroundColor=="yellow"){

if(gyo>0){
parent.No2.document.all.tbl.deleteRow(s)
gyo=parseInt(gyo)-parseInt(1)
if(s>-1){s--}
if(s==gyo){
SelectCell(parent.No2.document.all.tbl.rows[s].cells[0])}
else{
SelectCell(parent.No2.document.all.tbl.rows[s+1].cells[0])}
}
}

else{
alert("すべての行を削除することはできません")}
}
}

function SelectCell(cell){
if(backS==""){
parent.No2.document.all.tbl.rows[0].style.backgroundColor='white';
}
else{
>ここでエラーが発生します。
backS.parentElement.style.backgroundColor="white"
}
cell.parentElement.style.backgroundColor="yellow"
s=cell.parentElement.sectionRowIndex

if((cell.parentElement.style.backgroundColor=="yellow")||(backS.parentElement.style.backgroundColor=="yellow")){
}
backS=cell
parent.No2.BackCell=cell
}

ちなみに、ファイルはhtmではなくaspになっています。
gyoは行数
sは行番号
テーブルは別フレームに作っています(parent.No2が付いています)
アドバイスよろしくお願いします。

ばーばぱぱ 1999/08/02(月) 17:22:54
>「TR」が表示されるかどうか試してみてください。
ちゃんと取得されていました。
私も書き忘れました。
行の削除はされているのですが、その後のSelectCellで
引っかかっているのです。
なにかおかしなことをしているのでしょうか?
IE4では全然平気だったのに・・・

Mugi [E-Mail] [HomePage] 1999/08/02(月) 18:31:27
こんな簡単な問題だったとは...(^^;)
backS=cell を関数の一番始めに記述してください。

Mugi [E-Mail] [HomePage] 1999/08/02(月) 18:57:15
ごめんなさい、上の発言間違いです!
if(s==gyo){
SelectCell(document.all.tbl.rows[s].cells[0])}
else{
SelectCell(document.all.tbl.rows[s+1].cells[0])}
}
が実行される時点で backS は無効なオブジェクトを
参照していますから、SelectCell内のbackS.parentElement.style.backgroundColor="white"
では 直接 document.all.tbl.rows[*] という風に
参照するべきです。
* に何を入れるかは考えてみてください。

ばーばぱぱ 1999/08/02(月) 19:26:06
[[解決]]
Mugiさんやりました。できました!!
別にparentElementがIE5でサポートされていないわけでは
ないんですね。私の記述に問題があったんですね。
*に入るべき物はsやs+1が入った変数ですよね。
Mugiさん本当にありがとうございました。

Mugi [E-Mail] [HomePage] 1999/08/02(月) 19:37:26
ちょっと気になることがあります。
1.gyosaku関数 なぜこんなに複雑なんでしょう。
 僕だったらこうします。
function gyosaku(){
gyo=〜.tbl.rows.length
if(gyo>0){
if(backS==""||(backS!=""&&backS.parentElement.style.backgroundColor=="yellow")){
document.all.tbl.deleteRow(s)
if(s>0){s--}
SelectCell(t.rows[s].cells[0])
gyo=〜.tbl.rows.length
}
}else{
alert("すべての行を削除することはできません")
}
}
「gyo=〜」 はSelectCell内で行うと無駄が少なくなるかも。
2.parent.No2.document.all.tbl という長い参照が何度も出てきますよね。
 ロード時にグローバル変数を割り当てるとソースが見やすくなりますよ。

ばーばぱぱ 1999/08/03(火) 10:38:06
>gyosaku関数 なぜこんなに複雑なんでしょう。
そうですね。難しく考えすぎて長ったらしいソースになってしまいました。
Mugiさんのように修正をしてみたら、見やすくなりました。
>2.parent.No2.document.all.tbl という長い参照が何度も出てきますよね。
>ロード時にグローバル変数を割り当てるとソースが見やすくなりますよ。
またまたそうですね。やってみました。見やすくなりました。
Mugiさんどうもありがとうございました。

[上に] [前に] [次に]