1

これは奇妙なものです。JavaScript で動的に作成された VML オブジェクトのコレクションがあります。テストに使用しているシステムは、Windows XP (SP3) の IE6 です。

コレクションでマウスを押し下げると、奇妙な「失敗」エラーがスローされます。本当に奇妙なことに、私はしばらくの間 VML を使用してきましたが、先週の時点ではこのエラーは発生していませんでした。

とにかく、ここにエラーを示すデモへのリンクがあります。

http://www.codequark.com/vml-demo

エラーは次のとおりです。

行:25 文字:5 エラー:失敗 コード:0

素晴らしい。私はIE6を使用していますが、7または8で発生しているかどうかを知ることは役に立ちます.

私が見つけたこのエラーに近いものへの唯一の他の参照は次のとおりです。

http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/dfacff65-cd23-480f-a2e9-c928e63cb50f/

Web サイトで IE がクラッシュし続け、デバッグできない

もしよろしければ、ソースコードはこちらです。それをロードして、選択した野蛮な IE ブラウザで表示できます。

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>     
    <script type="text/javascript" charset="utf-8">


    //the stage element.
    var stage;     

        //create a group with a single square shape.
        function makeAScaledRotatedGroup(sclX, sclY, rot, clr) {

        var xCoord = 200;
        var yCoord = 200;

        var regX = 100;
        var regY = 100;

        var origX = -10/sclX + regX;
        var origY = -10/sclY + regY;

        var _x = xCoord - 10;
        var _y = yCoord - 10;

        var grp = document.createElement('<v:group style="position:absolute; left:'+_x+'px; top:'+_y+'px; width:20px; height:20px; rotation:'+rot+';" coordsize="'+20/sclX+' '+20/sclY+'" coordorigin="'+origX+' '+origY+'"  class="rvml">');

        var shp1 = document.createElement('<v:shape fillcolor="'+clr+'" strokecolor="red" strokeweight="2px" coordorigin="0 0" coordsize="20 20" style="position:absolute; top:0px;left:0px;width:20px;height:20px;"  class="rvml">');
        var pth1 = document.createElement('<v:path v="M 0 0 L 200 0  200 200  0 200 X E"  class="rvml">');

        shp1.appendChild(pth1);
        grp.appendChild(shp1);

        stage.appendChild(grp);

       return grp;
       }


//array to store references to all the dom nodes.
var allRects = [];

    //kick it off. mon calamari cruisers beware.
    function operationalBattleStation() {

    document.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)");
    document.namespaces.add("v", "urn:schemas-microsoft-com:vml");

    stage = document.createElement('div');
    stage.style.position = 'absolute';
    stage.style.top = '0px';
    stage.style.left = '0px';
    stage.style.width = '500px';
    stage.style.height = '500px';
    stage.style.clip = "rect(0px,500px,500px,0px)";
    document.body.appendChild(stage);


    var clrs = ['#0066CC', '#990000','#FF0033','#0699CC','#00FF00','#0000FF','#FF0000','#33FF00','#333300', '#990000','#FF0033','#0699CC','#00FF00','#0000FF','#FF0000','#33FF00','#333300'];
    var rot =0;
    var scl = 1;

        for(var h=0; h<clrs.length; h++) {
        allRects.push(makeAScaledRotatedGroup(scl, scl, rot, clrs[h]));                 
        rot+=10; 
        scl = scl*0.7;
        }

    };


</script></head><body onload="operationalBattleStation();"></body></html>

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

1

ああ、これは本のためのものです。

調べてみてください、このバグとそれに似たいくつかのバグは...待ってください...私のバージョンのIE6にインストールされた「Reganam」と呼ばれるある種のツールバーアドオンが原因でした。それを非表示にすることで問題は解決し、コードは本来の動作をするようになりました。

私の理論では、このアドオンが何らかの形で IE6 のガベージ コレクション システムに影響を与えていたというものです。VML ノードがまだ画面に表示されていても、VML ノードが削除されたようです。他のインスタンスでは、VML 要素の window.event.srcElement は、そのプロパティのいずれかにアクセスしようとすると、'Failed' エラーをスローします。しかし、srcElement は null ではありませんでした。(解放されたオブジェクトのプロパティにアクセスしようとすると、objective-c と同じように動作します) アドオンを非表示にすることで、この問題も解決しました。

アドオンが VML に干渉する理由 (および、そのような干渉が可能なようにブラウザーが設計されている理由) は理解できません。

Reganam アドオンは、クロスブラウザーのベクター グラフィックスを使用する必要がある人にとっては悪いニュースです。もっと書きたいのですが、作るべきブードゥー人形がいくつかあります。

于 2012-07-15T14:08:49.523 に答える