5

私はIEでこの問題を抱えています。選択した要素をある要素から別の要素にドラッグするために使用する 2 つの div があります。div1 に子要素 (div) があり、div2 にいくつかの子要素があるとします。div1 の子要素で div2.appendChild() メソッドを呼び出します。div1 から子を削除し、div2 に追加します。次に、子を div1 に追加しようとすると、IE で次の例外「メソッドまたはプロパティ アクセスへの予期しない呼び出し」が発生します。それはfirefoxで完全に機能しています。以下の JavaScript のコード スニペットを参照してください。

function moveSelectedGroupBoxItems(toLocation, grp){
    document.body.className = 'groupBoxDefaultCursor';
    if(groupBoxfromLocation != toLocation){
        if(grp == groupBoxGroup){
            var fromVal = document.getElementById(groupBoxfromLocation);
            var toVal = document.getElementById(toLocation);

            var children = fromVal.childNodes;
            for (var i = children.length - 1; i >= 0; i--) {
                if(children[i].className == 'groupBoxItemSelected'){
                    children[i].childNodes[0].name=toLocation;
                    toVal.appendChild(children[i]);
                }
            }
        }
    }
    groupBoxfromLocation = '';
    groupBoxGroup = '';
    return false;
}

これは基本的に、ドラッグ時に選択した子 div をある親 div から別の親 div に移動します。

4

7 に答える 7

5

検索結果の利点については、IE 6 および 7 で、子ノードを名前空間付きの要素に追加するときに「メソッドまたはプロパティ アクセスへの予期しない呼び出し」という同じエラーが発生しましたが、名前空間が宣言されていませんでした。

var a=document.createElement("foo:blah");
var b=document.createElement("div");
a.appendChild(b); //Fails

これを回避するには、名前空間宣言を HTML コードに追加する必要がありました。

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:foo>

またはJavaScriptを介して動的に(おそらくtry/catchでラップする必要があります):

var namespaces = document.namespaces;
if(namespaces) {
    namespaces.add("foo", null, null);
}
于 2010-12-23T16:06:38.183 に答える
3

私は IE7 でこの問題を抱えていましたが、IE7 DOM が完全ではないことが判明しました。

私の場合、ASP.NET MCV TagBuilder によってレンダリングされたイメージ タグがあり、次のようにレンダリングされました。

<img ...></img>

そこにある終了タグに注意してください。それが問題の原因でした。次のようにレンダリングすると機能しました。

<img ... />

お役に立てれば。

于 2010-09-17T07:17:31.363 に答える
2

要素の名前を動的に設定することは、最も確実な方法ではありません。残念ながら、エラーを取り除く方法についてはお答えできません。ただし、JavaScript ライブラリ (jQuery、Prototype、Dojo など) を使用することを強くお勧めします。それらは非常に小さく、習得が比較的容易で、ひ​​どい DOM API よりもはるかに便利に使用できます。最後に大事なことを言い忘れましたが、それらは多くの厄介なブラウザの非互換性からあなたを守ります. 試してみてください。数日後、元に戻ることは想像できません。約束します。

于 2009-11-10T15:27:43.000 に答える
0

IE7でも同じ問題が発生し、タイムアウトを追加して解決しました。

setTimeout(function(){gallery.appendChild(g_field)},300);

IEで何かが機能しないが、Firefoxで完全に機能する回数を数え切れませんでした。これは、短い遅延で解決できます...理由はわかりません。

ごめん!すぐに話しました...私のタイムアウト(この場合)が機能しなかったことがわかりました。

于 2011-01-05T06:16:11.503 に答える
0

あなたはそれが死んでいないと確信していますか:

children[i].childNodes[0].name=toLocation;

この行で何を達成しようとしていますか?


真剣に、それをコメントアウトしてみてください。私はそれがあなたが考えているものだとは思いません- nodeNameと呼ばれる正しいプロパティではありませんか?

于 2009-11-10T15:23:39.127 に答える
0

解決済み!...フォーム送信のために移動中のアイテムのIDを格納する子div内に入力を隠していました。非表示の入力を削除し、選択ボックスの下に配置しました。div が移動されるたびに、非表示の名前が親 div id に更新されます。ノードに子がある場合、IE には appendChild() に問題があるようです。これはうまくいくこともあれば、失敗することもありました。子のない単一の要素を追加すると、常に機能します。問題が何であったか正確にはわかりませんが、上記の方法で解決しました。

乾杯

グレップ

于 2009-11-12T08:21:07.943 に答える
0

children[i].childNodes[0].name=toLocation;

親 div に含まれる各子 div にも非表示の入力値が含まれます。親 div には name 属性は含まれず、id のみが含まれます。子 div が 1 つの親 div から別の親 div にドラッグされると、すべての非表示入力の名前の値が div id に更新されます。フォームが送信されると、サーバーは特定の親 div に存在する値を識別できます。これは今のところ IE と Firefox で問題なく動作します。問題は間違いなく appendChild() メソッド内にあります。これは、このステートメントで中断し続けるためです。ロード時に親 div が空の場合、すべてが完全に機能します。親 div の子が別の div に追加されてから再び戻ると、IE でのみ例外が発生します。

残念ながら、私はまだフレームワークを実装できません。タグは、新しい要件に対応するために頻繁に変更されます。

私のトピックへの返信ありがとうございます。

乾杯

グレップ

于 2009-11-11T07:35:19.760 に答える