我正在尝试通过PHP的DOMDocument传递一个HTML块来重构<img>
元素内联:http://www.appelsiini.net/projects/lazyload
对于每个<img>
,我正在尝试插入重构的副本,然后将原始文件包装在<noscript>
标记中以获取非JS后备。
示例:
输入:
<img src="img/example.jpg" width="640" heigh="480">
输出:
<img class="lazy" src="img/grey.gif" data-original="img/example.jpg" width="640" heigh="480"><noscript><img src="img/example.jpg" width="640" heigh="480"></noscript>
我有包装工作,新元素也正确构造。问题是第二个appendChild
(下面)不起作用,我无法弄清楚原因。任何人都可以提供解决方案吗?
我有以下代码:
$noScript = $dom->createElement('noscript');
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
$src = $image->getAttribute('src');
$alt = $image->getAttribute('alt');
$title = $image->getAttribute('title');
$style = $image->getAttribute('style');
$newImage = $dom->createElement('img');
$newImage->setAttribute('class', 'lazy');
$newImage->setAttribute('data-original', $src);
$newImage->setAttribute('src', '/images/whitespace.gif');
if ($style) $newImage->setAttribute('style', $style);
if ($alt) $newImage->setAttribute('alt', $alt);
if ($title) $newImage->setAttribute('title', $title);
$noScriptClone = $noScript->cloneNode();
$image->parentNode->replaceChild($noScriptClone, $image);
$noScriptClone->appendChild($image);
$noScriptClone->parentNode->appendChild($newImage);
}
return $dom->saveHTMLExact();
答案 0 :(得分:0)
我确实解决了这个问题(以一种迂回的方式),但忘了发布我的解决方案 - 直到现在。
我最终使用了QueryPath,效果非常好。
function lazyLoadImages($source = '') {
$qp = htmlqp($source);
foreach ($qp->find('img') as $image) {
$src = $image->attr('src');
$alt = $image->attr('alt');
$title = $image->attr('title');
$style = $image->attr('style');
$class = $image->attr('class');
$image->wrap('<noscript/>')->parent('noscript')->after('<img src="/images/whitespace.gif" data-original="' . $src . '" style="' . trim($style) . '"' . ($alt ? ' alt="' . $alt . '"' : '') . ($title ? ' title="' . $title . '"' : '') . ' class="lazy' . ($class ? ' ' . $class : '') . '" />');
}
$content = preg_replace(array("/<\?xml.*?\?>/si", "/<\!DOCTYPE.*?>/", "!<(/)?body>!si", "!<(/)?html>!si"), '', $qp->writeSnippet());
return $content;
}