質問するログイン新規登録

回答編集履歴

1

解決策を追加

2018/04/20 10:02

投稿

defghi1977
defghi1977

スコア4756

answer CHANGED
@@ -1,3 +1,61 @@
1
1
  jQueryは`window.document`を`HTMLDocument`オブジェクトであると仮定して動作するため, `SVGDocument`ベースの環境(つまりSVG文書)では正しく動作しません.
2
2
 
3
- 代替案としては`foreignObject`要素配下にjQueryを用いた通常のHTMLページを表示する`iframe`要素を仕込んでおくのは如何でしょうか?
3
+ 代替案としては`foreignObject`要素配下にjQueryを用いた通常のHTMLページを表示する`iframe`要素を仕込んでおくのは如何でしょうか?
4
+
5
+ ---
6
+
7
+ 一度不可能と啖呵を切ってしまった手前, いろいろ考えた結果`iframe`の中身を`document.write`で動的に書き換えるようにすれば何とかなるかもしれません.
8
+
9
+ ※とは言え動作は不安定ですから動作検証は慎重に行なって下さい.
10
+ (うろ覚えですが, ふとしたタイミングで`iframe`の中身が真っ白となるかもしれません)
11
+
12
+ ```XML
13
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
14
+ <metadata id="source"><![CDATA[
15
+ <!DOCTYPE html>
16
+ <html lang="ja">
17
+ <head>
18
+ <meta charset="UTF-8">
19
+ <link rel="stylesheet" href="https://cdn.datatables.net/t/bs-3.3.6/jqc-1.12.0,dt-1.10.11/datatables.min.css"/>
20
+ <script src="https://cdn.datatables.net/t/bs-3.3.6/jqc-1.12.0,dt-1.10.11/datatables.min.js"></script>
21
+ <script>
22
+ jQuery(function($){
23
+ $("#foo-table").DataTable();
24
+ });
25
+ </script>
26
+ <title></title>
27
+ </head>
28
+ <body>
29
+ <table id="foo-table" class="table table-bordered">
30
+ <thead>
31
+ <tr><th>No</th><th>くだもの</th></tr>
32
+ </thead>
33
+ <tbody>
34
+ <tr><td>1</td><td>りんご</td></tr>
35
+ <tr><td>2</td><td>みかん</td></tr>
36
+ <tr><td>3</td><td>ぶどう</td></tr>
37
+ </tbody>
38
+ </table>
39
+ </body>
40
+ </html>
41
+ ]]></metadata>
42
+ <foreignObject width="80%" height="80%">
43
+ <html xmlns="http://www.w3.org/1999/xhtml">
44
+ <body xmlns="http://www.w3.org/1999/xhtml">
45
+ <iframe id="iframe" width="100%" height="100%" style="border:none;"></iframe>
46
+ </body>
47
+ </html>
48
+ </foreignObject>
49
+ <script><![CDATA[
50
+ {
51
+ const html = document.querySelector("#source");
52
+ const iframe = document.querySelector("#iframe");
53
+ const doc = iframe.contentDocument;
54
+ doc.open();
55
+ doc.write(document.querySelector("#source").textContent);
56
+ doc.close();
57
+ }
58
+ ]]></script>
59
+ </svg>
60
+
61
+ ```