网页页面汉语本诵读作用开发设计完成共享


网页页面汉语本诵读作用开发设计完成共享


前几日进行了1个要求,在网页页面中进行电脑鼠标指向哪里,就术语音读取所指的文字。假如是按钮、连接、文字键入框,则还还要得出是甚么的提示。另外对于大段的文字,不可以整段的去读,要依照标点标记开展断句解决。

关键自然便是先获得到当今标识上的文字,再把文字转换成视频语音便可。

标识诵读

这个很简易了,只用依据当今是甚么标识,得出提醒便可。

// 标识诵读文字

var tagTextConfig = {

'a': '连接',

'input[text]': '文字键入框',

'input[password]': '登陆密码键入框',

'button': '按钮',

'img': '照片'

};

也有必须诵读的标识,再次再加上便可。

随后依据标识,回到前缀文字便可。

/**

* 获得标识诵读文字

* @param {HTMLElement} el 要解决的HTMLElement

* @returns {String} 诵读文字

*/

function getTagText(el) {

if (!el) return '';

var tagName = el.tagName.toLowerCase();

// 解决input等多特性元素

switch (tagName) {

case 'input':

tagName += '[' + el.type + ']';

break;

default:

break;

}

// 标识的作用提示和功效应当有间距,因而在最终添加1个空格

return (tagTextConfig[tagName] || '') + ' ';

}

获得详细的诵读文字就更简易了,先取标识的作用提示,再取标识的文字便可。

文字內容优先选择取 title 其次 alt 最终 innerText。

/**

* 获得详细诵读文字

* @param {HTMLElement} el 要解决的HTMLElement

* @returns {String} 诵读文字

*/

function getText(el) {

if (!el) return '';

return getTagText(el) + (el.title || el.alt || el.innerText || '');

}

这样便可以获得到1个标识的作用提示和內容的所有带诵读文字了。

文章正文隔开

接下来要解决的便是文章正文隔开了,在这个全过程中,踩了很多坑,走了很多弯路,好好纪录1下。

最先提前准备了文章正文隔开的配备:

// 文章正文拆分派置

var splitConfig = {

// 內容分段标识名字

unitTag: 'p',

// 文章正文中分刘海隔正则表达式表述式

splitReg: /[,;,;。]/g,

// 包裹标识名

wrapTag: 'label',

// 包裹标识类名

wrapCls: 'speak-lable',

// 高亮度款式名和款式

hightlightCls: 'speak-help-hightlight',

hightStyle: 'background: #000!important; color: #fff!important'

};

最初想的便是立即依照文章正文中的隔开标点标记开展隔开就行了呀。

念头以下:

获得段落所有文字

应用 split(隔开正则表达式表述式) 方式将文章正文依照标点标记隔开成小段

每一个小段用标识包裹放回去便可

但是理想化很丰腴,实际很骨感。

两个大坑以下:

split 方式开展隔开,隔开后隔开标识符就丢了,也便是说把原文的1些标点标记给弄丢了。

假如段落内还存在别的标识,而这个标识內部也恰好存在待隔开的标点标记,那包裹分段标识时立即破换了原标识的详细性。

有关第1个难题,遗失标点的标记,考虑到过逐一标点来开展和更换 split 隔开方式为逐一标识符循环系统来做。

前者难题是本来1次进行的工作中分为了数次,高效率太低。第2种觉得高效率更低了,隔开原本是很稀少的,可是却要变为逐一标识符出分辨解决,更重要的是,隔开标点的部位要插进包裹标识,会致使标识符串长度转变,还要解决下标数据库索引。编码是设备跑的,也许不容易感觉烦,可是我真的感觉好烦。假如这么干,也许之后哪一个AI或朋友看到这样的编码,说不确定会说 这简直个傻xxxx 。

第2个难题想过许多方法来补救,如先应用正则表达式配对捕捉內容中成对的标识,对标识內部的隔开先解决1遍,随后再解决全部的。

想不搞清楚难题2的,可参照1下待隔开的段落:

这是1段检测文字,这里有个连接。也有别的內容别的內容容别的內容容别的內容,容别的內容。

 

如先应用/ ((\w+?) )(.+?) \/\2(?= )/g 正则表达式,先后捕捉段落内被标识包裹的內容,对标识內部的內容先解决。

可是难题又来了,这么解决的全是标识符串,在js中全是基础种类,这些实际操作开展的情况下全是在拷贝的基本勤奋行的,要改动到原标识符串里去,还得纪录下本来的刚开始完毕部位,再将新的插到去。繁,還是繁,可是早已比以前逐一标识符去遍历的好,正则表达式捕捉中原本就有了配对的数据库索引,立即用便可,还能接纳。

可是这只是解决了段落內部标识的难题,段落内毫无疑问也有许多文字是沒有解决呢,如何办?

正则表达式配对到了只是段落内标识的結果啊,外面的沒有啊。哦,对,有配对到的数据库索引,之前配对到的部位再加之前解决的长度,便是1段立即文字的刚开始。下1次配对到的数据库索引⑴便是这段立即文字的完毕。这只是配对全过程中的,也有首尾要独立解决。又返回烦的老路上去了。。。

这么烦,1个段落隔开能这么繁琐,我不信!

忽然想起了,有文字连接点这么个物品,删繁就简嘛,正则表达式先到旁边去,立即解决段落的全部连接点不就可以了。

文字连接点则隔开立即包裹,标识连接点则对內容开展包裹,这类状况下解决的立即是dom,更方便。

文字连接点里放标识?这是在玩笑么,是也并不是。文字连接点里的确只能放文字,可是我把标识立即放进去,它会全自动转义,那最终再更换出来不就可以了。

好了,计划方案终究有了,并且这个计划方案逻辑性多简易,编码逻辑性当然也不容易烦。

/**

* 文章正文內容分段解决

* @param {jQueryObject/HTMLElement/String} $content 要解决的文章正文jQ目标或HTMLElement或其对应挑选器

*/

function splitConent($content) {

$content = $($content);

$content.find(splitConfig.unitTag).each(function (index, item) {

var $item = $(item),

text = $.trim($item.text());

if (!text) return;

var nodes = $item[0].childNodes;

$.each(nodes, function (i, node) {

switch (node.nodeType) {

case 3:

// text 连接点

// 因为是文字连接点,标识被转义了,后续再转回家

node.data = ' ' + splitConfig.wrapTag + ' ' +

node.data.replace(splitConfig.splitReg, '$ ' + splitConfig.wrapTag + ' ') +

'';

break;

case 1:

// 元素连接点

var innerHtml = node.innerHTML,

start = '',

end = '';

// 假如內部也有立即标识,先去掉

var startResult = /^ \w+? /.exec(innerHtml);

if (startResult) {

start = startResult[0];

innerHtml = innerHtml.substr(start.length);

}

var endResult = / \/\w+? $/.exec(innerHtml);

if (endResult) {

end = endResult[0];

innerHtml = innerHtml.substring(0, endResult.index);

}

// 升级內部內容

node.innerHTML = start +

' ' + splitConfig.wrapTag + ' ' +

innerHtml.replace(splitConfig.splitReg, '$ ' + splitConfig.wrapTag + ' ') +

'' +

end;

break;

default:

break;

}

});

// 解决文字连接点中被转义的html标识

$item[0].innerHTML = $item[0].innerHTML

.replace(new RegExp(' ' + splitConfig.wrapTag + ' ', 'g'), ' ' + splitConfig.wrapTag + ' ')

.replace(new RegExp(' /' + splitConfig.wrapTag + ' ', 'g'), '');

$item.find(splitConfig.wrapTag).addClass(splitConfig.wrapCls);

});

}

上面编码中最终对文字连接点中被转义的包裹标识更换好像有点不便,可是没法,ES5以前JavaScript其实不适用正则表达式的后行断言(也便是正则表达式表述式中 后顾 )。因此没法对包裹标识前后左右的 和 开展精确更换,只能连同标识名1起更换。

恶性事件解决

在上面进行了文字获得和段落隔开,下面要做的便是电脑鼠标挪动上去时获得文字开启诵读便可,移开时终止诵读便可。

电脑鼠标挪动,写保护1次,根据这两点缘故,应用 mouseenter 和 mouseleave 恶性事件来进行。

缘故:

不冒泡,不容易开启父元素的再度诵读

不反复开启,1个元素内挪动时不容易反复开启。

/**

* 在网页页面上写入高亮度款式

*/

function createStyle() {

if (document.getElementById('speak-light-style')) return;

var style = document.createElement('style');

style.id = 'speak-light-style';

style.innerText = '.' + splitConfig.hightlightCls + '{' + splitConfig.hightStyle + '}';

document.getElementsByTagName('head')[0].appendChild(style);

}

// 非文章正文必须诵读的标识 逗号隔开

var speakTags = 'a, p, span, h1, h2, h3, h4, h5, h6, img, input, button';

$(document).on('mouseenter.speak-help', speakTags, function (e) {

var $target = $(e.target);

// 清除段落内的

if ($target.parents('.' + splitConfig.wrapCls).length || $target.find('.' + splitConfig.wrapCls).length) {

return;

}

// 照片款式独立解决 别的款式统1解决

if (e.target.nodeName.toLowerCase() === 'img') {

$target.css({

border: '2px solid #000'

});

} else {

$target.addClass(splitConfig.hightlightCls);

}

// 刚开始诵读

speakText(getText(e.target));

}).on('mouseleave.speak-help', speakTags, function (e) {

var $target = $(e.target);

if ($target.find('.' + splitConfig.wrapCls).length) {

return;

}

// 照片款式

if (e.target.nodeName.toLowerCase() === 'img') {

$target.css({

border: 'none'

});

} else {

$target.removeClass(splitConfig.hightlightCls);

}

// 终止视频语音

stopSpeak();

});

// 段落内文字诵读

$(document).on('mouseenter.speak-help', '.' + splitConfig.wrapCls, function (e) {

$(this).addClass(splitConfig.hightlightCls);

// 刚开始诵读

speakText(getText(this));

}).on('mouseleave.speak-help', '.' + splitConfig.wrapCls, function (e) {

$(this).removeClass(splitConfig.hightlightCls);

// 终止视频语音

stopSpeak();

});

留意要把对于段落的视频语音解决和别的地区的分开。为何? 由于段落是个块级元素,电脑鼠标移入段落中的空白时,如:段落前后左右空白、首行缩进、末行剩下空白等,是不可该开启诵读的,假如不阻拦掉,开展这些地区将立即开启整段文本的诵读,丧失了大家对段落文字内隔开的实际意义,并且,不管甚么方法转换视频语音全是要時间的,大段內容将会必须较长期,危害视频语音輸出的体验。

文字生成视频语音

上面大家是立即应用了 speakText(text) 和 stopSpeak() 两个方式来开启视频语音的诵读和终止。

大家看来下怎样完成这个两个作用。

实际上当代访问器默认设置早已出示了上面作用:

var speechSU = new window.SpeechSynthesisUtterance();

speechSU.text = '你好,全球!';

window.speechSynthesis.speak(speechSU);

拷贝到访问器操纵台看看能不可以听到响声呢?(必须Chrome 33+、Firefox 49+ 或 IE-Edge)

运用1下两个API便可:

SpeechSynthesisUtterance 用于视频语音生成

lang : 語言 Gets and sets the language of the utterance.

pitch : 音高 Gets and sets the pitch at which the utterance will be spoken at.

rate : 语速 Gets and sets the speed at which the utterance will be spoken at.

text : 文字 Gets and sets the text that will be synthesised when the utterance is spoken.

voice : 响声 Gets and sets the voice that will be used to speak the utterance.

volume : 声音 Gets and sets the volume that the utterance will be spoken at.

onboundary : 单词或语句界限开启,即隔开处开启 Fired when the spoken utterance reaches a word or sentence boundary.

onend : 完毕时开启 Fired when the utterance has finished being spoken.

onerror : 不正确时开启 Fired when an error ours that prevents the utterance from being suesfully spoken.

onmark : Fired when the spoken utterance reaches a named SSML "mark" tag.

onpause : 中止时开启 Fired when the utterance is paused part way through.

onresume : 再次播发时开启 Fired when a paused utterance is resumed.

onstart : 刚开始时开启 Fired when the utterance has begun to be spoken.

SpeechSynthesis : 用于诵读

paused : Read only 是不是中止 A Boolean that returns true if the SpeechSynthesis object is in a paused state.

pending : Read only 是不是解决中 A Boolean that returns true if the utterance queue contains as-yet-unspoken utterances.

speaking : Read only 是不是诵读中 A Boolean that returns true if an utterance is currently in the process of being spoken even if SpeechSynthesis is in a paused state.

onvoiceschanged : 响声转变时开启

cancel() : 状况待诵读序列 Removes all utterances from the utterance queue.

getVoices() : 获得访问器适用的视频语音包目录 Returns a list of SpeechSynthesisVoice objects representing all the available voices on the current device.

pause() : 中止 Puts the SpeechSynthesis object into a paused state.

resume() : 再次刚开始 Puts the SpeechSynthesis object into a non-paused state: resumes it if it was already paused.

speak() : 读生成的视频语音,主要参数务必为SpeechSynthesisUtterance的案例 Adds an utterance to the utterance queue; it will be spoken when any other utterances queued before it have been spoken.

详尽api和表明可参照:

MDN - SpeechSynthesisUtterance

MDN - SpeechSynthesis

那末上面的两个方式能够写为:

var speaker = new window.SpeechSynthesisUtterance();

var speakTimer,

stopTimer;

// 刚开始诵读

function speakText(text) {

clearTimeout(speakTimer);

window.speechSynthesis.cancel();

speakTimer = setTimeout(function () {

speaker.text = text;

window.speechSynthesis.speak(speaker);

}, 200);

}

// 终止诵读

function stopSpeak() {

clearTimeout(stopTimer);

clearTimeout(speakTimer);

stopTimer = setTimeout(function () {

window.speechSynthesis.cancel();

}, 20);

}

由于视频语音生成原本是个多线程的实际操作,因而在全过程中开展以上解决。

当代访问器早已内嵌了这个作用,两个API插口适配性以下:

Feature

Chrome

Edge

Firefox (Gecko)

Inter Explorer

Opera

Safari

(WebKit) Basic

support 33

(Yes)

49 (49)

No support

?

7

假如要适配别的访问器或必须1种完善适配的处理计划方案,将会就必须服务端进行了,依据给定文字,回到相应视频语音便可,百度搜索视频语音 就出示这样的服务。


URL是页的详细地址,它从左到右由下述一部分构成:Inter資源种类/scheme:指出顾客程序流程用来实际操作的专用工具。如:描述服务器,ftp表明FTP服务器,gopher描述Gopher服务器,服务器详细地址/host:指出页所属的服务器、网站域名。端口号/port


谷歌SEO提升针对出口外贸网站来讲拥有十分关键的功效,出口外贸网站排名越好,网站得到的询盘也会越多。可是,一些谷歌提升师在提升网站的情况下,没法做到预期的实际效果,乃至一些网站提升后压根沒有实际效果,这是为何呢?


由于疫情危害,传统式的线下推广获客方法已已不考虑绝大多数公司的要求,因而愈来愈多的传统式出口外贸公司刚开始往单独站方位扩展,从触碰到接纳,再到落地,最后有着自身专属的获客方式。这一部分公司,早就把握住网上获客的快班车,而且在疫情期内,获得了非常好的考试成绩。


1般来讲,公司挑选租赁服务商出示的服务器,或将自身的服务器代管在技术专业服务商的主机房。这样的益处是公司能够节约很多的人力成本费和技术性成本费。


互联网技术发展趋势到今日,企工作企业基础都有着了自身的网站,并且建网站企业数量诸多,觉得建网站也沒有甚么技术性含量了,少则数百元就可以上线1个像模像样的官方网站。


繁杂的事儿简易做,简易的事儿反复做,反复的事儿认真做,这便是blog创作技能的精粹所属,不管是认真的写要求,還是精准定位好自身的总体目标,必须的全是大家踏踏实实的去生产制造內容,将1个许多人皆知的事儿方式、內容翻来翻去的去科学研究,仅有这样大家出示的每个要求才将会会是没法取代的,干掉同行业市场竞争对手,最后让大家过上悠哉的日


如今许多建网站,她们吹说,安心装包价,后边不容易再收费了,結果开展1半,拖拖拉拉顾客把钱圈;她们常吹,大家建的网站能够帮企业带来10万总流量,結果连个重要词提升都搞定不上……


绝大多数建网站企业应用的建网站系统软件来源于于互联网,而应用时假如沒有遵循客户批准协议书,未经批准除去手机软件开发设计者的落款,或将不容许用于商业服务网站的建网站系统软件(如DEDECMS、帝国CMS等)用于构建宣布网站,就会组成侵权!


许多网站都不懂为顾客设计方案网站,大多数数人总觉得客户是傻B,文本越多越好,內容越详尽越好,仿佛客户智商有难题1样(即使你把內容都弄出来,客户也不1定看)最终网站上线,会是这样亚子……


现阶段公司网站早已变成公司宣传策划和营销推广中不能或缺的1一部分。1个初创期公司假如沒有自身的官网,就丧失了1个关键的互联网技术对话框和引流方法方式,现阶段中国90%的公司网站全是根据建网站系统软件来构建,许多人对建网站系统软件其实不掌握,因此接下来就跟大伙儿科普1下有关有关它的普遍难题。

相关阅读