javascript - 如何检测字符串中的锚标记。两个都
问题描述
我正在尝试验证职位描述。我通过描述值字段查找任何锚标记。如果它们存在,我会抛出一个错误
get description() {
return this.form.get('description');
}
onSubmit() {
const desc = this.description.value;
const div = document.createElement('div');
div.innerHTML = desc;
const iterator = document.evaluate('//a', div, null, XPathResult.ANY_TYPE, null);
const anchors = iterator.iterateNext();
while (anchors) {
this.toastr.error("To better improve service, external links are not permitted.");
return false;
}
....
}
我的问题是当您复制并粘贴所见即所得中的值时,此代码有效。如果您手动执行此操作。该值如下所示
我需要使用 xpath 或任何东西来检测<a
相似的标签和 <a
类型模式。这可能吗?
这是我使用 domparser 的修订版。仍然没有运气
onSubmit() {
const desc = this.description.value;
const div = document.createElement('div');
div.innerHTML = desc;
const domparser = new DOMParser();
const parsedDiv = domparser.parseFromString(div.textContent, 'text/html');
const iterator = document.evaluate('//a', div, null, XPathResult.ANY_TYPE, null);
//Still Returns Null for iterator2
const iterator2 = document.evaluate('//a', parsedDiv, null, XPathResult.ANY_TYPE, null);
const anchors = iterator.iterateNext();
while (anchors) {
this.toastr.error("To better improve service, external links are not permitted.");
return false;
}
...
}
表单提交后 Redux 状态未更新
我在使用 Redux 更新状态时遇到了一些问题。我正在使用 redux-form 提交一些值,并且我的 action/reducer 可以正常工作。但是我的更新操作/减速器在提交表单后没有改变状态,我得到了相同的状态返回。这是我的 ReduxDevTools 的截图:
所以当提交表单时,我可以看到 addMovementForm 的值部分中更新了新值(movementWeight:'200')。但是当我的 UPDATE_MOVEMENT 动作被调用时,我仍然得到了我的原始值(movementWeight:'100')。我知道我做错了什么,但我不知道是什么。这是我的行动:
export const updateMovement = (id, formValues) => async dispatch => {
const response = await movements.patch(`/movements/${id}`, formValues);
const updateId = response.data.id;
dispatch({ type: constants.UPDATE_MOVEMENT, payload: { data: response.data, id: updateId } });
我的减速机:
const initialState = [];
const movementReducer = (state = initialState, action) => {
switch (action.type) {
case CREATE_MOVEMENT:
return [
...state, action.payload
];
case UPDATE_MOVEMENT:
return [ ...state.map(item => item.id === action.payload.id ? {...item, ...action.payload.data} : item)]
解决方案
也许以下内容会有所帮助,实现我的建议“如果您将 div 的 textContent 提供给另一个 HTML 解析步骤,parseContextualFragment
您当然可以在片段上运行 XPath 并检查元素”:Range
parseFromString(div.textContent, 'text/html')
DOMParser
const desc = `<p>This is an element with an escaped link <a href='http://example.com/'>example<a/>.<\/p>`;
const div = document.createElement('div');
div.innerHTML = desc;
const outerAElementSelection = document.evaluate('.//a', div, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
console.log(outerAElementSelection.singleNodeValue != null);
const innerDoc = new DOMParser().parseFromString(div.textContent, 'text/html');
const innerAElementSelection = innerDoc.evaluate('//a', innerDoc, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
console.log(innerAElementSelection.singleNodeValue != null);
推荐阅读
- mysql - 简化这个 MySQL 选择 - 我真的希望 concat_ws 产生 null
- css - 如何使用 Capybara 选择没有任何唯一值的 Web 元素
- python - 停用词在命令行上超过 2 行
- amazon-web-services - 数组 JSON 负载的 AWS IoT 规则查询语句
- c - 在 C 中的结构化列表中将标准输入作为文件读取时出现问题
- html - 一起编辑多个 HTML/Markdown 页面的建议。任何用于将多个页面编辑为表格的工具?
- javascript - 你能用 React-Admin 创建表单来存储信息吗?
- json - 以 .json 格式导出 Firestore 备份
- java - 将 ArrayList 转换为列表
给出 ClassCastException - javascript - 我可以使用内置的 fetch() 减少这个异步代码吗?
问题描述
我正在尝试验证职位描述。我通过描述值字段查找任何锚标记。如果它们存在,我会抛出一个错误
get description() {
return this.form.get('description');
}
onSubmit() {
const desc = this.description.value;
const div = document.createElement('div');
div.innerHTML = desc;
const iterator = document.evaluate('//a', div, null, XPathResult.ANY_TYPE, null);
const anchors = iterator.iterateNext();
while (anchors) {
this.toastr.error("To better improve service, external links are not permitted.");
return false;
}
....
}
我的问题是当您复制并粘贴所见即所得中的值时,此代码有效。如果您手动执行此操作。该值如下所示
我需要使用 xpath 或任何东西来检测<a
相似的标签和 <a
类型模式。这可能吗?
这是我使用 domparser 的修订版。仍然没有运气
onSubmit() {
const desc = this.description.value;
const div = document.createElement('div');
div.innerHTML = desc;
const domparser = new DOMParser();
const parsedDiv = domparser.parseFromString(div.textContent, 'text/html');
const iterator = document.evaluate('//a', div, null, XPathResult.ANY_TYPE, null);
//Still Returns Null for iterator2
const iterator2 = document.evaluate('//a', parsedDiv, null, XPathResult.ANY_TYPE, null);
const anchors = iterator.iterateNext();
while (anchors) {
this.toastr.error("To better improve service, external links are not permitted.");
return false;
}
...
}
我在使用 Redux 更新状态时遇到了一些问题。我正在使用 redux-form 提交一些值,并且我的 action/reducer 可以正常工作。但是我的更新操作/减速器在提交表单后没有改变状态,我得到了相同的状态返回。这是我的 ReduxDevTools 的截图: 所以当提交表单时,我可以看到 addMovementForm 的值部分中更新了新值(movementWeight:'200')。但是当我的 UPDATE_MOVEMENT 动作被调用时,我仍然得到了我的原始值(movementWeight:'100')。我知道我做错了什么,但我不知道是什么。这是我的行动:
export const updateMovement = (id, formValues) => async dispatch => {
const response = await movements.patch(`/movements/${id}`, formValues);
const updateId = response.data.id;
dispatch({ type: constants.UPDATE_MOVEMENT, payload: { data: response.data, id: updateId } });
我的减速机:
const initialState = [];
const movementReducer = (state = initialState, action) => {
switch (action.type) {
case CREATE_MOVEMENT:
return [
...state, action.payload
];
case UPDATE_MOVEMENT:
return [ ...state.map(item => item.id === action.payload.id ? {...item, ...action.payload.data} : item)]
也许以下内容会有所帮助,实现我的建议“如果您将 div 的 textContent 提供给另一个 HTML 解析步骤,parseContextualFragment
您当然可以在片段上运行 XPath 并检查元素”:Range
parseFromString(div.textContent, 'text/html')
DOMParser
const desc = `<p>This is an element with an escaped link <a href='http://example.com/'>example<a/>.<\/p>`;
const div = document.createElement('div');
div.innerHTML = desc;
const outerAElementSelection = document.evaluate('.//a', div, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
console.log(outerAElementSelection.singleNodeValue != null);
const innerDoc = new DOMParser().parseFromString(div.textContent, 'text/html');
const innerAElementSelection = innerDoc.evaluate('//a', innerDoc, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
console.log(innerAElementSelection.singleNodeValue != null);