[Sie-announce] SIEコード [1821] SVGURIReferenceの埋め込み機能をAjaxを用いて実装

アーカイブの一覧に戻る

svnno****@sourc***** svnno****@sourc*****
2010年 5月 13日 (木) 23:32:20 JST


Revision: 1821
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1821
Author:   dhrname
Date:     2010-05-13 23:32:19 +0900 (Thu, 13 May 2010)

Log Message:
-----------
SVGURIReferenceの埋め込み機能をAjaxを用いて実装

Modified Paths:
--------------
    branches/ufltima/dom/svg.js

Modified: branches/ufltima/dom/svg.js
===================================================================
--- branches/ufltima/dom/svg.js	2010-05-13 14:31:41 UTC (rev 1820)
+++ branches/ufltima/dom/svg.js	2010-05-13 14:32:19 UTC (rev 1821)
@@ -763,6 +763,7 @@
  */
 function SVGURIReference() {
   /*readonly SVGAnimatedString*/ this.href = new SVGAnimatedString();
+  this._instance = 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;
@@ -814,6 +815,55 @@
           tar._tar.setAttribute("target", "_blank");
           tar._tar.setAttribute("href", uri);
         } else if (show === "embed") {
+          var xmlhttp = NAIBU.xmlhttp;
+          var ui = uri.indexOf("#");
+          if (ui > -1) {
+            var id = uri.substring(ui+1, uri.length);
+            uri = uri.replace(/#.+$/, "");
+          } else {
+            var id = null;
+          }
+          if (ui === 0) { //URIが#で始まるのであれば
+            var doc = tar.ownerDocument, ele = doc.getElementById(id);
+            tar._instance = doc.importNode(ele);
+            var ev = tar.ownerDocument.createEvent("SVGEvents");
+            ev.initEvent("SVGLoad", false, false);
+            ev.target = tar;
+            tar.dispacthEvent(ev);
+            ev = null;
+            ele = null;
+          } else {
+            xmlhttp.open("GET", uri, true);
+            xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+            xmlhttp.onreadystatechange = function() {
+              if (xmlhttp.readyState === 4  &&  xmlhttp.status === 200) {
+                var type = xmlhttp.getResponseHeader('Content-Type');
+                if (!type) {
+                  tar._tar.src = uri;
+                } else if (/[text|xml|script]/.test(type)) { //ファイルがtext形式である場合
+                  /*responseXMLを使うと、時々、空のデータを返すことがあるため(原因は不明)、
+                   *ここでは、responseTextを用いる
+                   */
+                   var doc = new ActiveXObject("MSXML2.DomDocument");
+                   str = xmlhttp.responseText.replace(/!DOCTYPE/,"!--").replace(/(dtd">|\]>)/,"-->");
+                   doc.loadXML(str);
+                   if (id) {
+                     var ele = doc.getElementById(id);
+                   } else {
+                     var ele = doc.documentElement;
+                   }
+                   tar._instance = tar.ownerDocument.importNode(ele);
+                   var ev = tar.ownerDocument.createEvent("SVGEvents");
+                   ev.initEvent("SVGLoad", false, false);
+                   ev.target = tar;
+                   tar.dispacthEvent(ev);
+                   ev = null;
+                } else {
+                  tar._tar.src = uri;
+                }
+              }
+            }
+          }
         }
       }
     }, false);
@@ -1221,6 +1271,7 @@
       xmlhttp = false;
     }
   }
+  NAIBU.xmlhttp = xmlhttp;
   if (!document.namespaces["v"]) {
     document.namespaces.add("v","urn:schemas-microsoft-com:vml");
     document.namespaces.add("o","urn:schemas-microsoft-com:office:office");




Sie-announce メーリングリストの案内
アーカイブの一覧に戻る