svnno****@sourc*****
svnno****@sourc*****
2010年 6月 17日 (木) 23:06:29 JST
Revision: 1896 http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1896 Author: dhrname Date: 2010-06-17 23:06:29 +0900 (Thu, 17 Jun 2010) Log Message: ----------- 1, object要素などが指定されていないときの処理を追加 2, SVGLoadイベントの振る舞いを修正 Modified Paths: -------------- branches/06x/061/org/w3c/dom/svg.js Modified: branches/06x/061/org/w3c/dom/svg.js =================================================================== --- branches/06x/061/org/w3c/dom/svg.js 2010-06-15 14:54:36 UTC (rev 1895) +++ branches/06x/061/org/w3c/dom/svg.js 2010-06-17 14:06:29 UTC (rev 1896) @@ -794,10 +794,14 @@ */ function SVGURIReference() { /*readonly SVGAnimatedString*/ this.href = new SVGAnimatedString(); - this._instance = null; //埋め込みの場合に、読み込んだDOMツリーを結び付けておくプロパティ + this._instance = this._text = null; //埋め込みの場合に、読み込んだDOMツリーを結び付けておくプロパティ this.addEventListener("DOMAttrModified", function(evt){ if (evt.relatedNode.namespaceURI === "http://www.w3.org/1999/xlink" && evt.attrName === "xlink:href") { evt.target.href.baseVal = evt.newValue; + /*_svgload_limitedを+1とすることで、 + *SVGLoadイベントは発火されなくなる。1を引く必要がある + */ + evt.target.ownerDocument.documentElement._svgload_limited++; } evt = null; }, false); @@ -937,6 +941,9 @@ function SVGSVGElement() { SVGElement.apply(this, arguments); this._tar = document.createElement("v:group"); + /*_svgload_limitedはSVGLoadイベントを発火させる判定基準。 + * Xlink言語が使われていない限り0であり、SVGLoadイベントが発火される*/ + this._svgload_limited = 0; /* SVGElement, SVGTests, SVGLangSpace, @@ -1310,7 +1317,7 @@ _init : function() { /*objeiはobject要素かembed要素*/ var xmlhttp = NAIBU.xmlhttp, objei = this._tar, thistar = this; - if (this._tar.nodeName === "object") { + if (this._tar.nodeName === "OBJECT") { var data = "data"; } else { var data = "src"; @@ -1388,10 +1395,18 @@ var backdown = bt + viewHeight + 1; trstyle.clip = "rect(" +bt+ "px " +backright+ "px " +backdown+ "px " +bl+ "px)"; this._document = s; - var evt = s.createEvent("SVGEvents"); - evt.target = s.documentElement; - evt.initEvent("SVGLoad", false, false); - s.documentElement.dispatchEvent(evt); + if (!!s._svgload_limited) { + /*_svgload_limitedプロパティはXlink言語が使われていない限り、0である。 + *xlink:href属性が指定されるたびに+1となる。 + *0以外は、SVGLoadイベントが発火されない仕組みとなっている + */ + s._svgload_limited--; + if (s._svgload_limited < 0) { + var evt = s.createEvent("SVGEvents"); + evt.initEvent("SVGLoad", false, false); + s.documentElement.dispatchEvent(evt); + } + } s = evt = null; alert((new Date()).getTime() - dew.getTime()); if (thistar._next) { @@ -3617,29 +3632,35 @@ evt = null; }, false); this.addEventListener("SVGLoad", function(evt){ - var tar = evt.target; - var evtt = this.ownerDocument.createEvent("MutationEvents"); - evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null); - tar.dispatchEvent(evt); - evtt = evt = tar = null; + var tar = evt.target, script = tar._text; + script = "(function(window, document){" +script; + script += "})(Document.prototype.defaultView, window._document)"; + /*_documentに該当する文書ノードをグローバル変数に入れておいて、後で渡しておく*/ + var tod = tar.ownerDocument; + window._document = tod; + eval(script); + tod._svgload_limited--; + if (tod.documentElement._svgload_limited < 0) { + evt = tod.createEvent("SVGEvents"); + evt.initEvent("SVGLoad", false, false); + tod.documentElement.dispatchEvent(evt); + } + tar = evt = script = null; }, false); this.addEventListener("DOMNodeInserted", function(evt){ var tar = evt.target; if (evt.eventPhase === Event.BUBBLING_PHASE) { if (tar.nodeType === Node.CDATA_SECTION_NODE) { + /*もし、CDATA宣言を用いて、ソースが書かれていれば、 + *それを_textプロパティに格納しておく + */ evt.currentTarget._text = tar.nodeValue; } - return; + } else if (evt.eventPhase === Event.AT_TARGET && !tar.hasAttribute("xlink:href")) { + var evtt = tar.ownerDocument.createEvent("SVGEvents"); + evtt.initEvent("SVGLoad", false, false); + evt.currentTarget.dispatchEvent(evtt); } - tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){ - var tar = evt.target, script = tar._text; - script = "(function(window, document){" +script; - script += "})(Document.prototype.defaultView, window._document)"; - /*_documentに該当する文書ノードをグローバル変数に入れておいて、後で渡しておく*/ - window._document = tar.ownerDocument; - eval(script); - tar = evt = script = null; - }, false); tar = evt = null; }, false); return this; @@ -3952,18 +3973,21 @@ oba.setAttribute("id","_NAIBU_outline"); document.body.appendChild(oba); var ob = document.getElementsByTagName("object"), em = document.getElementsByTagName("embed"); - for (var i=0,s=[];i<ob.length;++i) { + var i = 0; + for (s=[];i<ob.length;++i) { s[s.length] = new GetSVGDocument(ob[i]); } - for (var i=0;i<em.length;++i) { + for (i=0;i<em.length;++i) { s[s.length] = new GetSVGDocument(em[i]); } - for (var i=0;i<s.length;++i) { + for (i=0;i<s.length;++i) { if (i < s.length-1) { s[i]._next = s[i+1] } } - s[0]._init(); //初期化作業を開始 + if (i > 0) { + s[0]._init(); //初期化作業を開始 + } s = null; } }) )