草庐IT

javascript - 删除自动添加的 xmlns 属性

coder 2024-06-30 原文

我正在尝试在 Javascript 中执行一个简单的搜索和突出显示功能搜索一段文本。 XHTML出现那段文本的标签也作为参数给出,以提供额外帮助来定位该文本。

我正在测试此功能的 XHTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta content="application/xml+xhtml;charset=UTF-8" />
<script src="searcher.js" type="text/javascript"></script>
<script src="jquery-2.0.2.min.js"> </script>
<title>Building your resume</title>
</head>
<body id="highlightbegin">
<h1>Building your resume</h1>

<div> <input name="input" type="button" value="Highlight3" onclick="javascript:searcher('&lt;h1&gt;','Building your resume', '&lt;h1&gt;Building your resume', 'resume');" /> </div>

</body>
</html>  

searcher.js 中的函数搜索器:

function searcher(tag, text, tagText, word) {

    //simple search.
    console.info(word + " to be searched for in " + text + " with tag text = " + tagText);

    //get old html.
    var oldHTML = document.getElementById("highlightbegin").innerHTML;

    //get regexp.
    var regexp = new RegExp(tagText, 'g');

    var match = oldHTML.match(regexp);
    console.info(text + " found " + match.length + " times.");
}  

但是,执行 RegExp , 匹配返回 null .进一步调查显示标签 <h1>Building your resume</h1>变成 <h1 xmlns="http://www.w3.org/1999/xhtml">Building your resume</h1>这会导致 match函数返回 null .我的问题:

  1. 为什么是xmlns属性自动添加?
  2. 有没有办法阻止添加该属性?
  3. 该属性将添加到哪些标签?假设它将添加到每个标签是否安全?
  4. 这是浏览器特有的问题还是所有浏览器都会出现这种行为?

编辑:
一个观察:
1. 如果我添加 xmlns属性为 body使用 outerHTML 标记和访问所有内容( var oldHTML = document.getElementById("highlightbegin").outerHTML; ),它的子元素没有 xmlns属性。
我的问题:
1. outerHTML 元素是否可以编辑(使用 Javascript )和替换?
2. 上面的观察是一致的(每次调用 outerHTML 时看到)还是依赖于实现?
3. 是Javascript吗添加了 xmlns属性自动还是浏览器?

最佳答案

Why is the xmlns attribute added automatically?

因为如果不这样做,标记就不会代表 DOM 中元素的命名空间,在这种情况下,如果您将字符串写回到 DOM,元素将不再被浏览器解释为HTML 元素,您的页面将会中断。

Is there a way to prevent the attribute from being added?

如果您使用的是 XMLDocument,则不适用于 innerHTML,看起来您就是这样。如果需要,您可以通过遍历 DOM 创建自己的序列化程序。

What tags will that attribute be added to? Is it safe to assume that it will be 
added to every tag?

至少每个开始标记都是您调用 innerHTML 的元素的顶级子元素,假设该子元素不在 null namespace 中。加上与其父元素不同命名空间中的任何后代元素的开始标记。如果浏览器选择这样做,将它添加到所有开始标记中并没有错。

Is this a browser-specific issue or can this behavior be expected in all browsers?

使用 innerHTML 序列化 DOM 传统上因浏览器而异。尽管浏览器应该始终如一地这样做,但我不会依赖它。

1. Can the outerHTML element be edited (with Javascript) and replaced?

理论上可以,但无济于事。您必须用 null 命名空间中的元素替换该元素以停止该属性出现在外部元素上,这只会导致 outerHTML 将该属性添加到子元素(因为它们将具有与其父元素不同的命名空间).

2. Is the observation above consistent (seen each time outerHTML is invoked) or is 
   it implementation dependent?

出于与 innerHTML 相同的原因,序列化在某些地方必须添加属性以便字符串可以成功读回,而在某些地方可能 被添加到浏览器想要的地方。不能保证它会一致。

3. Is it Javascript that adds the xmlns attribute automatically or the browser?

这是浏览器将 DOM 序列化为字符串的内置过程。该属性通常不在 DOM 中的元素上(<html> 元素是正常的异常(exception)),它被添加到浏览器认为必要的任何地方,因为它被转换为字符串。

更一般地说,这就是专家们试图阻止尝试使用正则表达式处理 HTML 标记的原因之一。即使使用 HTML 而不是 XHTML,无需担心命名空间业务,在字符串和 DOM 形式之间的转换期间,可以添加和删除属性,并且可以以任意方式更改它们的顺序,并且不能保证两者之间的一致性浏览器品牌,甚至同一浏览器品牌的连续版本。

关于javascript - 删除自动添加的 xmlns 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18766291/

有关javascript - 删除自动添加的 xmlns 属性的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  5. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  6. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  7. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  8. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  9. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  10. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

随机推荐