phpgt / dom
现代DOM API。
v4.1.6
2023-12-31 11:26 UTC
Requires
- php: >=8.1
- ext-dom: *
- ext-libxml: *
- ext-mbstring: *
- phpgt/cssxpath: ^1.1
- phpgt/propfunc: ^1.0
- psr/http-message: ^1.0 || ^2.0
Requires (Dev)
- phpmd/phpmd: ^2.13
- phpstan/phpstan: ^1.9
- phpunit/phpunit: ^10.4
- squizlabs/php_codesniffer: ^3.7
- dev-master
- v4.1.6
- v4.1.5
- v4.1.4
- v4.1.3
- v4.1.2
- v4.1.1
- v4.1.0
- v4.0.3
- v4.0.2
- v4.0.1
- v4.0.0
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- v3.0.0-RC2
- v3.0.0-RC1
- v2.2.4
- v2.2.3
- v2.2.1
- v2.2.0
- v2.1.6
- v2.1.5
- v2.1.4
- v2.1.3
- v2.1.2
- v2.1.1
- v2.1.0
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- v0.4.0
- v0.3.2
- v0.3.1
- v0.3.0
- v0.2.1
- v0.2.0
- v0.1.2
- v0.1.1
- v0.1.0
- v0.0.3
- v0.0.2
- v0.0.1
- dev-test-cssxpath
- dev-allowdynamicproperties
- dev-ci-update
- dev-v2-dev
- dev-name-field-select
This package is auto-updated.
Last update: 2024-08-25 17:05:47 UTC
README
现代DOM API。
该项目建立在PHP的本地DOMDocument之上,提供对现代DOM API的访问,就像在浏览器中处理客户端代码一样。
在服务器端代码中执行DOM操作可以增强动态页面构建的方式。利用标准化的面向对象接口意味着页面可以预先处理,从而有利于浏览器、Web服务器和内容分发网络。
示例用法:你好,你!
重要提示:这里显示的示例仅用于说明目的,但使用DOM直接将数据设置为元素的值会紧密耦合逻辑和视图,这被认为是不良的做法。请参阅DomTemplate库以获取绑定数据到DOM的更健壮的解决方案。
考虑一个包含用于输入姓名的输入元素的表单。当表单提交时,页面应该通过您的名字来问候您。
这是一个简单示例,说明如何将源HTML文件视为模板。这可以轻松应用于更高级的模板页面,以提供动态内容,而无需使用非标准的占位符技术,如{{花括号}}
或从PHP内部进行HTML构造的错误高风险方法echo '<div class='easy-mistake'>' . $content['opa'] . '</div>'
。
源HTML(name.html
)
<!doctype html> <h1> Hello, <span class="name-output">you</span> ! </h1> <form> <input name="name" placeholder="Your name, please" required /> <button>Submit</button> </form>
PHP用于注入您的姓名(index.php
)
<?php use Gt\Dom\HTMLDocument; use Gt\Dom\HTMLElement\HTMLSpanElement; require "vendor/autoload.php"; $html = file_get_contents("name.html"); $document = new HTMLDocument($html); if(isset($_GET["name"])) { $span = $document->querySelector(".name-output"); $span->innerText = $_GET["name"]; } echo $document;
快速特性
- 兼容W3C的DOM Living Standard
Element
类型代表所有HTMLElement
规范,如HTMLAnchorElement
(<a>
)、HTMLButtonElement
(<button>
)、HTMLInputElement
(<input>
)、HTMLTableSectionElement
(<thead>
、<tbody>
、<tfoot>
)等。可以使用Element::getElementType()
检测特定类型,该方法返回ElementType
枚举值之一。- 扩展
DOMException
以捕获不同类型的异常,例如EnumeratedValueException
、HierarchyRequestError
、IndexSizeException
等。 - 模拟客户端功能,包括
FileList
、StyleSheet
、VideoTrackList
、WindowProxy
等类。
- DOM级别4+功能
- 通过
Element::querySelector()
和Element::querySelectorAll()
使用CSS选择器引用元素 - 使用
ClassList
添加/删除/切换元素的类 - 使用
Element::previousElementSibling
、Element::nextElementSibling
、Element::children
和Element::lastElementChild
以及firstElementChild
等遍历仅Element节点 - 使用
ChildNode::remove()
、ChildNode::before
、ChildNode::after
、ChildNode::replaceWith()
插入和删除子节点。
- 通过
- HTMLDocument 上的标准属性
已知限制 / W3C 规范兼容性
此存储库旨在尽可能准确地实现 https://dom.spec.whatwg.org/ 中的 DOM 规范 - 到 v4.0.0 版本为止,所有功能都已实现,但与标准存在以下不可避免的微小偏差
- 元素的
tagName
属性是大写。 - 要检查
HTMLElement
类型,必须调用Element::getElementType()
- 没有可用作instanceof
的Element
的子类,例如。 - DOM 规范定义了只能在客户端实现的功能。例如,
HTMLInputElement::files
返回一个包含用户通过浏览器界面选择的全部文件的FileList
。这种功能在服务器端无法实现,但已被实现以保持与规范的兼容性。尝试在此库中使用客户端功能将抛出ClientSideOnlyFunctionalityException
。
数据绑定和页面模板功能
此存储库旨在尽可能准确地实现 DOM 规范。在 https://php.gt/domtemplate 上有一个存储库扩展,它通过自定义元素和模板属性添加页面模板和数据绑定功能,引入了类似 WebComponents 的服务器端功能。