php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #77686 Removed elements are still returned by getElementById
Submitted: 2019-03-01 07:11 UTC Modified: -
Votes:1
Avg. Score:3.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: gtisza at gmail dot com Assigned:
Status: Open Package: DOM XML related
PHP Version: 7.3.2 OS:
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2019-03-01 07:11 UTC] gtisza at gmail dot com
Description:
------------
Removing a DOMElement from a HTML document does not refresh the id index; getElementById() will still return the removed element. (getElementsByTagName(), in contrast, works as expected.)
Live test: https://3v4l.org/UQYTG

Calling setIdAttribute() on the removed element apparently updates the index and fixes getElementById() behavior. It does not fix it for any children of the removed node, however.

Test script:
---------------
$doc = new DOMDocument;
$doc->loadHTML('<html><body id="x"><div id="y"></div></body></html>');
$body = $doc->getElementById('x');
$div = $doc->getElementById('y');
$doc->getElementById('y'); // <div id="y">


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2019-03-01 22:14 UTC] bd808@php.net
Corrected test script including the DOM removal:
---------------
$doc = new DOMDocument;
$doc->loadHTML('<html><body id="x"><div id="y"></div></body></html>');
$body = $doc->getElementById('x');
$div = $doc->getElementById('y');
$body->removeChild($div);
$doc->getElementById('y'); // <div id="y">
 [2019-03-04 06:47 UTC] gtisza at gmail dot com
Apparently the id is only unindexed when the element is destroyed, not when it is detached from the document: https://3v4l.org/61Hbv (thanks to Ori Livneh for tracking that down). So not that easy to run into this bug as typically no reference is retained to a detached element, once the variable used for detaching goes out of scope.
 [2019-03-04 07:16 UTC] gtisza at gmail dot com
Also it seems certain method calls refresh the index (setIdAttribute, specifically): https://3v4l.org/kk8iv
Only for a single element, though, not the subtree of the element.
 
PHP Copyright © 2001-2019 The PHP Group
All rights reserved.
Last updated: Sat Apr 20 04:01:25 2019 UTC