I\'m using http://alexgorbatchev.com/SyntaxHighlighter/ to highlight code on my website but sometimes in my log im getting Javascript errors like this :
Why dont you use jquery:
$("#element_id").remove();
I had to deal with the same issue, and the answer is confusing and counter intuitive. Well, it has its logic, but leads to non-trivial behaviours.
Essentially, when a node is removed from the DOM tree, it fires a blur
event (and before a focusout
event too).
So, when you call removeChild
, the blur
event is fired again, but this time textarea
still has its parentNode
defined, but textarea
isn't among its parent's children anymore! (Yes, read this twice. Or more.)
This happens in Chrome for now, although Firefox has planned to do the same for quite some time.
As a workaround, you can remove the event listener you attached:
var onblur = function(e) {
detachEvent(textarea, 'blur', onblur);
textarea.parentNode.removeChild(textarea);
removeClass(highlighterDiv, 'source');
};
attachEvent(textarea, 'blur', onblur);
I'm assuming that you have some detachEvent
function to remove event listeners. Adjust the code to your needs.
Alternatively, you can set a flag (like a property, or an attribute, or better a scoped variable) on the textarea in the listener function, and check for it before proceeding with the node removal:
var removed = false;
attachEvent(textarea, 'blur', function(e) {
if (removed) return;
removed = true;
textarea.parentNode.removeChild(textarea);
removeClass(highlighterDiv, 'source');
});
You can also check if textarea
if actually a child node of its parentNode
before removing it, but such test is so counter-intuitive (at least to me) that I wouldn't recommend doing that, in fear that this behaviour will be changed in the future.
Finally, you can always rely on a try...catch
statement, but... ugh.
Naturally, using a framework like jQuery would save you a lot of work attaching event listeners with one
, but this functionality will come to standard addEventListener too:
textarea.addEventListener('blur', handler, { once: true });
I'm going out on a limb here and assuming that some of you who find this question are here because you googled the error quoted above:
'removeChild' on 'Node': The node to be removed is no longer a child of this node. Perhaps it was moved in a 'blur' event handler?
I'm using jQuery & DataTables 1.10.6 and this error was indeed coming up on a blur()
event where I was updating the cell value. The solution for me was to add a condition inside the event like this:
var blur = false;
$('table').on('blur', 'td select', function() {
if (!blur) {
blur = true;
var cell = $(this).closest('td');
table.cell(cell).data('example data');
blur = false;
}
});
I would be very surprised if there weren't a much better solution but hopefully this helps someone and maybe garners some constructive comments.
While the classic answer for this question was that it's a bug in the JS code, with React 16 there is a major bug which means that any browser/extension mechanism which modifies the DOM breaks React.
Google Chrome's built in Translate functionality is the most common culprit.
GitHub issue: https://github.com/facebook/react/issues/11538
Minimal case: https://p93xxmr0rq.codesandbox.io/ (just manually right click "Translate to" in Chrome and select from Japanese then click the button)
Workaround: How to disable google translate from html in chrome
<meta name="google" content="notranslate">
I use Time delay and it work for me like this.
// set up handler for lost focus attachEvent(textarea, 'blur', function(e) { setTimeout(function() { textarea.parentNode.removeChild(textarea); removeClass(highlighterDiv, 'source'); }, 0); });
you need to check each time the method is executed whether the element is a child of the given parent.
if(box.parentElement === parentBox) {
parentBox.removeChild(box);
}