2016-07-26 98 views
2

当试图将克隆内容附加到新窗口时,Microsoft Edge会抛出'No such interface supported'错误。这里有一个例子:jQuery追加()到新窗口不能与Microsoft Edge一起工作

jQuery(document).ready(function() { 
    jQuery('.trigger').click(function() { 
     var target = jQuery(this).data('print_target'); 

     var w = window.open('', '', 'status=no, toolbar=no, menubar=no, location=no'); 
     var print_html = '<!DOCTYPE html><head><title>' + document.getElementsByTagName('title')[0].innerHTML + '</title></head><body></body></html>'; 
     w.document.write(print_html); 

     var ua = window.navigator.userAgent; 
     var ie = true; 

     //.html() required for IE browsers 
     if (ua.indexOf("MSIE ") != -1) { 
      //console.log('MSIE - Craptastic'); 
      jQuery(w.document.body).append(jQuery(target).clone(true).html()); 
     } 
     else if (ua.indexOf("Trident/") != -1) { 
      //console.log('IE 11 - Trident'); 
      jQuery(w.document.body).append(jQuery(target).clone(true).html()); 
     } 
     else if (ua.indexOf("Edge/") != -1){ 
      console.log('IE 12 - Edge'); 
      //error: No such interface supported 
      jQuery(w.document.body).append(jQuery(target).clone(true).html()); 

      //works 
      //jQuery(w.document.body).append('hey dude, this is some text'); 

      //works 
      //jQuery(w.document.body).html(jQuery(target).clone(true).html()); 

     } 
     else{ 
      //console.log('proper browser'); 
      jQuery(w.document.body).append(jQuery(target).clone(true)); 
      ie = false; 
     } 
    }); 
}); 

这仅仅是与微软边缘的问题,它适用于所有基于标准的浏览器和IE浏览器7,8,9,10和11类似的问题一直raised in this thread,但没有得到解决。

这里是展示什么是什么的jsfiddle:https://jsfiddle.net/switzerbaden/nhtywLsp/

回答

2

经过进一步调查,我发现,当你的HTML字符串产生多个顶级同级元素jQuery将创建一个DocumentFragment的。当Microsoft Edge尝试将documentFragment追加到第二个窗口时,问题就出现了。

现在,我鼓励您将HTML传递给append方法,该方法只产生一个顶级元素,并从两侧进行了空白裁剪。这样,我们保证jQuery不会尝试附加一个documentFragment,而是一个单独的元素。

Microsoft Edge发生了一个错误,并且jQuery团队已收到通知。


我是Microsoft Edge团队的一名工程师,我看到了您指的问题。我要提交的bug,并作进一步调查,但暂时,一个解决办法是只有一个子元素在你的目标,并修剪内容时附加:

<div id="my_target"> 
    <div> 
     <!-- move contents in here --> 
    </div> 
</div> 
$(w.document.body).append(
    // Or, "<div>" + $(target).html() + "</div>" 
    $.trim($(target).clone(true).html()) 
); 

经过一些粗略的测试后,这似乎可以解决问题。