【问题标题】:PHP appendChild giving nice fatal error -Uncaught exception 'DOMException' with message 'Hierarchy Request Error - how can I add html AFTER a tagPHP appendChild 给出了很好的致命错误 - 未捕获的异常 'DOMException' 和消息'层次请求错误 - 我如何在标签之后添加 html
【发布时间】:2012-07-12 06:09:11
【问题描述】:

在我的一段代码中,我尝试使用 PHP DOM 查找所有 img 标签,直接在之后添加另一个 img 标签,然后将所有这些标签包装在一个 div 中,即

<!-- From this... -->
<img src="originalImage.jpg" />

<!-- ...to this... -->
<div class="wrappingDiv">
    <img src="originalImage.jpg" />
    <img src="newImage.jpg" />
</div>

这是我正在 bastardising 尝试的 PHP:

$dom = new domDocument;
$dom->loadHTML($the_content_string);
$dom->preserveWhiteSpace = false;
    //get all images and chuck them in an array
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
            //create the surrounding div
    $div = $image->ownerDocument->createElement('div');
    $image->setAttribute('class','main-image');
        $added_a = $image->parentNode->insertBefore($div,$image);
        $added_a->setAttribute('class','theme-one');
        $added_a->appendChild($image);
            //create the second image
    $secondary_image = $image->ownerDocument->createElement('img');
    $added_img = $image->appendChild($secondary_image);
    $added_img->setAttribute('src', $twine_img_url);
    $added_img->setAttribute('class', $twine_class);
    $added_img->appendChild($image);
    }

echo $dom->saveHTML();

我创建 $add_img 变量之前的一切工作正常。好吧,至少它不会出错。是最后四行把它杀死了。

我显然在做一些相对愚蠢的事情......有没有可爱的人能指出我在哪里做的事情?

【问题讨论】:

    标签: php dom appendchild


    【解决方案1】:

    第一:

    您正在尝试将图像附加到此处的图像(但当然在 HTML 中,图像不能有子图像,将图像附加到 div):

    $added_img = $image->appendChild($secondary_image);
    

    应该是的

    $added_img = $added_a->appendChild($secondary_image);
    

    又在这里:

    $added_img->appendChild($image);
    

    必须是:

    $added_a->appendChild($image);
    

    但这根本行不通,因为 NodeList 是实时的。一旦你追加一个新图像,这个图像是 $images 的一部分,你将陷入无限循环。所以首先用初始图像填充一个数组,而不是使用 NodeList。

    $imageList= $dom->getElementsByTagName('img');
    $images=array();
    for($i=0;$i<$imageList->length;++$i)
    {
      $images[]=$imageList->item($i);
    }
    

    【讨论】:

    • 好的,所以只是为了让我自己清楚,你说我在我的代码中所做的是:
    • 好的,所以只是为了让我自己清楚,你说我在我的代码中做什么是这样的?: 基本上是把一张图片插入到另一张图片中,而不是仅仅在原始图片之后添加第二张图片?那正确吗?其次,您是说因为我将其重新分配给 $image,然后将其添加到 $images 数组中,并且基本上在图像中的图像中添加图像,并无限期地添加图像?只是想弄清楚,我讨厌没有正确理解事物!
    • 第一个假设是正确的。关于第二个:问题不是 $image-variable,问题是 $images。 $images 是对 NodeList 的引用,它是文档内所有&lt;img/&gt; 的实时集合。每次添加新图像(或删除图像)时,都会修改此 NodeList。所以在这种情况下:当您添加新图像时,下一个循环将访问新创建的图像。
    • 啊,我明白了,所以 $images 不是我分配 getElementsByTagName() 给它的特定时间点节点的快照,它是节点的实时视图和已更新,因为我直接影响它。更清楚,谢谢:) 所以我应该像你建议的那样为图像创建一个单独的数组,通过 for 循环运行它,然后使用 foreach ......好吧,我要试试,到目前为止谢谢!
    • 好的,太棒了,现在我到了某个地方!唯一的问题是第二个图像被添加为 div 的第一个子元素。有没有办法指定孩子在什么位置,或者我是否必须克隆原始图像标签,插入第二个图像,插入克隆的图像标签,然后删除原始图像,因为这听起来有点低效。 ..?
    猜你喜欢
    • 2013-04-26
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2015-01-04
    • 2023-03-05
    • 2013-07-07
    相关资源
    最近更新 更多