昨天突然兴起,准备完善秋色园后台的编辑器关于Chrome、FireFox下的选择内容的HTML兼容处理。

JS编辑器获取选择内容的HTML兼容性写法问题描述:

对于如何获取选择的文本(包括Html标签),通常网络上的答案是:

var  deditor=document.getElementById('iframe名称').contentWindow;

IE:deditor.pos.htmlText,获得html内容。

其它浏览器:deditor.window.getSelection().toString(); 仅获取不包括html标签的文本。

问题:假充你给一段选择的文字(包括换行、段落格式化的),加一个背影或边框等操作时,如果html标签都失踪了,仅剩下文字,那就不是您想要的效果了。

既然知道了问题,如何解决JS兼容性

解决问题步骤一:网络搜索

本人并不善长js,深夜中,只能靠程序员的本能,百度或Google现搜现处理了。

然而这个互联网,稍为有点细活的代码,网络上总是难以搜寻,偶尔搜出来的,除了没有答案,另外就是通用性:

deditor.window.getSelection().toString()或deditor.window.getSelection().getRangeAt(0)。

类似的只能获取文字,可是,我要的是包括Html标签的文本,你本应该懂的。

解决问题步骤二:代码调试

在指定相关符合关键字不多的网页中, 找到一个特殊的功能:“Chrome“的脚本调试。

调试方法:工具 - 开发人员工具 - scripts - 选择要调试的js文件。

接下来就是左侧设置断点,右边的设置监控变量和控制下一步等。

很遗憾的是,虽然能调试,试了很多属性和方法,可是还是没发现Chorme下能获取 选择的内容的Html方式。

调试截图如下:

解决问题步骤三:重复网络搜索

一般比较有价值的代码,网上很少会直接出现,一方是开发人员比较舍不得,另一方面是大伙不太爱写文章。

因此,继续搜索,从各类不同的文章中,提取出可能有用的代码。

最后,不知在哪了,看到了一个:selection.getRangeAt(0).cloneContents().childNodes。

从正常的思维中,clone后再取子节点,和直接取子节点,有啥区别呢?可是就是有区别。

解决问题步骤四:重复的代码调试

继续调试,断点,监控变量及值,最后发现,通过克隆后取的子节点,可以取到outerHTML属性,于是问题比较明朗化,写个方法for一下组合。

function GetChormeInnerHTML(nodes)
    {
        var result='';

var node=null;
for (var i = 0; i < nodes.length; i++)
{
node=nodes[i];
if(node.outerHTML)
{
result+=node.outerHTML;
}
else if(node.nodeValue)
{
result+=node.nodeValue;
}
}

return result.replace("<div><br></div>","<br>");
    }

由于在Chorme下每次回车都产生"<div><br></div>“,于是去掉多余的标识。

浏览器兼容,不会让你太轻松

本来以为问题解决了,于是在firefox下试了一下,靠,这B的firefox,竟然不行。

于是使用Firfox,进行脚本调试,发现firefox下获得到子节点,根本没有outerHTML属性,太悲剧了,连这个都没有,问题又卡住了。

解决问题步骤五:持续的网络搜索

关键换成了firefox下的js选择html的相关内容及兼容写法,可惜,网络上都是迷惑人标题+没有答案的内容。

在经过N小时的头脑风暴和搜索体验之后,冷静了一下,B的,回去继续调试,看能不能发现新大陆。

解决问题步骤六:持续的调试代码

在Firfox下,调试各属性可能产生的值,及出来的值,明显的没有直接的答案。

最后发现,由于是节点,节点就是属性,标签名、内容文本够成的。

调试如下图:

解决问题步骤七:创新思维:无招剩有招,没有现成的,不要怕麻烦,一切从头组装

在发挥不怕麻烦的精神下,自己重新组合节点的outerHTML,再把所有节点的outerHTML拼接起来。

function GetFireFoxInnerHTML(nodes)
    {
        var result='';
        var node;
        for (var i = 0; i < nodes.length; i++)
        {
            node=nodes[i];
            if(node.nodeValue) //纯文本节点还原。
            {
                result+=node.nodeValue;
            }
            else if(node.tagName)
            {
                result+="<"+node.tagName;
                if(node.innerHTML)
                {
                    //属性还原。                    if(node.attributes && node.attributes.length>1)
                    {
                        for(var j=0;j<node.attributes.length-1;j++) //忽略最后一个,最后一个是FirFox自己的节点。                        {
                            result+=' '+node.attributes[j].name+"='"+node.attributes[j].value+"'";
                        }
                    }
                    result+=">"+node.innerHTML+"</"+node.tagName+">";
                }
                else
                {
                    result+=" />";
                }
                
            }
        }
        return result;

}

步骤八:花点时间,记录在案,分享成果,后续可查。

其它

这两三天,花了点功能,给秋色园的博客增加了论坛模式,简单切换皮肤就变成了论坛,省去了部署论坛的麻烦,还省了点服务器费用。

博客论坛模式示例:微博粉丝精灵 官网论坛示例,后续再考虑是否绑定BBS二级域名的SEO问题。

JS编辑器获取选择内容的HTML多浏览器兼容性写法(支持Chorme、Firefox)相关推荐

  1. wangEditor富文本编辑器获取html内容

    该示例为官方示例,代码仅供参考. 功能:获取html内容,目录结构如下: get-html.html <!DOCTYPE html> <html lang="en" ...

  2. JS 正则表达式获取匹配内容

    正则表达式中:g 表示的是全局模式匹配 正则表达式中:i 表示的是忽略大小写 正则表达式中:()表示的是分组,$1表示获取分组1中的内容 正则表达式中:[.match()]方法表示获取匹配内容 正则表 ...

  3. css设置背景透明 兼容,每日一更之CSS背景透明内容不透明及CSS兼容性写法

    有一个浏览器,让所有的前端极度痛恨,没错,就是IE.IE9以上版本的浏览器还好,但是,IE9及以下浏览器就相当的恶心,对于前端来说,最基本的就是还原UI设计图,但是当你使用一些CSS3属性的时候,IE ...

  4. js如何获取元素内容

    <script type="text/javascript"> window.onload = function(){ // 抓取元素 var box = docume ...

  5. H5中 JS 禁用安卓手机物理返回键 , 微信浏览器中也支持

    XBack = {};       (function(XBack) {         XBack.STATE = 'x - back';         XBack.element;        ...

  6. Winform中实现List<string>赋值给dataGridView与实现多选、全选和获取选择的内容

    场景 Winform中给DataGridView添加多选框列并获取选中行的内容: Winform中给DataGridView添加多选框列并获取选中行的内容_BADAO_LIUMANG_QIZHI的博客 ...

  7. gatsby_如何使用Gatsby.js来获取内容

    gatsby by Dimitri Ivashchuk 由Dimitri Ivashchuk 如何使用Gatsby.js来获取内容 (How to source content with Gatsby ...

  8. js 读取php页面内容,js读取html文件 js获取html页面显示内容

    CSS布局HTML小编今天和大家分享HTML或者JS读取TXT文件内容的代码 如题,CSS布局HTML小编今天和大家分享HTML或者JS读取TXT文件内容的代码 JS读取TXT文件内容的代码如下: 读 ...

  9. java去除html代码中含有的html、js、css标签,获取文字内容

    现在在做政府网站,网站里有很多公开信息和政务咨询的新闻,现在需要做新闻的RSS订阅功能,其中有一项是需要处理文章页的内容.我们后台添加编辑文章使用的是编辑器,文章内容会带有很多html标签和css样式 ...

最新文章

  1. 扩增子三部曲:1分析图表解读大全(箱线,散点,热,曼哈顿,火山,韦恩,三元,网络)...
  2. 关于多线程Thread.Stop()破坏原子性
  3. mapreduce value 排序_MapReduce知识点一
  4. JavaScript Onclick事件解释
  5. shell从oracle中获取变量,shell 如何读取环境变量的值
  6. MMdnn Visualizer网络可视化
  7. python中pip的安装与使用
  8. Keil5 software packs和legacy device database分类讲解
  9. Eclipse快速创建Bottom Up类型的Web Service服务端
  10. 除冰机行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  11. mysql 官方docker_用docker安装官方mysql
  12. Java Maps的9个常见问题
  13. 嵌入式Linux截图工具gsnap移植与分析【转】
  14. 2008 r2 server sql 中文版补丁_sql2008 sp4补丁
  15. 微软官网免费下载win10系统
  16. 小马哥----高仿苹果6S A236 刷机拆机主板图与开机界面图 更新解锁界面 全网通4G 警惕
  17. python画笛卡尔心形线_伊对:学霸如何谈恋爱?揭秘不同专业的学霸表白方式
  18. Gradle之task的使用
  19. 数据分析师八大能力之一:收集信息的能力
  20. Python模块查找路径

热门文章

  1. 微软开放技术发布开源 Jenkins 插件以将 Windows Azure Blob 服务用的开作存储库
  2. 【转载】一个通过JSONP跨域调用WCF REST服务的例子(以jQuery为例)
  3. squid代理简单应用
  4. php完全匹配,如何在PHP中使用正则表达式找到完全匹配的内容?
  5. 放弃吧,Hibernate 4直到4.3.0 Beta1还没有解决Proxool连接池不可用的问题
  6. DB2中sql语句占位符问题
  7. Python 网站应用从开发到部署
  8. 微信小程序横向(scroll x)滚动 scroll view
  9. Lapack求解线性方程组
  10. maven模块化分解项目