{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/javascript-handbook/drag-and-drop/","webpackCompilationHash":"a3ac22c47fe06e2afd02","result":{"data":{"markdownRemark":{"id":"e898961e-f929-5433-9a7b-eb3aced504a3","html":"<p>Heute wies mich ein Leser darauf hin, dass es bei dem Drag&#x26;Drop-Beispiel aus Listing 12.43 (HTML) und Listing 12.44 (JavaScript) in Firefox Probleme gibt bzw. folgender Code so nicht funktioniert:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">target<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'drop'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> <span class=\"token string\">'target'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// Funktioniert nicht in Firefox</span>\n        event<span class=\"token punctuation\">.</span>srcElement<span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">+=</span> event<span class=\"token punctuation\">.</span>dataTransfer<span class=\"token punctuation\">.</span><span class=\"token function\">getData</span><span class=\"token punctuation\">(</span><span class=\"token string\">'text/html'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token function\">onLeave</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<!-- more -->\n<p>Der Grund dafür ist, dass die Eigenschaft <code class=\"language-text\">srcElement</code> eine <a href=\"https://msdn.microsoft.com/en-us/library/ms534638.aspx\">proprietäre Eigenschaft</a> des Internet Explorers ist und daher nicht von allen Browsern unterstützt wird. Stattdessen sollte (wie im übrigen Listing auch) die Eigenschaft <code class=\"language-text\">target</code> aus dem <a href=\"https://dom.spec.whatwg.org/#dom-event-target\">DOM Standard</a> verwendet werden:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">target<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'drop'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> <span class=\"token string\">'target'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// Funktioniert in Firefox und anderen Browsern</span>\n        event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">+=</span> event<span class=\"token punctuation\">.</span>dataTransfer<span class=\"token punctuation\">.</span><span class=\"token function\">getData</span><span class=\"token punctuation\">(</span><span class=\"token string\">'text/html'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token function\">onLeave</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Alternativ lässt sich als Fallback für ältere Internet Explorer auch die Schreibweise <code class=\"language-text\">event.target || event.srcElement</code> verwenden.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">target<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'drop'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> targetElement <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target <span class=\"token operator\">||</span> event<span class=\"token punctuation\">.</span>srcElement<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>targetElement<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> <span class=\"token string\">'target'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        targetElement<span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">+=</span> event<span class=\"token punctuation\">.</span>dataTransfer<span class=\"token punctuation\">.</span><span class=\"token function\">getData</span><span class=\"token punctuation\">(</span><span class=\"token string\">'text/html'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token function\">onLeave</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Konsequenterweise ist es dann sinnvoll, entsprechendes Konstrukt auch in den anderen Event-Listenern zu verwenden:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">target<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'dragenter'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> targetElement <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target <span class=\"token operator\">||</span> event<span class=\"token punctuation\">.</span>srcElement<span class=\"token punctuation\">;</span>\n    targetElement<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">'dragover'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">onLeave</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> targetElement <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target <span class=\"token operator\">||</span> event<span class=\"token punctuation\">.</span>srcElement<span class=\"token punctuation\">;</span>\n    targetElement<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"dragover\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<hr>\n<p><strong>Merke</strong></p>\n<p>Die Eigenschaft <code class=\"language-text\">srcElement</code> ist nicht im DOM Standard definiert und sollte daher nicht bzw. wenn dann nur als Fallback in Produktivsystemen verwendet werden.</p>\n<hr>","fields":{"slug":"/posts/javascript-handbook/drag-and-drop/","tagSlugs":["/tag/java-script/","/tag/web-ap-is/","/tag/errata/"]},"frontmatter":{"date":"2017-04-12T16:50:00.000Z","description":"","tags":["JavaScript","Web APIs","Errata"],"title":"Drag&Drop-Beispiel in Firefox"}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/posts/javascript-handbook/drag-and-drop/"}}}