VML在鼠标按下时抛出错误 - “失败”

时间:2012-07-14 20:19:02

标签: javascript events internet-explorer-6 vml

这是一个奇怪的。我有一组在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/

My website keeps crashing IE, can't debug

如果需要,这是源代码。您可以加载它并在您选择的野蛮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>

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

哦,上帝,这是书中的一个。

快来看看,这个bug和几个像是由...造成的...等待它...某种工具栏附加组件称为“Reganam”,它安装在我的IE6版本上。隐藏它解决了问题,现在我的代码表现得正常。

我的理论是这个附加组件在某种程度上影响了IE6的垃圾收集系统。就像VML节点被删除一样,即使它们仍然出现在屏幕上。在其他情况下,如果您尝试访问其任何属性,则VML元素中的window.event.srcElement将抛出“失败”错误。但是srcElement不是null。 (当你试图访问一个被释放对象的属性时,它表现出objective-c的行为)隐藏附加组件也解决了这个问题。

为什么附加组件会干扰VML,(以及为什么设计浏览器以便这种干扰甚至可能)是不可思议的。

对于必须进行跨浏览器矢量图形的人来说,Reganam插件是个坏消息。我想写更多,但我有一些伏都教玩偶。