2013-03-13 2 views
0

Когда SVG-файл, имеющий xlinks, загружается и добавляется из другого источника, ссылки xlinks не связаны. У меня возникла проблема с загрузкой локального файла и файла с сервера. Загрузка файлов и все SVG находятся в DOM. Все работает отлично, за исключением того, что xlink не ссылается. Я получил этот код для работы с локальными файлами.Почему ссылка xlink отсутствует?

xmlDoc = document.implementation.createDocument('http://www.w3.org/2000/svg', 'svg:svg', null); 
    xmlDocRoot = xmlDoc.documentElement; 

    if (fil[0]) 
    { 
     var blobURLref = window.URL.createObjectURL(fil[0]); 

     xmlDoc.onload = function(evt) { 
      xmlDocRoot = xmlDoc.documentElement; 
      SVGRootImgs.appendChild(xmlDocRoot); 
     } 
     xmlDoc.src = xmlDoc.load(blobURLref); 

     window.URL.revokeObjectURL(blobURLref); 
    } 

где fil [0] - это локальный файл, загруженный методом файлов. С помощью этого кода ссылки будут привязаны. Когда я пытаюсь загрузить с сервера, я попробовал следующий код.

 htmlObjImgs = document.getElementById("hom_img"); 
     SVGDocImgs = htmlObjImgs.getSVGDocument(); 
     var crt_date = new Date(); 
     var fd = new FormData(); 
     fd.append('usrname', usr_nam); 
     fd.append('filename', fil_nam); 
     var xhr = new XMLHttpRequest(); 

     xhr.onload = function() { 

      SVGRootImgs = SVGDocImgs.documentElement; 
      var rspns_xhr = xhr.responseXML.documentElement; 

      ld_tag_nods(ld_nodes = rspns_xhr.getElementsByTagNameNS(svgns, 'svg'), function(){ 

       var svg_fil = SVGDocImgs.createElementNS(svgns, "svg"); 

       ld_svg_fil(svg_fil = SVGDocImgs.importNode(ld_nodes[0], true), function(){ 

        SVGRootImgs.appendChild(svg_fil); 
       }); 
      }); 
     } 
     xhr.onerror = function() { 
      dump("Error while getting XML."); 
     } 
     xhr.open('POST', 'ld_fil.php?nocache='+crt_date, true); 
     xhr.responseType = "document"; 
     xhr.overrideMimeType("image/svg+xml"); 
     xhr.send(fd); 

Где ld_tag_nods() и ld_svg_fil() являются неопределенными функциями обратного вызова.

Этот код загрузит все 100% и включает в себя xlinks, но ссылки на xlink не будут связаны. Любой SVG, который не использует дисплеи xlink, но любой SVG, который использует xlink, не будет отображаться.

Следует отметить, что тот же файл используется как для локального файла, так и для файла сервера. Файл имеет ссылки xlink в теге SVG.

Я полагаю, что я мог бы найти способ решить эту проблему. Например, я мог бы создать URL-адрес для blob, который может работать. Но, я хотел бы знать, почему серверные коды xlinks не будут связаны. Это потому, что файлы поступают из иностранного источника?

ответ

0

Я думал, что когда узлы были перенесены из одного документа в другой, который должен был использоваться importNode(). Файл загружается со всеми связями xlinks, если я пропускаю importNode(). Я также не получаю никаких ошибок или предупреждений. Наверное, у меня это работает, но я, конечно, не понимаю этого процесса. Это код, который работает.

htmlObjImgs = document.getElementById("hom_img"); 
SVGDocImgs = htmlObjImgs.getSVGDocument(); 
SVGRootImgs = SVGDocImgs.documentElement; 

var crt_date = new Date(); 
var fd = new FormData(); 
fd.append('usrname', usr_nam); 
fd.append('filename', fil_nam); 
var xhr = new XMLHttpRequest(); 

xhr.onload = function() { 
    SVGRootImgs.appendChild(xhr.responseXML.documentElement); 
} 
xhr.onerror = function() { 
    dump("Error while getting XML."); 
} 
xhr.open('POST', 'ld_fil.php?nocache='+crt_date, true); 
xhr.responseType = "document"; 
xhr.overrideMimeType("image/svg+xml"); 
xhr.send(fd); 
+0

Похоже, вы нашли ошибку в importNode. Возможно, вам следует сообщить об этом создателю соответствующей библиотеки. –

+0

Это javascript (очевидно) работает на Firefox. Могу ли я сообщить об этом Mozilla? – VectorVortec

+0

Конечно, особенно если он работает в других UA, и вы можете предоставить минимальный, автономный, полный тестовый тест. –

Смежные вопросы